首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成器表达式与先构造列表然后使用列表转换生成器的行为不同

生成器表达式与先构造列表然后使用列表转换生成器的行为不同
EN

Stack Overflow用户
提问于 2018-11-15 03:43:31
回答 1查看 17关注 0票数 0

这两段代码可以为下游应用程序生成不同的行为吗?换句话说,返回的对象有什么不同吗?

代码语言:javascript
运行
复制
 return (func(i) for i in a_list) 

代码语言:javascript
运行
复制
 b_list=[] 
 for i in a_list:
     b_list.append(func(i))
 return (i for i in b_list)

PS:构建生成器的第二种方法是非常值得怀疑的。

EN

回答 1

Stack Overflow用户

发布于 2018-11-15 06:56:58

首先,这段代码:

代码语言:javascript
运行
复制
b_list=[] 
for i in a_list:
    b_list.append(func(i))
return (i for i in b_list)

与下面的代码完全相同:

代码语言:javascript
运行
复制
return iter([func(i) for i in a_list])

这些和这个的区别是:

代码语言:javascript
运行
复制
return (func(i) for i in a_list)

后者是,另外两个是-也就是说,后者每次调用__next__()方法时都会运行func,而另外两个会立即对a_list中的每一项运行func

因此,答案取决于func是否是pure function -在本例中,它的行为是否与运行时相同,并且独立于外部/全局变量。

它还取决于列表的项是否可变,以及它们或列表本身是否被其他代码更改。

如果答案分别为"yes“和"no",则除了内存占用之外,它们都是相同的。

最后,既然我们正在讨论函数概念,请考虑使用:

代码语言:javascript
运行
复制
return map(func, a_list)

而不是:

代码语言:javascript
运行
复制
return (func(i) for i in a_list)

但前提是您使用的是Python3可爱的懒惰map(),而不是Python2的、邪恶的和热切的map()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53307695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档