V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Pzdmultiverse
V2EX  ›  Python

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

  •  
  •   Pzdmultiverse · 2017-04-17 22:03:51 +08:00 · 1998 次点击
    这是一个创建于 2775 天前的主题,其中的信息可能已经有所发展或是发生改变。

    python

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

    请大神点拨,谢谢!!

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

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


    加我们的群问效率更高,这个群是一群工程师组建的面向初学者的
    Python Linux 学习群, qq 群号: 278529278 ,
    Php Linux 学习群, qq 群号: 476648701 ,
    非商业性质,拒绝广告,只接收真正想学这方面技术的朋友,交流学习,申请请说明来自 v2ex
    mianju
        6
    mianju  
       2017-04-17 22:38:17 +08:00
    1 楼其实说的挺清楚了。 你可以这样理解, squares 存放的是函数,用 C 语言的理解方式,存放的就是指向匿名函数的指针,所以并没有存放的是函数运行所返回的值。在调用 squares[0]()时,不过是去调用 lambda 函数,而调用 lambda 函数的时候,函数会去寻找参数,也就是 x ,因为在 for 循环运行结束, x 的值其实还存在,这个值是 4 ,所以 lambda 函数的输入参数是 4 ,所以结果才都是一样的。
    tttty
        7
    tttty  
       2017-04-17 23:05:05 +08:00
    @Pzdmultiverse 不等价 lambda x:x**2 和你写那个等价。 这里 x 不是作为形参传进去的,而是读取的是全局域里的 x 。当匿名函数被调用的时候才去读取 x ,此时 x 已经是迭代器的最后一个值了。
    Pzdmultiverse
        8
    Pzdmultiverse  
    OP
       2017-04-18 15:23:11 +08:00
    @tttty 谢谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5312 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:04 · PVG 16:04 · LAX 00:04 · JFK 03:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.