鱼C论坛

 找回密码
 立即注册
查看: 2356|回复: 7

关于生成器

[复制链接]
发表于 2017-11-15 21:50:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 gcaxuxi 于 2017-11-15 21:52 编辑

廖雪峰大大《生成器》一章的链接:https://www.liaoxuefeng.com/wiki ... abc8424e12b5fb27000

其中,关于求素数,有:
def _odd_iter():
    n = 1
    while 1:
        n += 2
        yield n

def _not_divisible(n):
    return lambda x: x % n

def primes():
    yield 2
    it = _odd_iter()      
    while 1:
        print('1* '*9)
        n = next(it)
        yield n
        it = filter(_not_divisible(n),it)

      
for i in primes():
    if i < 16:
        print(i)
    else:
        break


我想把上述primes()函数中:
it = filter(_not_divisible(n),it)
改为
it = filter(lambda x: x % n ,it)
直接使用lambda,而避免定义_not_divisible()
可是结果只是一组奇数,百思不得其解。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-11-15 22:54:24 | 显示全部楼层
_not_divisible(n) 返回的是个闭包
直接用lambda就不是闭包了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-16 08:51:13 | 显示全部楼层
SixPy 发表于 2017-11-15 22:54
_not_divisible(n) 返回的是个闭包
直接用lambda就不是闭包了

谢谢您的回复。

_not_divisible(n)是个闭包,返回一个函数,和我直接使用这个函数作为filter的参数。逻辑上我感觉应该一样啊。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-16 09:18:12 | 显示全部楼层
gcaxuxi 发表于 2017-11-16 08:51
谢谢您的回复。

_not_divisible(n)是个闭包,返回一个函数,和我直接使用这个函数作为filter的参数。 ...

不一样,闭包是个独立的对象
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-16 09:42:37 | 显示全部楼层
SixPy 发表于 2017-11-16 09:18
不一样,闭包是个独立的对象

明白您的意思。

我测试是这样的:

r = list(filter(_not_divisible(3),[3,5,6,7,8,9]))
t = list(filter(lambda x: x % 3 ,[3,5,6,7,8,9]))

r和t打印后显示一致:[5, 7, 8]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-16 10:02:59 | 显示全部楼层
gcaxuxi 发表于 2017-11-16 09:42
明白您的意思。

我测试是这样的:
  1. def _not_divisible(n):
  2.     return lambda x: x % n

  3. ls=[]
  4. for n in [2,3]:
  5.     r = filter(_not_divisible(n),[3,5,6,7,8,9])
  6.     t = filter(lambda x: x % n ,[3,5,6,7,8,9])
  7.     ls.extend([r,t])
  8.    
  9. print([list(x)for x in ls])
复制代码


n是变动的,结果就不一样了

[[3, 5, 7, 9], [5, 7, 8], [5, 7, 8], [5, 7, 8]]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-16 11:14:20 | 显示全部楼层
SixPy 发表于 2017-11-16 10:02
n是变动的,结果就不一样了

[[3, 5, 7, 9], [5, 7, 8], [5, 7, 8], [5, 7, 8]]


万分感谢版主大大!

首先,肯定是对于filter_t来说,只执行了n =3的filter。

其次,原因是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

解决办法:再创建一个函数包裹这个变量

版主大大,对吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-16 11:47:48 | 显示全部楼层
gcaxuxi 发表于 2017-11-16 11:14
万分感谢版主大大!

首先,肯定是对于filter_t来说,只执行了n =3的filter。


t = filter(lambda x,n=n: x % n ,[3,5,6,7,8,9])

把n作为默认值传入也可以。这样,n的值就提前绑定了,而不是计算时才绑定
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-25 22:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表