最近在回顾廖雪峰老师的python教程,在“高阶函数”这一节有一段利用filter函数和生成器求素数的代码,这里为了方便理解和调试进行了简化:
def func(n):
return lambda x: x % n > 0
def primes():
it = (i for i in np.arange(3, 20, 2))
while True:
n = next(it)
yield n
it = filter(func(n), it)
print(list(primes()))
运行结果:[3, 5, 7, 11, 13, 17, 19]
代码看上去很简单:func()的功能是返回一个匿名函数,作用是判断输入值是否大于n;prime()是一个返回素数的生成器,实现过程是先定义一个不含偶数的生成器,然后每返回一个素数,就利用filter排除生成器中可以被这个素数整除的元素。看到这里的时候我在想,为什么要单独定义一个func()呢,反正返回的也是一个lambda,干脆把func()里的内容放进filter,写python当然是追求代码越简洁越好咯。然而,噩梦开始了: