类别|上一节(7.1可变参数)|下一节(7.3返回函数)7.2匿名函数和Lambda重访列表排序列表可以使用sort方法in-place)sorting:s=[10,1,7,3]s.sort()#s=[1,3,7,10]也可以按降序排序(译注:原文使用sortinreverseorder,多次翻译为反向排序或反向排序,个人认为容易引起歧义,故译为降序排序):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}]使用什么样的规则进行排序?你可以使用键函数(keyfunction)来引导排序。键函数是一个接受字典并返回排序值的函数。defstock_name(s):returns['name']portfolio.sort(key=stock_name)排序结果如下:#查看字典是如何按`name`键排序的[{'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}]中的回调函数上面的例子,关键函数是一个回调函数(callbackfunction)。sort()方法调用stock_name()函数,stock_name()函数返回一个值给sort()方法。通常,回调函数是一个简短的单行函数,仅用于一个操作。程序员经常要求使用快捷方式来指定此额外处理。Lambda:匿名函数在前面的排序示例中,我们可以使用lambda而不是创建(命名)函数。portfolio.sort(key=lambdas:s['name'])上面的代码创建了一个匿名(未命名)函数来评估单个表达式,它比原始代码短得多。defstock_name(s):returns['name']portfolio.sort(key=stock_name)#vslambdaportfolio.sort(key=lambdas:s['name'])lambdalambda的使用受到严格限制。只允许一个表达式。没有if、while等语句。它主要与其他函数一起使用,类似于sort()方法。练习阅读股票投资组合数据并将数据转换为列表:>>>??importreport>>>portfolio=list(report.read_portfolio('Data/portfolio.csv'))>>>forsinportfolio:print(s)股票('AA',100,32.2)股票('IBM',50,91.1)股票('CAT',150,83.44)股票('MSFT',200,51.23)股票('GE',95,40.37)Stock('MSFT',50,65.1)Stock('IBM',100,70.44)>>>练习7.5:排序字段尝试以下语句,按股票名称Sort的字母顺序对投资组合数据进行排序。>>>defstock_name(s):returns.name>>>portfolio.sort(key=stock_name)>>>forsinportfolio:print(s)...检查结果...>>>这里部分,stock_name()函数从投资组合列表中的单个条目中提取股票名称。sort()方法使用stock_name()函数的返回值进行比较和排序。练习7.6:使用lambda对字段排序尝试使用lambda表达式按股票数量对投资组合数据进行排序:>>>portfolio.sort(key=lambdas:s.shares)>>>forsinportfolio:print(s)...检查结果...>>>尝试按每只股票的价格对投资组合数据进行排序:>>>portfolio.sort(key=lambdas:s.price)>>>forsinportfolio:print(s)...检查结果...>>>注意:lambda是一个非常有用的快捷方式,因为它可以让您定义一个特殊的处理函数,而无需事先定义一个单独的函数。名录|上一节(7.1可变参数)|NextSection(7.3ReturnFunction)注:完整翻译见https://github.com/codists/practical-python-zh
