代码来源:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431821084171d2e0f22e7cc24305ae03aa0214d0ef29000
#filter()函数的作用:filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素
#filter()
函数返回的是一个Iterator
,也就是一个惰性序列,所以要强迫filter()
完成计算结果,需要用list()
函数获得所有结果并返回list。
def _odd_iter():
#构造从3开始的奇数序列
n=1
while True:
n+=2
yield n #这是生成器,并且是无限序列
#定义一个筛选函数
def _not_divisible(n):
return lambda x:x%n>0 #n为惰性序列旧产生的素数,x为惰性序列新产生的奇数
#定义一个生成器,不断返回下一个素数
#这个生成器会返回第一个素数2,then,利用filter()不断产生筛选后的新序列(保证这个奇数是素数)
def primes():
yield 2
it=_odd_iter() #初始序列
while True:
n=next(it)
yield n
it=filter(_not_divisible(n),it) #构造新序列 重点
#打印100以内的素数
for n in primes():
if n<100:
print(n)
else:
break
注意点:
1.每次yield之后都会产生新的it(generator,惰性序列,)
2.程序最大的问题可能在我标‘重点’那儿
2.1 以n=11来举例说明 @
2.2 当n=11时,进入_not_divisible(n)
2.3 执行 lambda x:x%n>0 (2.4 2.5 2.6 2.7 为关于filter()函数的运行过程)
2.4 没有x,接下来就通过it(_odd_iter())产生新的奇数(不确定到底是不是素数)
2.5 而后通过n=next(it)产生旧的素数n #(跟'@行'的n不一样)
2.6 并通过lambda x:x%n>0来判断产生的奇数是不是素数
2.7 会利用n=next(it)不断地返回it中旧的素数,然后利用filter()中传入的函数依次作用于旧的素数
2.8 将过滤好的素数赋给it
2.9 然后利用n=next(it)
2.10 通过yield n输出新产生的素数
3.在_not_divisiable(n)中 n为惰性序列旧产生的素数,x为惰性序列新产生的奇数
4.filter()
使用了惰性计算,所以只有在取filter()
结果的时候,才会真正筛选 并每次返回下一个筛选出的元素