在学习廖雪峰大佬的python入门博客时,发现有人提出了关于lambda表达式的问题
下方代码是求1000以内的素数
当把it=filter(_not_divisible(n), it)改成 it=filter(lambda x: x%n>0, it)之后,计算的结果就会不符合预期
明显9不是素数,一开始也懵了,感觉很玄学,之后认真看了一下代码才发现,如果按原来的代码
it=filter(_not_divisible(n), it)它传入的参数是n,而明显,lambda表达式it=filter(lambda x: x%n>0, it)
的参数是x 。。这样能出预期效果才是的玄学。
于是修改了一番it=filter(lambda n: x%n>0, it),这样运行之后发现也报错,而且错得更厉害,因为虽然解决了
n(其实没有解决)但是x又变成了一个奇怪的东西,再面向百度编程一番之后,找到了解决方法------
it=filter(lambda x,n=n: x%n>0, it),此时,x和n都作为参数传入,同时n也需要从外部赋值才能获取到(此处涉及
python中变量作用域,引用https://www.zhihu.com/question/61789798,中的说法,是python在处理lambda函数的
时候,变量的作用域被限制在了lambda函数外面,n对lambda函数内不可见,所以需要手动的方式n=n来获取,并
作为参数传入lambda函数中)此时在运行程序,则成功使用lambda表达式替换了原来的函数:
PS:至于能否使用global(static)之类的全局变量来修饰n,进而直接在lambda函数中使用,因为水平有限,简
单的在n前面添加global试了几次都以报错告终,如果有哪位大佬知道应该如何使用还望不吝赐教,同时如果上文
有不对或不足也希望同学们指出,互相学习,共同进步