Discuss / Python / 这个不太懂,能讲解一下这个函数吗??

这个不太懂,能讲解一下这个函数吗??

Topic source

def _not_divisible(n): return lambda x: x % n > 0

这个是怎么执行的??

返回匿名函数,其中n由传入参数确定

lambda x是如何传入的?

_not_divisible 返回的是一个匿名函数,filter调用返回的函数传入参数。

alonely仔

#5 Created at ... [Delete] [Delete and Lock User]

同问,匿名函数里的n是_not_divisible的传入参数吗?那x呢?他的值怎么确定?

同问。。例如第一次循环n是5,穿进去之后x是怎么定义?x/5余数大于零(不能整除),那x是自然数的遍历么。。?

廖雪峰

#7 Created at ... [Delete] [Delete and Lock User]

调用 _not_divisible(5)时,返回的是另一个函数:

def fn(x):
    return x % 5 > 0

这个函数正好适用于循环中n=5时:

while True:
    n = next(it) # 返回序列的第一个数
    yield n
    # 假设n = 5
    fn = _not_divisible(n)
    it = filter(fn, it)

每次循环都创建了新的fn函数

回一楼,这个匿名函数看不懂的话换一种方式(花了我好几天才勉强搞懂)。 it=filter(lambda x,n=n:x%n!=0,it) 传入的是匿名函数而不是计算结果!! 话说廖大哥在这一章使用了后面没提及的匿名函数知识,确实是叫人一下子摸不着头脑。。。建议廖老师在章节编排上把匿名函数往前挪。

_江滨柳_

#9 Created at ... [Delete] [Delete and Lock User]

问一下楼上,这个it序列是一开始就计算出来了吗? 比如说n=3的时候,filter那条语句里,传入的it是什么样的序列呢??

while True:
    n = next(it) # 返回序列的第一个数
    yield n
    it = filter(_not_divisible(n), it) # 构造新序列

每循环一次,filter就多做一次由*_not_divisible(n)(该函数每次的参数n都不同)返回来的lambda函数所决定的筛选

由于生成器和filter都是惰性序列,它是每要一个数时生产一个,生成数所需要的是生成的规则,生成素数的规则就是当前要生成的数的充要条件是不能它被之前的素数整除。

之前的每一个lambda函数所代表的筛选都会记忆下来,等到新的素数要生成是用它们去判断


  • 1

Reply