lambda 定义了一个匿名函数
lambda 并不会带来程序运行效率的提高,只会使代码更简洁。
如果可以使用for...in...if来完成的,坚决不用lambda。
如果使用lambda,lambda内不要包含循环,如果有,我宁愿定义函数来完成,使代码获得可重用性和更好的可读性。
原文链接
- tips:
operator.itemgetter() 有时候也可以用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运行更快
网友评论