python lambda

2019-10-21  本文已影响0人  逗比的一生

lambda 定义了一个匿名函数
lambda 并不会带来程序运行效率的提高,只会使代码更简洁。
如果可以使用for...in...if来完成的,坚决不用lambda。
如果使用lambda,lambda内不要包含循环,如果有,我宁愿定义函数来完成,使代码获得可重用性和更好的可读性。
原文链接

>>> rows = [ {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}, {'fname': 'David', 'lname': 'Beazley', 'uid': 1002}, {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}, {'fname': 'Big', 'lname': 'Jones', 'uid': 1004} ]
>>> from operator import itemgetter
>>> rows_by_fname = sorted(rows, key=itemgetter('fname'))
>>> print(rows_by_fname)
[{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}, {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}, {'fname': 'David', 'lname': 'Beazley', 'uid': 1002}, {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]
>>> rows_by_fname2 = sorted(rows,key=lambda r: r['fname'])
>>> print(rows_by_fname2)
[{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}, {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}, {'fname': 'David', 'lname': 'Beazley', 'uid': 1002}, {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]

此处使用lambda会比itemgetter()运行更快一些

>>> class User:
    def __init__(self,user_id):
        self.user_id = user_id
    def __repr__(self):
        return 'User({})'.format(self.user_id)

    
>>> def sorr_notcpmpare():
    users = [User(23),User(3),User(99)]
    print(users)
    print(sorted(users,key=lambda u: u.user_id))

    
>>> sorr_notcpmpare()
[User(23), User(3), User(99)]
[User(3), User(23), User(99)]

operator.attrgetter() 来代替lambda函数

>>> from operator import attrgetter
>>> class User:
    def __init__(self,user_id):
        self.user_id = user_id
    def __repr__(self):
        return 'User({})'.format(self.user_id)

>>> def sort_notcompare():
    users = [User(23), User(3), User(99)]
    print(users)
    print(sorted(users,key=attrgetter('user_id')))


>>> sort_notcompare()
[User(23), User(3), User(99)]
[User(3), User(23), User(99)]

此处,使用attrgetter()比lambda运行更快

上一篇 下一篇

猜你喜欢

热点阅读