鱼C论坛

 找回密码
 立即注册
查看: 3340|回复: 1

[已解决]关于Python Filter求素数的疑惑

[复制链接]
发表于 2017-1-9 05:05:18 | 显示全部楼层 |阅读模式
19鱼币
先生成一个奇数序列:
  1. def _odd_iter():
  2.     n = 1
  3.     while True:
  4.         n = n + 2
  5.         yield n
复制代码

再定义一个筛选函数:
  1. def _not_divisible(n):
  2.     return lambda x: x % n > 0
复制代码

最后定义一个生成器,并不断返回下一个素数:
  1. def primes():
  2.     yield 2
  3.     it = _odd_iter() # 初始序列
  4.     while True:
  5.         n = next(it) # 返回序列的第一个数
  6.         yield n
  7.         it = filter(_not_divisible(n), it) # 构造新序列
复制代码

最后调用:
  1. for n in primes():
  2.     if n < 100:
  3.         print(n)
  4.     else:
  5.         break
复制代码

----------------------------------------------分割线----------------------------------------------------
这里我碰到了一个问题:当我试着在生成器中直接用
  1. lambda x: x % n > 0
复制代码

代替函数
  1. _not_divisible(n)
复制代码

输出结果变成了:
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 吗?为什么不能直接用呢?
新手求指教谢谢
最佳答案
2017-1-9 05:05:19
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 的具体值。 由于闭包是延后执行,保留引用的闭包对象在执行时得到的 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-9 05:05:19 | 显示全部楼层    本楼为最佳答案   
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论坛)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-22 02:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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