这篇文章的内容是:编写高质量python代码的方法中的第15节——了解如何在闭包里使用外围作用域中的变量。但是这个问题解法比较好,我单独拿出来写一章。
假如有一份列表,其中的元素都是数字,现在要对其排序,但排序时,要把出现在某个群组内的数字,放在群组外的那些数字之前。这种用法在绘制用户界面时候可能会遇到,我们可以用这个办法把重要的消息或意外的事件优先显示在其他内容前面。
实现该功能的一种常见方法,是在调用列表的sort方法时,把辅助函数传给key参数。这个辅助函数的返回值,将会用来确定列表中各元素的顺序。辅助函数可以判断受测元是否处在重要群组中,并据此返回相应的排序关键字(sort key).
def sort_priority(values, group):
def helper(x):
if x in group:
return (0,x)
return(1,x)
values.sort(key=helper)
numbers = [8,3,1,2,5,4,7,6]
group = {2,3,5,7}
sort_priority(numbers, group)
print(numbers)
>>>
[2,3,5,7,1,4,6,8]
这个函数之所以能够正常动作,是基于下列三个原因:
- python支持闭包(closure): 闭包是一种定义在某个作用域中的函数,这种函数引用了那个作用域里面的变量。helper函数之所以能够访问sort_priorit的group参数,原因就在于它是闭包。
- python的函数是一级对象(first-class object),也就是说,我们可以直接引用函数,把函数赋给变量、把函数当成参数传给其他函数,并通过 表达式及if语句对其进行比较和判断 ,等等。于是,我们可以把helper这个闭包函数,传给sort方法的key参数。
- python使用特殊的规则来比较两个元组。它首先比较各元组中下标为0的对应元素,如果相等,再比较下标为1的对应元素,如果还是相等,那就继续比较下票为2的对应元素,依次类推。