请问这个地方如何理解呢?

2017-04-17 22:03:51 +08:00
 Pzdmultiverse

我的理解是,'squares'是一个序列,squares.append(lambda: x**2 ) 这句中的 lambda:x**2返回的是一个值,那么squares.append(lambda:x**2)应该就是一个序列呀,那为什么返回还能squares[2]()这样的函数呢?还有为什么说 for 循环内循环到 4 以后再带入计算呢?

请大神点拨,谢谢!!

1927 次点击
所在节点    Python
8 条回复
tttty
2017-04-17 22:13:10 +08:00
Lambda 叫匿名函数,这个表达式代表的是一个函数,只有你调用以后才会返回一个值。所以 squares 里面的元素是函数。因为是函数,所以要加上()调用来获取结果。至于为什么结果都是一样的,因为函数只有在调用的时候才会去获取 x 的值,这是个闭包的概念。
Pzdmultiverse
2017-04-17 22:22:23 +08:00
@tttty 意思是```lambda:x**2```返回的是一个函数吗?
Pzdmultiverse
2017-04-17 22:24:34 +08:00
@tttty ```lambda:x**2```

```
def f(x):
rerurn(x*2)
```
这两个不是等价的吗
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
>>>
zsz
2017-04-17 22:35:02 +08:00
这个函数只有这里被传递了,不必须要函数名,用 lambda 表达式简单直接,还用了闭包引用了 x 的值


加我们的群问效率更高,这个群是一群工程师组建的面向初学者的
Python Linux 学习群, qq 群号: 278529278 ,
Php Linux 学习群, qq 群号: 476648701 ,
非商业性质,拒绝广告,只接收真正想学这方面技术的朋友,交流学习,申请请说明来自 v2ex
mianju
2017-04-17 22:38:17 +08:00
1 楼其实说的挺清楚了。 你可以这样理解, squares 存放的是函数,用 C 语言的理解方式,存放的就是指向匿名函数的指针,所以并没有存放的是函数运行所返回的值。在调用 squares[0]()时,不过是去调用 lambda 函数,而调用 lambda 函数的时候,函数会去寻找参数,也就是 x ,因为在 for 循环运行结束, x 的值其实还存在,这个值是 4 ,所以 lambda 函数的输入参数是 4 ,所以结果才都是一样的。
tttty
2017-04-17 23:05:05 +08:00
@Pzdmultiverse 不等价 lambda x:x**2 和你写那个等价。 这里 x 不是作为形参传进去的,而是读取的是全局域里的 x 。当匿名函数被调用的时候才去读取 x ,此时 x 已经是迭代器的最后一个值了。
Pzdmultiverse
2017-04-18 15:23:11 +08:00
@tttty 谢谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/355491

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX