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

lambda 表达式使用案例

  •  
  •   bravian2017 · 2017-11-17 18:26:14 +08:00 · 1946 次点击
    这是一个创建于 2588 天前的主题,其中的信息可能已经有所发展或是发生改变。
    c = [-13, 14, 5, 5, 18, -2, 13, 15, -3, 10, 9.43, -4.43, 4.57, 8.57, 9.57, -6.14, 2.29, 9.43, 4.14, -5.57]


    def fun(lst):
    return sorted(lst, key=lambda x: (x < 0, isinstance(x, float), abs(x)))


    print(fun(c))

    上面程序运行结果是:
    [5, 5, 10, 13, 14, 15, 18, 2.29, 4.14, 4.57, 8.57, 9.43, 9.43, 9.57, -2, -3, -13, -4.43, -5.57, -6.14]


    在本例子中有一句 lambda x: (x < 0, isinstance(x, float), abs(x)),这其实就是 python 里面的 lambda 表达式

    1.什么是 lambda 表达式
    python 语言中,lambda 表达式就相当于一个只有一句代码的函数:
    lambda x: (x < 0, isinstance(x, float), abs(x))

    相当于函数:
    def fun(x):
    return (x < 0, isinstance(x, float), abs(x))

    这个函数返回的是一个元组


    2.什么是 sorted 函数
    sorted 函数第一个参数是要排序的列表,默认会把列表中的元素从小到大进行排序
    key 参数接受一个 Callable 对象,比如 lambda 表达式,key 默认值为 None ;如果 key 参数为 lambda 表达式,在对列表中每个元素排序的时候,会执行 lambda 表达式的语句,根据 lambda 表达式的返回值,决定每个元素的大小,这个例子里,其实就是元组和元组比较大小,类似于 (True, False, 19) 和 (True, True, 10) 元组比较大小,默认小的排前面,大的排后面

    3.元组大小如何比较
    元组比较大小,其实是比较元组中对应元素的大小
    比如:
    t1=(a1, a2, a3) 和 t2=(b1, b2, b3)

    先比较 a1 和 b1 的大小,如果 a1 > b1, 那么 t1 > t2; 如果 a1 < b1,那么 t1 < t2; 如果 a1 == a2, 那么继续比较第二个元素大小,元组的大小由第二个元素大小决定,如果第二个元素也相等,那么比较第三个元素大小,依次类推。。。


    4.本案例排序规则是什么
    lambda x: (x < 0, isinstance(x, float), abs(x))

    这个 lambda 表达式定义的排序规则是:
    a. 所有的正数排前面,所有的负数排后面
    b. 如果两个数同是正数或者同是负数,那么所有非浮点数排前面,所有浮点数排后面
    c. 如果两个数正负数类型相同,是否是浮点数的结果也相同,那么按两个数的绝对值大小比较,绝对值小的排前面,绝对值大的排后面

    比如 -5 和 2.3 比较大小
    其实是 (-5<0, isinstance(-5, float), abs(-5)) 和 (2.3<0, isinstance(2.3, float), abs(2.3)) 这两个元组比较大小

    (-5<0, isinstance(-5, float), abs(-5)) == (True, False, 5)
    (2.3<0, isinstance(2.3, float), abs(2.3)) == (False, True, 2.3)

    所以相当于
    (True, False, 5) 和 (False, True, 2.3) 比较大小

    这两个元组比较,(True, False, 5) 是大于 (False, True, 2.3) 的,所以排序的时候 2.3 排前面,-5 排后面。
    ads1029
        1
    ads1029  
       2017-11-18 17:32:19 +08:00
    十分清晰,感谢分享
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4882 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:44 · PVG 17:44 · LAX 01:44 · JFK 04:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.