关于这个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    以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()结果的时候,才会真正筛选 并每次返回下一个筛选出的元素
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM