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
saximi
V2EX  ›  Python

请问这个例子中的 lambda 表达式是怎么起作用的?

  •  
  •   saximi · 2017-07-25 21:29:17 +08:00 · 2332 次点击
    这是一个创建于 2677 天前的主题,其中的信息可能已经有所发展或是发生改变。
    考虑下面的股票名和价格映射字典:
    prices = {
    'ACME': 45.23,
    'AAPL': 612.78,
    'IBM': 205.55,
    'HPQ': 37.20,
    'FB': 10.75
    }

    可以在 min() 和 max() 函数中提供 key 函数参数来获取最小值或最大值对应的键的信息。比如:
    min(prices, key=lambda k: prices[k]) # Returns 'FB'
    max(prices, key=lambda k: prices[k]) # Returns 'AAPL'

    请问上面例子中的 lambda 是如何起作用的?比如 min 函数中,往 lambda 传入一个 k 变量?这个 k 是怎么来的呢?以及为何 prices[k]可以作为 key 呢?
    感谢!
    7 条回复    2017-07-26 04:09:12 +08:00
    flaneurse
        1
    flaneurse  
       2017-07-25 21:40:45 +08:00
    匿名函数,涉及到函数式编程,Python 的 lambda 就是个半残废,不会 fp 没必要用
    ---
    k 就是个变量,就像列表解析里的变量一样,暂时的。
    ---
    写成你看得懂得就是这样
    '''
    prices = {...}
    def function(k):
    return prices[k]
    '''
    ---
    min(), max(), sorted(), 都可以接收一个 key=func 参数,自己看文档去
    misaka19000
        2
    misaka19000  
       2017-07-25 21:46:38 +08:00
    k 代表了 prices 里面的每一个元素,相当于:

    for key in prices.keys():
    print key

    这里的 key,prices[k]就很好理解了,就是这个 key 对应的 value,相当于把所有的 value 遍历一遍,找出最小(最大)的值
    weyou
        3
    weyou  
       2017-07-25 21:46:51 +08:00 via Android
    为神马不看文档呢。k 是 min/max 调用 key 回调函数是传入的参数,这个参数就是前面的 iterable 参数的每个值。dict 是 iterable 的并且每个值等于其 key。
    misaka19000
        4
    misaka19000  
       2017-07-25 21:47:20 +08:00
    @flaneurse #1 明明 py 的 lambda 很好用的。。。
    saximi
        5
    saximi  
    OP
       2017-07-25 22:36:55 +08:00
    谢谢大家指点,我想明白了,prices 作为一个字典,根据值进行排序后,MIN 或 MAX 方法返回的是字典的键而不是值
    klesh
        6
    klesh  
       2017-07-25 22:59:39 +08:00 via Android
    @flaneurse 为何说它是半残?
    wwqgtxx
        7
    wwqgtxx  
       2017-07-26 04:09:12 +08:00 via iPhone
    @klesh 他说的应该是 py 的 lamdba 表达式不支持跨行吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2771 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:50 · PVG 21:50 · LAX 05:50 · JFK 08:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.