关于filter函数问题
本帖最后由 苏格兰圆脸胖鸡 于 2020-9-20 17:09 编辑def _odd_iter():
n = 1
while True:
n = n + 2
yield n
def _not_divisible(n):
return lambda x: x % n > 0
def primes():
yield 2
it = _odd_iter()
while True:
n = next(it)
yield n
it = filter(_not_divisible(n), it)
关于这个求素数的程序,里面的筛选函数:
def _not_divisible(n):
return lambda x: x % n > 0
里面的输入x,n都是谁提供的什么?实现了什么筛选功能呢?
求大佬告知~ 不了解 心驰神往 发表于 2020-9-21 08:20
不了解
在这硬蹭鱼币真的好吗 本帖最后由 挥舞乾坤 于 2020-9-21 09:41 编辑
如果对lambda表达式不是很了解的话,先把_not_divisible函数拆开来写:
def _not_divisible(n):
def fun(x):
return x % n > 0
return fun
这是一个闭包函数,他返回一个函数fun,列子里n的值是这里提供的n = next(it)。下面看filter函数,相当于:
filter(fun,it)
filter函数的第一个参数(后面称为参数1),是一个callable对象(可调用的对象,可以理解成一个函数),第2个参(参数2)数是一个iterable(可迭代对象),filter作用是将参数1指定的函数作用于参数2指定的iterable中的每个元素(或者说用参数2中的每个元素做为参数依次调用参数1指定的函数),用返回结果为真的元素,生成一个新的迭代器。列子里x就是由it中的每个元素提供的。这里说的有点绕,多看几遍,应该不难理解
primes是一个无限的素数生成器,整个代码的过程是这样的,先用_odd_iter生成一个以3开头的奇数无限序列it,然后从it中拿出第一个数(必是素数)yield出来,再用这个数过滤掉it中所有能被这个数整除的数(比如说第一个数是3的时候,过滤掉,6,9,12,15.......)生成一个新的序列,做为下一次filter的参数2,就是这么循环的
页:
[1]