我的理解是,'squares'是一个序列,squares.append(lambda: x**2 )
这句中的 lambda:x**2
返回的是一个值,那么squares.append(lambda:x**2)
应该就是一个序列呀,那为什么返回还能squares[2]()
这样的函数呢?还有为什么说 for 循环内循环到 4 以后再带入计算呢?
请大神点拨,谢谢!!
1
tttty 2017-04-17 22:13:10 +08:00 via Android
Lambda 叫匿名函数,这个表达式代表的是一个函数,只有你调用以后才会返回一个值。所以 squares 里面的元素是函数。因为是函数,所以要加上()调用来获取结果。至于为什么结果都是一样的,因为函数只有在调用的时候才会去获取 x 的值,这是个闭包的概念。
|
2
Pzdmultiverse OP @tttty 意思是```lambda:x**2```返回的是一个函数吗?
|
3
Pzdmultiverse OP |
4
mdzz 2017-04-17 22:31:11 +08:00
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> squares = [] >>> for x in range(5): ... squares.append(lambda: x**2) ... >>> x 4 >>> squares[2]() 16 >>> squares = [] >>> for x in range(5): ... squares.append(lambda x=x: x**2) ... >>> x 4 >>> squares[2]() 4 >>> |
5
zsz 2017-04-17 22:35:02 +08:00 via iPhone
这个函数只有这里被传递了,不必须要函数名,用 lambda 表达式简单直接,还用了闭包引用了 x 的值
加我们的群问效率更高,这个群是一群工程师组建的面向初学者的 Python Linux 学习群, qq 群号: 278529278 , Php Linux 学习群, qq 群号: 476648701 , 非商业性质,拒绝广告,只接收真正想学这方面技术的朋友,交流学习,申请请说明来自 v2ex |
6
mianju 2017-04-17 22:38:17 +08:00
1 楼其实说的挺清楚了。 你可以这样理解, squares 存放的是函数,用 C 语言的理解方式,存放的就是指向匿名函数的指针,所以并没有存放的是函数运行所返回的值。在调用 squares[0]()时,不过是去调用 lambda 函数,而调用 lambda 函数的时候,函数会去寻找参数,也就是 x ,因为在 for 循环运行结束, x 的值其实还存在,这个值是 4 ,所以 lambda 函数的输入参数是 4 ,所以结果才都是一样的。
|
7
tttty 2017-04-17 23:05:05 +08:00
@Pzdmultiverse 不等价 lambda x:x**2 和你写那个等价。 这里 x 不是作为形参传进去的,而是读取的是全局域里的 x 。当匿名函数被调用的时候才去读取 x ,此时 x 已经是迭代器的最后一个值了。
|
8
Pzdmultiverse OP @tttty 谢谢!
|