鱼C论坛

 找回密码
 立即注册
查看: 71|回复: 3

[已解决]关于filter函数问题

[复制链接]
最佳答案
0 
发表于 2020-9-20 17:03:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 苏格兰圆脸胖鸡 于 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 09:28:13
本帖最后由 挥舞乾坤 于 2020-9-21 09:41 编辑

如果对lambda表达式不是很了解的话,先把_not_divisible函数拆开来写:
  1. def _not_divisible(n):
  2.     def fun(x):
  3.         return x % n > 0
  4.     return fun
复制代码

这是一个闭包函数,他返回一个函数fun,列子里n的值是这里提供的n = next(it)。下面看filter函数,相当于:
  1. 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,就是这么循环的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1 
发表于 2020-9-21 08:20:33 | 显示全部楼层

回帖奖励 +2 鱼币

不了解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
 楼主| 发表于 2020-9-21 08:45:46 | 显示全部楼层

在这硬蹭鱼币真的好吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
22 
发表于 2020-9-21 09:28:13 | 显示全部楼层    本楼为最佳答案   
本帖最后由 挥舞乾坤 于 2020-9-21 09:41 编辑

如果对lambda表达式不是很了解的话,先把_not_divisible函数拆开来写:
  1. def _not_divisible(n):
  2.     def fun(x):
  3.         return x % n > 0
  4.     return fun
复制代码

这是一个闭包函数,他返回一个函数fun,列子里n的值是这里提供的n = next(it)。下面看filter函数,相当于:
  1. 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,就是这么循环的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2020-10-26 15:06

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表