# -*- coding: utf-8 -*- # filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。 # 构造一个奇数序列,排除了所有偶数,因为除了2之外的偶数都是非素数 def _odd_iter(): a = 1 while True: a = a + 2 yield a # 首次调用返回3 print('a=', a) def _not_disvisiable(b): return lambda x: x % b > 0 def primes(): yield 2 # 返回首个素数2 it = _odd_iter() # 初始化序列 while True: c = next(it) # 通过_odd_iter函数不停获取返回的值 # filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。 it = filter(lambda y, z=c: y % z > 0, it) # 构造新序列 # it = filter(_not_disvisiable(c), it) yield c """ 一直没搞清楚这里面的运行机制,后面利用单步调试后终于理清,首先从For循环进入到primes(), 获得首个返回值2,此时打印出n=2,随后继续For循环进入到it=_odd_iter(),_odd_iter为生成器。 随后进入while循环,首个c = next(it)未获取到值,进入到_odd_iter()函数,初始化a, 进入_odd_iter函数的while循环,返回a=3,y等于返回值3与it序列的参数进行取余验证是否整除,整除则移除 此时it序列无值,3不能被整除,next(it)为3,故而yield c,打印出n=3,进入For循环,进入到c = next(it) 进入_odd_iter函数,此时打印出a=3,进入到下一步while循环a=3+2,yield a
Python 埃氏筛法
最新推荐文章于 2025-01-19 18:13:17 发布