標籤:

Day6-1,函數,匿名函數,偏函數

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 |