苏格兰圆脸胖鸡 发表于 2020-9-20 17:03:36

关于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:33

不了解

苏格兰圆脸胖鸡 发表于 2020-9-21 08:45:46

心驰神往 发表于 2020-9-21 08:20
不了解

在这硬蹭鱼币真的好吗

挥舞乾坤 发表于 2020-9-21 09:28:13

本帖最后由 挥舞乾坤 于 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]
查看完整版本: 关于filter函数问题