Day6-1,函數,匿名函數,偏函數
來自專欄 Python 從0到1
一、函數
1. 定義:
在一個完整的項目中(假設有大量代碼),會有很多需要重複使用的功能,可以把重複功能的代碼封裝成一個函數,當需要使用該功能的時候直接調用該函數即可。本質為代碼的封裝。
2. 語法:
def 函數名(參數1, 參數2,...): 功能代碼 return 表達式def _min(x, y, z, a): # 定義一個函數,函數名為_min return min(x, y, z, a) # 返回4個數當中最小的數print(_min(3, 0.4, 5, 0.1)) # 傳入4個數作為函數的參數
3. 優點:
1) 使得代碼結構簡單,提高代碼復用性;
2)當需要修改某些功能或者調試bug時,直接修改對應的函數即可。
4. 注意:
1) 定義函數的時候必須以def關鍵字開頭
2 )給函數定義名字(自取),遵循標識符的命名規則,見名知意
3 )函數名後緊跟小括弧(),小括弧內是參數列表,用來接收實際調用者的參數,可以是空參數,但是小括弧不能省略
4) 小括弧中放的是參數列表(形式參數),可以為空,也可以定義多個,其實質就是功能代碼中使用的變數
5) 冒號是函數功能模塊代碼的開始,用Tab鍵來標明函數代碼的範圍
6)功能代碼:需要封裝的代碼(需要重複使用的功能)
7)建議函數的前後都應該各空兩行
8 )關於return:
1 > 可以省略,不寫直接執行功能代碼,功能代碼執行結束後該函數執行完畢,沒有return時相當於在函數末尾執行 return None;
2 > return 結果(表達式),函數會執行到return後,函數結束,並將結果作為函數的執行結果返回;
3 > return 可以用了結束函數代碼的執行
5. 函數的參數
1)位置參數:
實質: 實際參數賦值給形式參數的過程
實際參數: 在函數調用時傳入的參數,調用函數傳遞參數的順序需要與定義的函數參數順序一致,傳入實際參數的個數需要與定義時的個數一致。
形式參數: 在定義函數時寫的參數
def _min(x, y, z, a): # x, y, z, a為形式參數,是用來接收實際參數的 return min(x, y, z, a) print(_min(3, 0.4, 5, 0.1)) # 括弧中的4個數是實際參數
要使用功能的函數名(與定義的函數的函數名一致),函數名要加上(),()中是需要傳遞給函數的參數(實際參數),可以作為空參,但是()不能省略 。
2)關鍵字參數:
調用時替換順序會出錯,python允許更改傳遞參數的順序, 但是需要指定參數名, 否則程序會報錯。
def sum_(x, y): # 定義一個求和函數,有兩個參數 print(x:, x, y:,y) # 列印出x,y的值 return x + y # 返回x + y的值print(sum_(3,4)) # 按順序 x=3 y=4x: 3 y: 47print(sum_(4,3)) # 調換位置之後,x,y的值也調換了x: 4 y: 37print(sum_(y=4, x=3)) # 想要保持原來的值,就必須以賦值的形式傳值,這就是關鍵字參數x: 3 y: 47
3)默認參數
設置默認值得參數需要放在參數列表的最後面,python中設置了默認參數後,該默認參數可以不傳遞,可以替換掉默認值。
def _min(x, y, z=1): # 定義一個求最小值的函數, z 默認為1 return min(x, y, z) # 函數在調用是,z可以不賦值,此時z=1,若z賦值就為新賦的值print(_min(3, 4, 5)) # x=3, y=4, z=53print(_min(3,4)) # x=3, y=4, z=11
4)可變參數
能處理比定義時更多的參數, 如果函數調用時沒有傳遞變數,則是一個空元組,可變長度參數最好放在參數列表的最後。
*args:1. 用來表示沒有命名的多個變數;
2. 會自動的將這些沒有命名的變數封裝成一個元組然後傳遞進來
**kwargs:1. 代表鍵值對的多個參數的列表;
2. 會自動的將多個帶變數的參數自動封裝成一個字典,參數名作為key,參數值作為value;
3. 如果函數調用時沒有傳遞鍵值對,則是一個空字典
def updateStu(id, *args, **kwargs): # id = 101 name = kwargs.get(name) # args = (看書, 聊天, 畫畫) phone = kwargs.get(phone) # kwargs = {name:aliase, phone:1200} if name and phone: print(變更學生信息,id, name, phone,sep=--) print(變更愛好--, .join(args))updateStu(101, 看書, 聊天, 畫畫, name=aliase, phone=1200)
5)綜合參數
注意排序位置:應為(位置參數,關鍵字參數,*args,**kwargs,默認參數)。
二、匿名函數
lambda表達式: lambda 參數1, 參數2: 結果表達式
# 匿名函數sum_l = lambda x, y: x + yprint(sum_l(10, 20)) # 30# 藉助於 if-else寫法,實現Python三元操作# x if True else y 如果條件為True,返回x,反之返回ymin_l = lambda x, y: y if x >y else x print(min_l(10, 20)) # 10
三、偏函數
偏函數即是現有函數的分身,區別是關鍵參數值不同。
import functools as ft# 偏函數 -- functools.partial(函數名,關鍵參數=值)# 創建了int函數的分身,16進位表示轉換的字元串是16進位字元int16 = ft.partial(int, base=16)print(int16(a1)) # int(a1, base=16),=> 161print(int16(f5)) # 245
注意:math.log函數不能改造偏函數。
import mathlog5 = ft.partial(math.log, base=5) # 注意,針對math.log() 無法實現偏函數,會報錯print(log5(5))
四、練習
1. 定義函數,實現指定內容輸入,函數的參數包含輸出的提示和數值範圍
輸出的內容: 「請輸入 1 到 20 之間的數」,返回輸入的數
2. 輸入一個任一數值,算出它的對數, 基數默認 math.e
3. 指定3個數值,算出最小的值
推薦閱讀:
※【Python3網路爬蟲開發實戰】7.3-Splash負載均衡配置
※閑話yield,async以及await之間的關係
※黃哥Python,又出題了。
※Python Scrapy分散式原理詳解
TAG:Python |