目录 | 上一节 (7.1 可变参数) | [下一节 (7.3 返回函数)]()
7.2 匿名函数和 Lambda
再探列表排序
列表能够应用 sort
办法进行 原地(in-place)排序:
s = [10,1,7,3]
s.sort() # s = [1,3,7,10]
也能够进行降序排序(译注:原文应用的是 sort in reverse order
,很多时候翻译为倒序排序或者反向排序,集体认为容易引起歧义,故翻译为降序排序):
s = [10,1,7,3]
s.sort(reverse=True) # s = [10,7,3,1]
对单个列表排序仿佛非常简单,然而,如果对字典列表排序,那么咱们怎么做呢?
[{'name': 'AA', 'price': 32.2, 'shares': 100},
{'name': 'IBM', 'price': 91.1, 'shares': 50},
{'name': 'CAT', 'price': 83.44, 'shares': 150},
{'name': 'MSFT', 'price': 51.23, 'shares': 200},
{'name': 'GE', 'price': 40.37, 'shares': 95},
{'name': 'MSFT', 'price': 65.1, 'shares': 50},
{'name': 'IBM', 'price': 70.44, 'shares': 100}]
通过什么样的规定进行排序呢?
你能够应用键函数(key function)领导排序。键函数是这样的一种函数:承受一个字典并且返回一个用于排序的值。
def stock_name(s):
return s['name']
portfolio.sort(key=stock_name)
排序后果如下:
# Check how the dictionaries are sorted by the `name` key
[{'name': 'AA', 'price': 32.2, 'shares': 100},
{'name': 'CAT', 'price': 83.44, 'shares': 150},
{'name': 'GE', 'price': 40.37, 'shares': 95},
{'name': 'IBM', 'price': 91.1, 'shares': 50},
{'name': 'IBM', 'price': 70.44, 'shares': 100},
{'name': 'MSFT', 'price': 51.23, 'shares': 200},
{'name': 'MSFT', 'price': 65.1, 'shares': 50}
]
回调函数
在下面的示例中,键函数是一个回调函数(callback function)。sort()
办法调用了 stock_name()
函数,而后 stock_name()
函数返回一个值给 sort()
办法。通常,回调函数是一个简短的单行函数,只用于一个操作。程序员常常会要求提供一种快捷办法来指定这种额定的解决。
Lambda:匿名函数
在之前的排序示例中,咱们能够应用 lambda,而不是创立(具名)函数。
portfolio.sort(key=lambda s: s['name'])
下面的代码创立了一个匿名(unnamed)函数用来计算单个表达式,比初始代码短很多。
def stock_name(s):
return s['name']
portfolio.sort(key=stock_name)
# vs lambda
portfolio.sort(key=lambda s: s['name'])
应用 lambda
- lambda 是受到严格限度的。
- 只容许一个表达式。
- 没有
if
,while
之类的语句。 - 多和其它函数一起应用,相似于
sort()
办法。
练习
读取股票投资组合数据,并将数据转换为列表:
>>> import report
>>> portfolio = list(report.read_portfolio('Data/portfolio.csv'))
>>> for s in portfolio:
print(s)
Stock('AA', 100, 32.2)
Stock('IBM', 50, 91.1)
Stock('CAT', 150, 83.44)
Stock('MSFT', 200, 51.23)
Stock('GE', 95, 40.37)
Stock('MSFT', 50, 65.1)
Stock('IBM', 100, 70.44)
>>>
练习 7.5:对字段进行排序
请尝试上面的语句,这些语句按股票名称的字母程序对投资组合数据进行排序。
>>> def stock_name(s):
return s.name
>>> portfolio.sort(key=stock_name)
>>> for s in portfolio:
print(s)
... inspect the result ...
>>>
在此局部,stock_name()
函数从 portfolio
列表的单个条目中提取股票名称。sort()
办法应用 stock_name()
函数的返回值进行比拟并排序。
练习 7.6:应用 lambda 对字段进行排序
请尝试应用 lambda
表达式,按股份数目对投资组合数据进行排序:
>>> portfolio.sort(key=lambda s: s.shares)
>>> for s in portfolio:
print(s)
... inspect the result ...
>>>
尝试按每只股票的价格对投资组合数据进行排序:
>>> portfolio.sort(key=lambda s: s.price)
>>> for s in portfolio:
print(s)
... inspect the result ...
>>>
注意事项:lambda
是一种十分有用的快捷方式,因为它让你间接在 sort()
办法的调用中定义一个非凡的处理函数,而不用当时定义一个独自的函数。
目录 | 上一节 (7.1 可变参数) | [下一节 (7.3 返回函数)]()
注:残缺翻译见 https://github.com/codists/practical-python-zh