|
19鱼币
先生成一个奇数序列:
- def _odd_iter():
- n = 1
- while True:
- n = n + 2
- yield n
复制代码
再定义一个筛选函数:
- def _not_divisible(n):
- return lambda x: x % n > 0
复制代码
最后定义一个生成器,并不断返回下一个素数:
- def primes():
- yield 2
- it = _odd_iter() # 初始序列
- while True:
- n = next(it) # 返回序列的第一个数
- yield n
- it = filter(_not_divisible(n), it) # 构造新序列
复制代码
最后调用:
- for n in primes():
- if n < 100:
- print(n)
- else:
- break
复制代码
----------------------------------------------分割线----------------------------------------------------
这里我碰到了一个问题:当我试着在生成器中直接用
代替函数
输出结果变成了:
2,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99,
请问这事什么原因呢? _not_divisible(n)函数最终返回的不就是 lambda x : x % n > 0 吗?为什么不能直接用呢?
新手求指教谢谢
it = _odd_iter() # it是个 无限序列
it = filter(_not_divisible(n), it) # 把 所有已生成的质数都用于序列过滤
it = filter(lambda x: x % n > 0, it) # 只把 最新生成的1个质数都用于序列过滤
------------------
注意 变量n 的 定义域
python最小的定义域范围是 函数。
同一个定义域内的闭包只保存 变量n 的 引用
闭包在其它定义域生成时,才会保留 n 的具体值。
由于闭包是延后执行,保留引用的闭包对象在执行时得到的是n的最后值,而不是生成闭包时的具体值。
参考:
关于返回函数,新手纠结到凌晨2点的疑问,跪求权威解惑!!!
http://bbs.fishc.com/thread-81246-1-1.html
(出处: 鱼C论坛)
|
最佳答案
查看完整内容
it = _odd_iter() # it是个无限序列
it = filter(_not_divisible(n), it) # 把所有已生成的质数都用于序列过滤
it = filter(lambda x: x % n > 0, it) # 只把最新生成的1个质数都用于序列过滤
------------------
注意 变量n 的定义域
python最小的定义域范围是 函数。
同一个定义域内的闭包只保存 变量n 的引用
闭包在其它定义域生成时,才会保留 n 的具体值。
由于闭包是延后执行,保留引用的闭包对象在执行时得到的 ...
|