龙王九太子 发表于 2020-7-26 00:05:42

python生成器求助

请问一下大家,以下两句话有什么去区别?带等号与不带等号的区别在哪里?谢谢大家!

第一句:sum(i for i in range(100) if i % 2)

第二句:sum = (i for i in range(100) if i % 2)

Twilight6 发表于 2020-7-26 08:08:08



第一句:sum(i for i in range(100) if i % 2)

Python 有 sum 这么一个内置函数,用于计算容器内元素总和,返回最终和的结果

所以你这第一个代码是用 sum 函数来计算(i for i in range(100) if i % 2)这个生成器所能生成的数的总和

第二句:sum = (i for i in range(100) if i % 2)

而你第二个是变量的赋值操作,变量名为 sum ,这个只是将 (i for i in range(100) if i % 2) 生成器赋值给 sum

实际上就是给这个生成器 (i for i in range(100) if i % 2) 取了个外号叫 sum,而不会像第一个代码那样求和


Twilight6 发表于 2020-7-26 08:13:53


这也提醒,不要用 Python 内置函数作为变量名,否则原有的函数功能将会被覆盖

看两种运行情况的代码吧:

>>> x = (i for i in range(100) if i % 2)
>>> print(x)
<generator object <genexpr> at 0x000002625A7EBE40>

>>> print(sum(i for i in range(100) if i % 2))
2500

x 还是一个生成器,此时你可以继续通过 next() 函数来取出值

而 使用 sum 函数后直接算出生成器中所有数的总和了

zltzlt 发表于 2020-7-26 08:51:54

第一句 sum(i for i in range(100) if i % 2) 是调用 sum() BIF,对生成器中所有元素求和。

第二句 sum = (i for i in range(100) if i % 2) 是将变量 sum 赋值给一个生成器,此时的 sum 原有功能(求和)就会丧失,变为一个生成器

龙王九太子 发表于 2020-7-26 20:42:09

谢谢,你说的很清楚,明白了!再次谢谢你!
页: [1]
查看完整版本: python生成器求助