又发现了一个和python生成器一样只能使用一次的对象

2020年06月29日 1405点热度 16人点赞 0条评论

背景

最近决定重新审视一下python量化交易。其实几年前就接触过py量化交易,但当时囿于一些策略过于晦涩难懂始终没有深入进去,而今不同了,在淘宝上花两三百买了一套AQF量化金融视频教程,除了python基础部分跳过了,其他均是从头看起, 此次进军自觉收获颇丰。

过程

前天在看到金融数据处理中同时获取多只股价信息的下面一段代码时:

# 编写函数同时获得多只股票的数据
def multiple_stocks(tickers):
    def data(ticker):
        stocks = ts.get_k_data(ticker,start = '2016-01-01', end = '2017-07-01')    #定义了stocks这个daraFrame;
        stocks.set_index('date',inplace = True)
        stocks.index = pd.to_datetime(stocks.index)      #要把日期时间parse成python支持的datetime格式,不然很多python层面的操作无法完成;
        return  stocks             #返回的是进行完处理的stcoks这个DataFrame;
        
    datas = map(data, tickers)
    
    return pd.concat(datas, keys=tickers, names=['Ticker', 'Date'])    #multiple_stocks函数返回的是拼接后的大DataFrame

 

对这里面map高阶函数的使用有点困惑,毕竟这几年写python脚本的过程中用的也不多。

于是我就打开了ipython有了下面这一番测试:

从上图中我们可以清楚的看到第五个和第六个输出中的print语句返回的都是一个空列表,这就让我顿时百思不得其解了。

就在这时我想起来了python的生成器对象,于是我就在猜想map对象会不会和它一样是个只能使用一次的对象,

光说不练假把式,然后我就又进行了下面的测试:

In [31]: m=map(data,range(3))

In [32]: l=list(m)

In [33]: for i in l:
    ...:     print(i)
    ...:
0
2
4

In [34]: print([i for i in l])
[0, 2, 4]

 

果然,把map对象转成列表复制给变量存储起来后,在循环了一次之后再次进行列表推导也仍然能正常输出。

废话了这么多,还看到这里并get到新姿势的你是不是要点个赞再走呀~

Sharp

"A Linux user and a Python{}".format('er')

文章评论