Discuss / Python / 试着解释一下

试着解释一下

Topic source

试着帮人解释,错了也可以进步:

def is_odd(n): return lambda n:n%2==1

L = list(filter(is_odd, range(1, 20)))

输出是错误的 谁能说一下吗?

首先,由于def is_odd(n): return lambda n:n%2==1 是同一个参数n,而返回的是一个函数。 那么filter函数中,必然把range(1,20)传入is_odd(n)中n,得到(lambda(),。。。)20个lamba()函数的地址,或者称为指针,句柄都对

然后根据filter特性,地址都是非0(真)的输出,(而地址基本不可能为0(除非你是系统最底层))所以,对应的映射全部为真,所以全部输出所有原列表。

怎么改? 那么去掉def is_odd(n):中n,改为def is_odd():,那么是直接返回函数,效果跟前面一样,也是不行的。(运行直接错误,因为filter需要函数有一个参数,代表可以输入值) 其实只要语句改为L = list(filter(is_odd(0), range(1, 20))),其中0可以为任意的数字,就可以完美执行了。 filter执行的时候,is_odd(0)中是不能接受参数的,因为位置被0占了,所以是一个函数名(指针,句柄,地址都可以),这个函数名指向函数lambda n:n%2==1,它有一个参数n,所以filter就用lambda n:n%2==1接受列表并运算。 *提醒:filter其实都是用函数名(指针,地址,句柄)来找函数体的

首先,两个n是完全没有关系的,他们不会传值,这是错误的原因之一。你误解了lambda表达式。 其次,去掉去掉def is_odd(n):中n

def is_odd(): return lambda n:n%2==1 L = list(filter(is_odd(), range(1, 20))) is_odd()返回的是lambda n:n%2==1,range的值会传给lambda的n,这样就成功了


  • 1

Reply