python高阶函数
高階函數,接收函數作為參數,或者將函數作為返回值的函數是高階函數;
5個帶key內置函數
- filter/map(function, iterable) --> 迭代器
- sorted(iterable[, cmp[, key[, reverse]]]) --> list
- min/max(iterable, *[, default=obj, key=func]) --> value
這類函數總結
a = [1,2,3,1,1,1,3,3,3,3]#1 print(max(a,key=a.count)) # a.count(3) = 5#2 上面的等價于 l ={} for i in a:l[a.count(i)]=i res_num = max(l) res_id = l[res_num] print(l) print(res_num,res_id)1.max
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' #count函數先理解 a = [1,2,3,3,2,2,2,2] print(a.count(2)) # 5 print(max(set(a),key=a.count)) #2# max() 方法返回給定參數的最大值,參數可以為序列。 lis = [1,2,3,-4] print(max(lis)) #返回lis列表中的最大值 '''結果: 3 '''print(max(lis,key=abs)) #key參數指向絕對值函數,返回的結果是-42. min
# min() 方法返回給定參數的最小值,參數可以為序列。 lis = [-1,0,1,2] print(min(lis)) #返回lis列表中的最小值 '''結果: -1 '''3.fileter
''' unittest源碼中 '''def getTestCaseNames(self, testCaseClass):"""Return a sorted sequence of method names found within testCaseClass"""#這里定義filter函數def shouldIncludeMethod(attrname):if not attrname.startswith(self.testMethodPrefix):return FalsetestFunc = getattr(testCaseClass, attrname)if not callable(testFunc):return FalsefullName = f'%s.%s.%s' % (testCaseClass.__module__, testCaseClass.__qualname__, attrname)return self.testNamePatterns is None or \any(fnmatchcase(fullName, pattern) for pattern in self.testNamePatterns)#filter 使用方法testFnNames = list(filter(shouldIncludeMethod, dir(testCaseClass)))#是否排序if self.sortTestMethodsUsing:#testFnNames是列表,sort是python3里面的列表方法#case的排序testFnNames.sort(key=functools.cmp_to_key(self.sortTestMethodsUsing))return testFnNames# filter() 函數用于過濾序列,過濾掉不符合條件的元素,返回一個迭代器對象。 # 該接收兩個參數,第一個為函數,第二個為序列,序列的每個元素作為參數傳遞給函數進行判,然后返回 True 或 False,最后將返回 # True 的元素放到新列表中。# 語法格式:filter(function, iterable)#實例1 def is_odd(x):return x % 2 == 1 print(list(filter(is_odd,[1,2,3,4,5,6,7,8,9]))) #python3中不使用list強轉數據類型的話,filter返回的是迭代器 '''結果: [1, 3, 5, 7, 9] '''#實例2 s = 'jason lv' iterator = filter(lambda x : x !='a',s) s1 = '' for i in iterator:s1 += str(i) print(s1) '''結果: json lv '''4.map
map() 會根據提供的函數對指定序列做映射。
第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回一個迭代器對象。
語法格式:map(function, iterable, …)
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' #實例1 def pow2(x):return x * xlis = [1,2,3,4,5,6] print(list(map(pow2,lis))) '''結果: [1, 4, 9, 16, 25, 36] '''#實例2 lis = [1,2,3,4,5,6] print(list(map(lambda x : x *10 if x >3 else x / 2,lis))) '''結果: [0.5, 1.0, 1.5, 40, 50, 60] '''#碰到 iterm = ['1','2','3'] print(','.join(iterm)) iterm = [1,2,3] print(','.join(map(str,iterm)))5.sorted 注意不是Sort函數是list列表中的函數
sort 與 sorted 區別:(注意sort 沒有返回值的坑)
sort 是應用在 list 上的方法,sorted 可以對所有可迭代的對象進行排序操作。
list 的 sort 方法返回的是對已經存在的列表進行操作,無返回值,而內建函數 sorted 方法返回的是一個新的 list,而不是在原來的基礎上進行的操作。
Sort函數是list列表中的函數,而sorted可以對list或者iterator進行排序。
語法格式:sorted(iterable[, cmp[, key[, reverse]]])
參數說明:
(1) cmp參數
cmp接受一個函數,拿整形舉例,形式為:
def f(a, b):return a - b如果排序的元素是其他類型的,如果a邏輯小于b,函數返回負數;a邏輯等于b,函數返回0;a邏輯大于b,函數返回正數就行了
(2)key參數
key也是接受一個函數,不同的是,這個函數只接受一個元素, 形式如下
def f(a):return len(a)key接受的函數返回值,表示此元素的權值,sort將按照權值大小進行排序
(3)reverse參數
接受False或者True表示是否逆序
語法格式:sorted(iterable[, cmp[, key[, reverse]]])
map
''' unittest源碼中 '''def loadTestsFromTestCase(self, testCaseClass):"""Return a suite of all test cases contained in testCaseClass""" if issubclass(testCaseClass, suite.TestSuite):raise TypeError("Test cases should not be derived from ""TestSuite. Maybe you meant to derive from ""TestCase?")testCaseNames = self.getTestCaseNames(testCaseClass)if not testCaseNames and hasattr(testCaseClass, 'runTest'):testCaseNames = ['runTest']#map(function, iterable) 返回迭代器loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))return loaded_suite''' 其他示例 ''' # 使用 lambda 匿名函數 >>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) [1, 4, 9, 16, 25]# 提供了兩個列表,對相同位置的列表數據進行相加 >>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]) [3, 7, 11, 15, 19]總結
以上是生活随笔為你收集整理的python高阶函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python:两个队列实现栈,两个栈实现
- 下一篇: Python装饰器执行顺序详解