400-650-7353

精品课程

您所在的位置:首页 > IT干货资料 > python > 【Python基础知识】Python高阶函数

【Python基础知识】Python高阶函数

高阶函数是指接收函数为参数,或者将函数作为结果返回的函数。

(1)sorted()函数

sorted()函数用于对可迭代对象进行排序。除此之外,sorted()函数是高阶函数,可以传递给sorted()函数一个自定义的函数作为参数,这个参数的名字是key,必须以关键字参数的形式传递。sorted()函数要比较的每个值都会传入key指定名称的函数内,并根据该函数的返回值进行比较,以实现按自定义的排序方式进行排序。

例如,下面的列表中包含了一些代表动物的字符串,将它们进行排列:

  1. >>> animals = ['panda''lion''tiger''fox''elephant'
  2. >>> sorted(animals)   # 未指定key参数 
  3. ['elephant''fox''lion''panda''tiger'
  4. >>> sorted(animals, key=len)   # 指定key参数的值为len 
  5. ['fox''lion''panda''tiger''elephant'

在未指定key参数的情况下,列表按照字典顺序排序。在指定key参数的值为len的情况下,列表按照字符串的长度排序(len()函数),animals列表中的每个字符串都“输入”len()函数,再将字符串的长度作为返回值“输出”,如'fox'的长度为3,数值最小,故排在第一位,'elephant'长度为8,数值最大,故排在最后一位。注意,此处len()函数没有括号,是将函数名作为参数,如果加上括号,那么是调用函数。

再举另外一个示例,字符串的lower()方法是将字母变成小写字母,同样也可以使用str.lower()将lower()方法作为函数使用,下面两种方式是等价的:

  1. >>> 'P'.lower() 
  2. 'p' 
  3. >>> str.lower('P'
  4. 'p' 

知道这个知识后,就能将str.lower()函数用在字符串排序中了。下面的示例中,将含有字母的列表排序:

  1. >>> letters = ['a''Y''z''B'
  2. >>> sorted(letters)   # 未指定排序方式,按默认方式排序,大写字母总在小写字母前面 
  3. ['B''Y''a''z'
  4. >>> letters = ['a''Y''z''B']  
  5. >>> sorted(letters, key=str.lower)   # 将所有字母全部变为小写字母再排序 
  6. ['a''B''Y''z'

除了使用内建函数之外,当然也可以使用自定义的函数来指定排序规则。仍然使用前面的animals列表,这次将'panda'排在第一位,剩下的动物依旧按照字符串的长度排序。

  1. >>> animals = ['panda''lion''tiger''fox''elephant'
  2. >>> def panda_first(animal): 
  3. ...     if animal == 'panda':   # 如果是'panda',返回0,使其排在第一位 
  4. ...         return 0 
  5. ...     else:   # 如果是其他动物,那么返回它的长度 
  6. ...         return len(animal) 
  7. ...  
  8. >>> sorted(animals, key=panda_first)   
  9. ['panda''fox''lion''tiger''elephant'

然而,通常为了给key参数提供一个值而编写一个普通函数是不太值得的,往往使用匿名函数即可:

  1. >>> animals = ['panda''lion''tiger''fox''elephant'
  2. >>> sorted(animals, key=lambda animal: 0 if animal == 'panda' else len(animal)) 
  3. ['panda''fox''lion''tiger''elephant'

这个匿名函数看起来有些复杂,它的参数是animal,表达式是一个三目表达式:如果animal的值是'panda',返回0,否则返回animal的长度。使用匿名函数可以在一行内方便地将列表排列成指定顺序。

使用sorted()函数和匿名函数还可以用来给字典排序。例如,将下面的水果字典(将字典的值想象为水果数量)按照水果数量从大到小的顺序排序:

  1. >>> fruits = {'apple'10'banana'42'orange'5'mango'18
  2. >>> sorted(fruits.items(), key=lambda item: item[1])   #比较字典的第2项 
  3. [('orange'5), ('apple'10), ('mango'18), ('banana'42)] 

由于sorted()函数只能对可迭代对象进行排序,而字典的items()方法返回的值可以迭代,因此,可以使用items()方法进行迭代。

(2)max()函数和min()函数

max()函数和min()函数也是高阶函数,与sorted()函数的相似之处在于,它们也要经过比较才能返回值(可以理解为sorted()排序后的最大值和最小值)。max()函数和min()函数也有key参数,作用机制与sorted()函数一致。

例如,下面的字典中存储着各个同学的分数,使用max()找到分数最高的同学:

  1. >>> grade = {'小明'72'梅梅'81'丽丽'58
  2. >>> max(grade.items(), key=lambda item: item[1]) 
  3. ('梅梅'81

假设老师给小明加了10分,那么需要改动匿名函数:

  1. >>> grade = {'小明'72'梅梅'81'丽丽'58
  2. >>> max(grade.items(), key=lambda item: item[1] + 10 if item[0] == '小明' else item[1]) 
  3. ('小明'72

min()函数与max()函数是相似的,只是min()函数返回的是最小值:

  1. >>> numbers = [15400280082142100099
  2. >>> min(numbers) 
  3. 15 

下面将用自定义的函数作为key参数的值,这个参数返回一个数字各个位相加的和(由于这个函数稍微有些复杂,因此,建议使用def关键字定义函数):

  1. >>> def sum_digit(num): 
  2. ...     sum = 0  
  3. ...     while num: 
  4. ...         sum += num % 10 
  5. ...         num = num // 10 
  6. ...     return sum 
  7. >>> # 下面简单测试一下这个函数的正确性 
  8. >>> sum_digit(46)  # 4和6相加为10 
  9. 10 
  10. >>> sum_digit(99)  # 9和9相加为18 
  11. 18 
  12. >>> sum_digit(1000# 1和0相加为1 
  13. 1 
  14. >>> # 下面使用这个函数作为key参数的值 
  15. >>> numbers = [15400280082142100099
  16. >>> min(numbers, key=sum_digit) 
  17. 1000 

课程好礼申请领取
您的姓名
您的电话
意向课程
 

中公优就业

官方QQ

扫描上方二维码或点击一键加群,免费领取价值599元网课,加群暗号:599。 一键加群

>>本文地址:
注:本站稿件未经许可不得转载,转载请保留出处及源文件地址。

推荐阅读

优就业:ujiuye

关注中公优就业官方微信

  • 关注微信回复关键词“大礼包”,领80G学习资料
QQ交流群
领取免费网课
(加群备注“网站”)
IT培训交流群 加入群聊 +
软件测试 加入群聊 +
全链路UI/UE设计 加入群聊 +
Python+人工智能 加入群聊 +
互联网营销 加入群聊 +
Java开发 加入群聊 +
PHP开发 加入群聊 +
VR/AR游戏开发 加入群聊 +
大前端 加入群聊 +
大数据 加入群聊 +
Linux云计算 加入群聊 +
优就业官方微信
扫码回复关键词“大礼包”
领取80G学习资料

测一测
你适合学哪门IT技术?

1 您的年龄

2 您的学历

3 您更想做哪个方向的工作?

获取测试结果
 
课程资料、活动优惠 领取通道
 
 
网站地图 500w彩票网客户端下载 彩29彩票网官网 cc彩票注册
AG国际馆SunBet平台 菲律宾太阳城网址 菲律宾申博网址 太阳城亚洲官网
彩29彩票台湾宾果 菲律宾国际沙龙娱乐 澳门娱乐场登入 大富豪棋牌直营网
58彩票网是合法的吗 500万彩票网站电脑版pc 快乐彩票网注册 五星彩票网游戏
金巴黎彩票手机app 快乐彩票官网 快乐彩票网注册 500w彩票网开户
158jbs.com XSB788.COM XSB538.COM 8BAS.COM 979sj.com
1113885.COM 558jbs.com 231SUN.COM 1115119.COM 166TGP.COM
787XTD.COM 678jbs.com 8TJS.COM 144TGP.COM 55sbsg.com
558jbs.com 151sj.com 3454111.COM 173XTD.COM S618N.COM