For loops in Python
有人能给我解释一下这句话吗
1
| set(o for o in self.intersect if self.past_dict[o] != self.current_dict[o]) |
从两个python字典中包含的键的计算差异
我对python是个新手,从来没有见过类似于"o for o"的编程语言,也找不到任何参考来理解这意味着什么。
谢谢。
- @我个人认为,他甚至不知道这是不是一个发电机,他可能没有抓住关系。所以我认为这不是一个完整的复制品。
- @Nagarajtantri在我看来将其作为副本关闭是合理的。问这个问题的人可以阅读链接的答案来理解他们找到的代码,并且这个问题是如此的具体到特定的代码行,以至于它不会为作为一个单独的问题存在的站点增加价值。
- 有人能解释为什么用生成器表达式调用set时不需要双括号吗?我假设生成器理解需要一对,而set需要另一对。
- @christophterasa集合创建者接受一个迭代器,如果可以从该表达式创建该迭代器,则使用传递的参数存储和计算有效的迭代器。因此,它可以双向工作:set(o for o in x...)和set((o for o in x..))。
相当于:
1 2 3 4 5 6
| a = []
for o in self.intersect:
if self.pass_dict[o] != self.current_dict[0]:
a.append(o)
new_value = set(a) |
使用生成器:o for o in self.intersect ...表示,循环通过每个元素,并在for循环内应用条件,即if self.pass_dict[o] != self.current_dict[0]并将每个元素返回到一个集合。
重点是,您应该了解什么是python中的列表理解和生成器,还应该浏览类似生成器表达式和列表理解的链接。
正如@alex updated,它会给您一个更新:变量a基本上是在内存中创建的,并返回到set函数。
- 回答得好。同样值得注意的是,在这种情况下,中间数组a将首先在内存中创建,而生成器理解则被延迟地评估,从而节省内存(因此它们在功能上是等效的,但并不完全相同)。
- @Alexbow是的,没错,很好。我正集中精力向他解释他能找到的那种表达方式:)