关于这个filter函数的解析

代码来源: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

  3.在_not_divisiable(n)中 n为惰性序列旧产生的素数,x为惰性序列新产生的奇数
  4.
filter()使用了惰性计算,所以只有在取filter()结果的时候,才会真正筛选 并每次返回下一个筛选出的元素
 

猜你喜欢

转载自www.cnblogs.com/mj2602594534/p/9998254.html