Discuss / Python / 请教大家一个问题

请教大家一个问题

Topic source

NPProb

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

原文中定义了一个这样的函数:

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) # 构造新序列

我看到这里的时候就想,为什么不能把lambda函数直接写在filter的里面,然后试了一下,果然是不行的,结果是会打出所有奇数来。

我想问一下大家,为什么这里要定义一个返回lambda函数的函数使用,而将lambda函数本身直接放在filter里面又发生了什么?

小杀Aki

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

这个你可以通过自己写程序体验一下,因为filter生成的是惰性数列,也就是说它其实只是将一个规则存储下来,并不是立即计算出结果存储的。当filter后使用lambda函数,lambda x:x%n>0,n的值在每次循环中都会被迭代成新的,这时候filter只会存储最后的n值……比如你让最后的n等于999,那所有在之前的_odd_iter里生成的数除以999的余数当然都是大于0的……那最后你就是打印出了所有的奇数……这个也是我自己写了个程序发现的,你可以自定义一个list然后给n赋予不同的值,手动执行两次循环,就会明白了

直接把lambda表达式放进去,第二次是

it = filter(lambda x: x % n, filter(lambda x: x % n, 第一次的it)) ,n=5,此时应该是it = filter(lambda x: x % 5, filter(lambda x: x % 5, 第一次的it)) 

使用柯里化的方式,第二次是

it = filter(lambda x: x % 5, filter(lambda x: x % 3, 第一次的it))

这应该是这两个的区别。


  • 1

Reply