系列文章目錄
- Python數據類型:編程新手的必修課
- 深入探索Python字符串:技巧、方法與實戰
- Python 函數基礎詳解
- Python正則表達式詳解:掌握文本匹配的魔法
- Python文件操作寶典:一步步教你玩轉文件讀寫
- Python面向對象基礎與魔法方法詳解
- Python面向對象進階:深入解析面向對象三要素——封裝、繼承與多態
- Python進階之旅:深入理解變量作用域、垃圾回收、拷貝機制與異常處理
- Python函數進階:四大高階函數、匿名函數、枚舉、拉鏈與遞歸詳解
- 從零開始學迭代器生成器:打造高效、易讀的Python代碼
- Python進階:深入剖析閉包與裝飾器的應用與技巧
文章目錄
- 系列文章目錄
- 前言
- 一、匿名函數
- 二、四大高階函數
- 1.概念
- 2.map
- 3.reduce
- 4.filter
- 5.sorted
- 6.總結
- 三、枚舉函數
- 四、拉鏈函數
- 五、遞歸函數
- 簡單案例
- 二分查找算法
前言
Python函數進階涵蓋四大高階函數(map、reduce、filter、sorted)、匿名函數、枚舉、拉鏈及遞歸。本博客將深入解析這些高級特性,助你提升代碼效率與可讀性。從序列處理到遞歸算法,一同探索Python函數的進階奧秘。
一、匿名函數
語法:
def 函數名(形參):代碼塊
函數名(實參)# 變量-->函數對象
變量 = lambda 形參:表達式
變量名(實參)
分類:
# f = lambda 形參:表達式# 1.無參數無返回值的函數
def func1():print("這是無參數無返回值的def函數")
func1()f1 = lambda :print("這是無參數無返回值的lambda函數")
f1()# 2.有參數無返回值的函數
def func2(a):print(f"這是有參數無返回值的def函數,參數為:{a}")
func2(10)f2 = lambda a,b:print(f"這是有參數無返回值的lambda函數,參數為:{a+b}")
f2(20,30)# 3.無參數有返回值的函數
def func3():return "這是無參數有返回值的def函數"
print(func3())f3 = lambda :"這是無參數有返回值的lambda函數"
print(f3())# 4.有參數有返回值的函數
def func4(a):return f"這是有參數有返回值的def函數。參數為:{a}"
print(func4(5))f4 = lambda a:f"這是有參數有返回值的lambda函數。參數為:{a}"
print(f4(3))
二、四大高階函數
1.概念
高階函數:將另外一個函數作為參數使用
作為參數的函數一定要有返回值
2.map
代碼如下(示例):
# map
# 語法:map(函數,可迭代對象)
# 作用:將函數依次作用于可迭代對象中的每一個數據;返回的結果是一個迭代器對象# 案例一:將所有的數據取平方值存放在一個新的列表中返回
list1 = [1,2,3,4,5]def func1(x):return x**2ret = map(func1,list1)
print(list(ret))
3.reduce
# reduce高階函數比較特殊,使用需要導包
from functools import reduce# reduce
# 語法:reduce(函數,可迭代對象)
# 作用:對可迭代對象中的數據進行累計操作
# 返回一個值
# 案例一:利用高階函數實現對可迭代對象中的數據進行求和
list1 = [11,12,13,14,15]def func1(a,b):return a+bret = reduce(func1,list1)
print(ret)# 第一次:a=11 b=12 23
# 第二次:a=23 b=13 36
# 第三次:a=36 b=14 50
# 第四次:a=50 b=15 65
4.filter
# filter
# 語法:filter(函數,可迭代對象)
# 作用:通過函數對可迭代對象中的數據依次進行過濾,保留滿足條件的數據;返回的結果是一個迭代器對象# 案例一:100-999之間的水仙花數
list1 = [i for i in range(100,1000)]def func1(x):return int(str(x)[0]) ** 3 + int(str(x)[1]) ** 3 + int(str(x)[2]) ** 3 == xret = filter(func1,list1)
print(list(ret))
5.sorted
# abs()
# 語法:abs(數字)
# 作用:獲取當前數字的絕對值
num = -10
print(abs(num)) # 10# sort()
# 語法:列表.sort(key排序規則,reverse降序)
# 作用:按照指定的排序規則對列表中的數據進行升降序排序;不指定任何參數時,列表升序排序;指定reverse=True實現降序排序
list1 = [78,60,-34,51,0,-14]
def func1(x):return abs(x)
list1.sort(reverse=True,key=func1)
print(list1)# sorted
# 語法:sorted(可迭代對象,key排序規則,reverse降序)
# 作用:將可迭代對象按照指定的排序規則進行升降序排序
list1 = [78,60,-34,51,0,-14]
def func1(x):return abs(x)
ret = sorted(list1,reverse=True,key=func1)
print(ret)
6.總結
map: 1.所有的數據都要 2.對所有的數據都進行相同的操作 3.返回的結果是一個迭代器對象
reduce:1.對數據進行累積操作(累加,累乘) 2.返回的結果是一個具體的值 3.使用需要導包
filter:1. 不是所有的數都要,僅保留滿足條件的數據 2.返回的結果時一個迭代器對象
sorted:排序
三、枚舉函數
# 枚舉函數
# enumerate()
# 語法:enumerate(可迭代對象,start)
# 作用:獲取可迭代對象中的數據及對應的序號;序號默認從0開始,充當下標;通過start參數執行序號的起始值list1 = ["hello","你好","瑪卡巴卡"]ret1 = enumerate(list1,start=100)for i,j in ret1:print(i)
四、拉鏈函數
# 拉鏈函數
# zip
# 語法:zip()
# 作用:從多個可迭代對象中按照順序取對應的數據,組合成一個個小元組;返回的結果是一個zip對象list1 = ["張三","李四","王五","趙六"]
list2 = ["喜羊羊","美羊羊","懶羊羊"]ret = zip(list1,list2)for i in ret:print(i)
五、遞歸函數
簡單案例
# 遞歸函數
# 本質:自己調用自己# 編寫遞歸函數
# 1.在定義和調用函數時傳遞起始值
# 2.大范圍的判斷(何時結束遞歸)
# 3.實現本質:自己調用自己(參數發生變化)# 案例一:用遞歸函數實現1到10的和
def func1(n):if n == 10:return 10return n+func1(n+1)
print(func1(1))# 案例二:用遞歸函數實現10到1的和
def func2(n):if n == 1:return 1return n+func2(n-1)
print(func2(10))# 案例三:用遞歸函數實現10以內偶數的和
def func3(x):if x == 10:return 10else:return x + func3(x+2)
print(func3(0))
-------------------------------------
def func3(n):if n <= 0:return 0if n % 2 == 0:return n + func3(n-1)else:return func3(n-1)print(func3(10))
二分查找算法
# 遞歸函數實現二分查找算法
# 1.在定義和調用函數時傳遞起始值
# 2.大范圍判斷(結束遞歸)
# 3.實現自己調用自己(參數發生變化)# 遞歸實現獲取指定數據的下標
# 列表數據:1.數量沒有要求 2.數字的大小 3.數據必須有規律的排放
list1 = [5,13,26,45,63,79,81,96,102,304,706,958,1200]
# lst:指定要從這個列表中查詢數據-->列表不會發生變化
# n:要查詢的數據-->數據不會發生變化
# start:查詢范圍的起始值的下標
# end:查詢范圍的結束值的下標
def func(lst,n,start,end):# 查詢范圍內有數據:結束下標大于等于開始下標if end >= start:# 查詢中間值下標 mid = (start + end ) / 2mid = (start + end) // 2# 將要查詢的數據于中間值進行比較# 要查詢的數據 = 中間值if n == lst[mid]:return f"要查詢的數據的下標為:{mid}"# 要查詢的數據 > 中間值 start為mid+1elif n > lst[mid]:return func(lst,n,mid+1,end)# 要查詢的數據 < 中間值 end為mid-1elif n < lst[mid]:return func(lst,n,start,mid-1)# 如果查詢范圍內沒有數據了,需要結束遞歸else:return "當前列表中沒有要查詢的數據"
print(func(list1,6300,0,len(list1)-1))