Discuss / Python / lambda

lambda

Topic source

def is_palindrome(n): return str(n) == str(n)[::-1]

作业不难.但是这个lambda函数真是要把我难为死了

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

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

可以拆解为:

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

再看下面的filter

filter(_not_divisible(n), it)

这里的_not_divisible(n),后面带括号,说明这个函数已经执行,这里是这个函数返回的值,也就是fn函数。 所以这句代码的意思是:filter 通过 fn 函数的条件过滤it的元素

主要是x的赋值问题.我搞不太懂lamabda或者fn(x)里面的x是什么时候赋的值.

filter函数特性,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

x就是it中的元素啊

filter的第一个参数不是应该是函数名吗? 例如 filter(_not_divisible,it) 为什么这里调用的时候是含有参数的? filter(_not_divisible(n),it). 上面一种调用 it中的元素会作为_not_divisible函数的参数传进去, 下面这种调用n是前面另外构造出来的而不是it中的元素,it中的元素传入函数内部定义的变量x中了,我就是弄不清楚函数外部的元素没有通过参数的方式是怎么传入到函数内部的变量中的.或者是filter另外的用法我还没学到?

我想我明白了.filter中第一个参数其实并不是_not_divisible函数.而是_not_divisiable(n)这个函数调用时返回的另一个闭包函数fn(x).所以这个过滤器真实面目应该是filter(fn,it).这样it中的元素就可以通过fn的参数传进去,而_not_divisiable(n)这种调用方式可以把n的变量值也传进去. 唉.套路深啊.

发现用filter(_not_divisiable(n),it),_not_divisiable函数调用时返回一个lambda函数.得到的结果是正确的 但是filter(lambda x:x%n>0,it)得到的结果却是错误的,结果和刚初始化的时候的it是一样的,2,3,5,7,9,11,13,15,17,19...为什么会这样..

前两天看闭包有点不求甚解.今天又重新刷了两遍,对照了下后面讲的闭包,研究了一下.有了点想法.如果有道友发现我的想法是错误的,请指正.

while True: n = next(it) yield n it = filter(lambda x:x%n>0,it)

问题出在yield上.生成器iterator属于延迟加载(不知道这样表述合适不合适)类型,返回结果的时候并没有计算出确切的数,而只是返回一个函数(或者对象??),只有在调用这个函数的时候才计算出最后的结果,而这个lambda构造的返回的函数中,有一个参数n是一直在接受next(it)的结果,是不断变化的,所以在最后计算的时候,n已经变成了所有迭代出的数里面最大的一个,小一些的数除以大一些的数取余数的时候,结果一定是等于自身的,一定大于0,所以,it中的所有元素都符合filter的过滤条件.所以n的结果就是最开始取到的那个it中的所有元素. 而通过filter(_not_disiviable(n),it)这种调用方式,当前的n和it中的当前元素,都作为函数的参数传入了另一个函数中,无论什么时候调用,当前函数的结果已经是确定的了.后面即使n和x再发生变化,得到的当前函数的结果也是不变的.这也是用闭包的正确用法,或者说用闭包时最应该注意到的问题.

发现用filter(_not_divisiable(n),it),_not_divisiable函数调用时返回一个lambda函数.得到的结果是正确的 但是filter(lambda x:x%n>0,it)得到的结果却是错误的,结果和刚初始化的时候的it是一样的,2,3,5,7,9,11,13,15,17,19...为什么会这样..

结果正确啊,全是素数啊,哪里错了.... 保持冷静别把自己绕晕了

filter(_not_divisible(n),it) 这个你可以把它看成是 filter(fn,it) 只是因为要传入参数n所以在fn函数外面套了一层_not_divisible函数

抱歉没看清楚就回答,这个问题我也不懂,可能就是你说的闭包问题吧,我再把闭包看一看去


  • 1

Reply