高階函數(shù)是指接收函數(shù)為參數(shù),或者將函數(shù)作為結(jié)果返回的函數(shù)。
(1)sorted()函數(shù)
sorted()函數(shù)用于對可迭代對象進行排序。除此之外,sorted()函數(shù)是高階函數(shù),可以傳遞給sorted()函數(shù)一個自定義的函數(shù)作為參數(shù),這個參數(shù)的名字是key,必須以關(guān)鍵字參數(shù)的形式傳遞。sorted()函數(shù)要比較的每個值都會傳入key指定名稱的函數(shù)內(nèi),并根據(jù)該函數(shù)的返回值進行比較,以實現(xiàn)按自定義的排序方式進行排序。
例如,下面的列表中包含了一些代表動物的字符串,將它們進行排列:
- >>> animals = ['panda', 'lion', 'tiger', 'fox', 'elephant']
- >>> sorted(animals) # 未指定key參數(shù)
- ['elephant', 'fox', 'lion', 'panda', 'tiger']
- >>> sorted(animals, key=len) # 指定key參數(shù)的值為len
- ['fox', 'lion', 'panda', 'tiger', 'elephant']
在未指定key參數(shù)的情況下,列表按照字典順序排序。在指定key參數(shù)的值為len的情況下,列表按照字符串的長度排序(len()函數(shù)),animals列表中的每個字符串都“輸入”len()函數(shù),再將字符串的長度作為返回值“輸出”,如'fox'的長度為3,數(shù)值最小,故排在第一位,'elephant'長度為8,數(shù)值最大,故排在最后一位。注意,此處len()函數(shù)沒有括號,是將函數(shù)名作為參數(shù),如果加上括號,那么是調(diào)用函數(shù)。
再舉另外一個示例,字符串的lower()方法是將字母變成小寫字母,同樣也可以使用str.lower()將lower()方法作為函數(shù)使用,下面兩種方式是等價的:
- >>> 'P'.lower()
- 'p'
- >>> str.lower('P')
- 'p'
知道這個知識后,就能將str.lower()函數(shù)用在字符串排序中了。下面的示例中,將含有字母的列表排序:
- >>> letters = ['a', 'Y', 'z', 'B']
- >>> sorted(letters) # 未指定排序方式,按默認方式排序,大寫字母總在小寫字母前面
- ['B', 'Y', 'a', 'z']
- >>> letters = ['a', 'Y', 'z', 'B']
- >>> sorted(letters, key=str.lower) # 將所有字母全部變?yōu)樾懽帜冈倥判?/span>
- ['a', 'B', 'Y', 'z']
除了使用內(nèi)建函數(shù)之外,當然也可以使用自定義的函數(shù)來指定排序規(guī)則。仍然使用前面的animals列表,這次將'panda'排在第一位,剩下的動物依舊按照字符串的長度排序。
- >>> animals = ['panda', 'lion', 'tiger', 'fox', 'elephant']
- >>> def panda_first(animal):
- ... if animal == 'panda': # 如果是'panda',返回0,使其排在第一位
- ... return 0
- ... else: # 如果是其他動物,那么返回它的長度
- ... return len(animal)
- ...
- >>> sorted(animals, key=panda_first)
- ['panda', 'fox', 'lion', 'tiger', 'elephant']
然而,通常為了給key參數(shù)提供一個值而編寫一個普通函數(shù)是不太值得的,往往使用匿名函數(shù)即可:
- >>> animals = ['panda', 'lion', 'tiger', 'fox', 'elephant']
- >>> sorted(animals, key=lambda animal: 0 if animal == 'panda' else len(animal))
- ['panda', 'fox', 'lion', 'tiger', 'elephant']
這個匿名函數(shù)看起來有些復雜,它的參數(shù)是animal,表達式是一個三目表達式:如果animal的值是'panda',返回0,否則返回animal的長度。使用匿名函數(shù)可以在一行內(nèi)方便地將列表排列成指定順序。
使用sorted()函數(shù)和匿名函數(shù)還可以用來給字典排序。例如,將下面的水果字典(將字典的值想象為水果數(shù)量)按照水果數(shù)量從大到小的順序排序:
- >>> fruits = {'apple': 10, 'banana': 42, 'orange': 5, 'mango': 18}
- >>> sorted(fruits.items(), key=lambda item: item[1]) #比較字典的第2項
- [('orange', 5), ('apple', 10), ('mango', 18), ('banana', 42)]
由于sorted()函數(shù)只能對可迭代對象進行排序,而字典的items()方法返回的值可以迭代,因此,可以使用items()方法進行迭代。
(2)max()函數(shù)和min()函數(shù)
max()函數(shù)和min()函數(shù)也是高階函數(shù),與sorted()函數(shù)的相似之處在于,它們也要經(jīng)過比較才能返回值(可以理解為sorted()排序后的最大值和最小值)。max()函數(shù)和min()函數(shù)也有key參數(shù),作用機制與sorted()函數(shù)一致。
例如,下面的字典中存儲著各個同學的分數(shù),使用max()找到分數(shù)最高的同學:
- >>> grade = {'小明': 72, '梅梅': 81, '麗麗': 58}
- >>> max(grade.items(), key=lambda item: item[1])
- ('梅梅', 81)
假設老師給小明加了10分,那么需要改動匿名函數(shù):
- >>> grade = {'小明': 72, '梅梅': 81, '麗麗': 58}
- >>> max(grade.items(), key=lambda item: item[1] + 10 if item[0] == '小明' else item[1])
- ('小明', 72)
min()函數(shù)與max()函數(shù)是相似的,只是min()函數(shù)返回的是最小值:
- >>> numbers = [15, 400, 2800, 821, 42, 1000, 99]
- >>> min(numbers)
- 15
下面將用自定義的函數(shù)作為key參數(shù)的值,這個參數(shù)返回一個數(shù)字各個位相加的和(由于這個函數(shù)稍微有些復雜,因此,建議使用def關(guān)鍵字定義函數(shù)):
- >>> def sum_digit(num):
- ... sum = 0
- ... while num:
- ... sum += num % 10
- ... num = num // 10
- ... return sum
- >>> # 下面簡單測試一下這個函數(shù)的正確性
- >>> sum_digit(46) # 4和6相加為10
- 10
- >>> sum_digit(99) # 9和9相加為18
- 18
- >>> sum_digit(1000) # 1和0相加為1
- 1
- >>> # 下面使用這個函數(shù)作為key參數(shù)的值
- >>> numbers = [15, 400, 2800, 821, 42, 1000, 99]
- >>> min(numbers, key=sum_digit)
- 1000
>>本文地址:http://www.yceu.cn/zhuanye/2020/61386.html
聲明:本站稿件版權(quán)均屬中公教育優(yōu)就業(yè)所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
1 您的年齡
2 您的學歷
3 您更想做哪個方向的工作?