这两段代码可以为下游应用程序生成不同的行为吗?换句话说,返回的对象有什么不同吗?
return (func(i) for i in a_list)
和
b_list=[]
for i in a_list:
b_list.append(func(i))
return (i for i in b_list)
PS:构建生成器的第二种方法是非常值得怀疑的。
发布于 2018-11-15 06:56:58
首先,这段代码:
b_list=[]
for i in a_list:
b_list.append(func(i))
return (i for i in b_list)
与下面的代码完全相同:
return iter([func(i) for i in a_list])
这些和这个的区别是:
return (func(i) for i in a_list)
后者是,另外两个是-也就是说,后者每次调用__next__()
方法时都会运行func
,而另外两个会立即对a_list
中的每一项运行func
。
因此,答案取决于func
是否是pure function -在本例中,它的行为是否与运行时相同,并且独立于外部/全局变量。
它还取决于列表的项是否可变,以及它们或列表本身是否被其他代码更改。
如果答案分别为"yes“和"no",则除了内存占用之外,它们都是相同的。
最后,既然我们正在讨论函数概念,请考虑使用:
return map(func, a_list)
而不是:
return (func(i) for i in a_list)
但前提是您使用的是Python3可爱的懒惰map()
,而不是Python2的、邪恶的和热切的map()
。
https://stackoverflow.com/questions/53307695
复制相似问题