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

59次阅读
没有评论

共计 988 个字符,预计需要花费 3 分钟才能阅读完成。

背景

最近决定重新审视一下 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 有了下面这一番测试:

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

从上图中我们可以清楚的看到第五个和第六个输出中的 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 到新姿势的你是不是要点个赞再走呀~

正文完
 
sharp097
版权声明:本站原创文章,由 sharp097 2020-06-29发表,共计988字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)