您好,登錄后才能下訂單哦!
函數(shù)
函數(shù)
數(shù)學(xué)定義:y = f(x), y是x的函數(shù),x是自變量。 y = f(x0,x1,x2,...,xn)
python函數(shù):
- 由 若干語句組成的語句塊、函數(shù)名稱、參數(shù)列表 構(gòu)成,它是組織代碼的最小單元
- 完成一定的功能
函數(shù)的作用
1.結(jié)構(gòu)化編程對(duì)代碼的最基本的封裝,一般按照功能組織一段代碼
2.封裝的目的是為了復(fù)用,減少沉余代碼
3.代碼更加簡潔美觀,可讀易懂
函數(shù)的分類
內(nèi)建函數(shù): 如 max(),reverse()等
庫函數(shù): 如 math.ceil()等
自定義函數(shù):
函數(shù)的定義,調(diào)用
def 語句定義函數(shù)
def 函數(shù)名(參數(shù)列表):
函數(shù)體(代碼塊)
[ return 返回值]
- 函數(shù)名就是標(biāo)識(shí)符,命名要求跟標(biāo)識(shí)符一樣
- 語句塊必須縮進(jìn),約定4個(gè)空格
- python的函數(shù)沒有return時(shí),隱式會(huì)返回一個(gè)None值
- 定義中的參數(shù)列表成為形式參數(shù),只是一種符號(hào)表達(dá),簡稱形參(類似于一種占位符)
函數(shù)調(diào)用
1.函數(shù)定義 只是聲明了一個(gè)函數(shù),它不會(huì)被執(zhí)行,需要調(diào)用
2.調(diào)用的方式,就是函數(shù)名加上(),括號(hào)內(nèi)寫上參數(shù)
3.調(diào)用時(shí)寫得參數(shù)是實(shí)際參數(shù),是實(shí)實(shí)在在傳入的值,簡稱實(shí)參
函數(shù)舉例
def add(x, y): result = x + y return result out = add(4,5) print(out)
上面只是一個(gè)函數(shù)的定義,有一個(gè)函數(shù)叫做add,接收2 個(gè)參數(shù)
計(jì)算的結(jié)果,通過返回值返回
調(diào)用通過函數(shù)名add加2 個(gè)參數(shù),返回值可使用變量接收
定義需要在調(diào)用錢,也就是說調(diào)用時(shí),已經(jīng)被定義過了,否則拋出Name Errory異常
函數(shù)式可調(diào)用的對(duì)象,callable()
函數(shù)參數(shù)
參數(shù)調(diào)用時(shí)傳入的參數(shù)要和定義的個(gè)數(shù)相匹配(可變參數(shù)例外)
位置參數(shù):
def f(x,y,z) 調(diào)用使用 f(1,3,5)
按照參數(shù)定義順序傳入實(shí)參
關(guān)鍵字參數(shù)
def f(x, y ,z) 調(diào)用使用 f(x =1, y = 3, z = 4)
使用形參的名字來傳入實(shí)參的方式,如果使用了形參名字,那么傳參順序就可以和定義順序不同
傳參
要求位置參數(shù)必須在關(guān)鍵字參數(shù)之前傳入,位置參數(shù)是按位置對(duì)應(yīng)的
函數(shù)參數(shù)默認(rèn)值
參數(shù)默認(rèn)值(缺省值)
定義時(shí),在形參后面跟上一個(gè)值
def add(x = 4, y = 5): return x + y
作用
1.參數(shù)的默認(rèn)值可以在未傳入足夠的實(shí)參的時(shí)候,對(duì)沒有給定的參數(shù)復(fù)制為默認(rèn)值
2.參數(shù)非常多的時(shí)候,并不需要用戶每次都輸入所有的參數(shù),簡化函數(shù)調(diào)用
舉例:
定義一個(gè)函數(shù)login,參數(shù)名稱為 host、port、username、password
def login(host = "127.0.0.1",port="8080",username="123",password = "123"): print('{}:{}@{}/{}'.format(host,port,username,password)) login() login('127.0.0.1',80,"tom",'tom') login('127.0.0.1' ,username = 'root') login('localhost',port=80,password='com') login(port=80,password='123',host='www')
可變參數(shù)
問題:有多個(gè)數(shù),需要累加求和
def add(nums): sum = 0 for x in nums: sum += x return sum add([1,3,5])、add((2,4,6))
傳入一個(gè)可迭代對(duì)象,迭代元素求和
可變參數(shù)
一個(gè)形參可以匹配的任意個(gè)參數(shù)
位置參數(shù)的可變參數(shù)書:
有多個(gè)數(shù),需要累加求和:
def add(*nums): sum = 0 print(type(nums)) for x in nums: sum += x print(sum) add(3,6,9) #調(diào)用 執(zhí)行結(jié)果:<class 'tuple'> 18
1.在形參前使用 * 表示該形參是可變參數(shù),可以接收多個(gè)實(shí)參
2.收集多個(gè)實(shí)參形成一個(gè)tule
關(guān)鍵字參數(shù)的可變參數(shù):
配置信息打印
def showconfig(**kwargs): print(kwargs) for k,v in kwargs.item(): print('{} = {}'.format(k,v)) showconfig(host = '127.0.0.1',port ="8080",username= '123',password='123') 執(zhí)行結(jié)果:<class 'dict'> {'host': '127.0.0.1', 'port': '8080', 'username': '123', 'password': '123'} host = 127.0.0.1 port = 8080 username = 123 password = 123
1.形參前使用**符號(hào),表示看可以接收多個(gè)關(guān)鍵字參數(shù)
2.收集的實(shí)參名稱和值收集 形成一個(gè)字典
可變參數(shù)混合使用
總結(jié)
1.有位置可變參數(shù)和關(guān)鍵字可變參數(shù)
2.位置可變參數(shù)在形參前使用 一個(gè)星號(hào) *
3.關(guān)鍵字可變參數(shù)在形參前面使用 兩個(gè)星號(hào) **
4.位置可變參數(shù)和關(guān)鍵字可變參數(shù)都可以收集果干個(gè)實(shí)參,位置可變參數(shù)收集成一個(gè) tuple ,關(guān)鍵字可變參數(shù)收集形成一個(gè)dict
舉例:
def fn(x,y,*args,**kwargs): print(x,y) print(args) print(kwargs) fn(3,5,9,10,a=1,b='python') -> OK fn(3,5)-> OK fn(3,5,7)-> OK fn(3,5,a=1,b='python')-> OK fn(7,9,y=5,x=3,b='python') -> NG # 錯(cuò)誤,7和9分別賦給了x ,y,又y=5,x=3,重復(fù)了
舉例
def fn(*args,x,y,**kwargs): print(x,y) print(args) print(kwargs) fn(3,5,9,10,a=1,b='python') -> NG fn(3,5)-> NG fn(3,5,7)-> NG fn(3,5,a=1,b='python') -> NG fn(7,9,y=5,x=3,b='python')-> Ok
keyword-only 參數(shù)
keyword-only參數(shù)(python3加入)
如果在一個(gè)星號(hào)參數(shù)后,或者一個(gè)位置可變參數(shù)后,出現(xiàn)的普通參數(shù),實(shí)際上已經(jīng)不是普通的參數(shù)了,而是keyword-only參數(shù)
def fn(*args,x): print(x) print(args) fn(3,5)-> NG fn(3,5,7)-> NG fn(3,5,x=7)-> OK
args可以看做已經(jīng)接活了所有的位置參數(shù),x不適用關(guān)鍵字參數(shù)就不可能拿到實(shí)參
思考:def fn(**kwargs,x)可以嘛???
舉例:
def fn(**kwargs,x): print(x) print(kwargs)
直接報(bào)語法錯(cuò)誤:
可以理解為kewargs會(huì)接貨所有的關(guān)鍵字參數(shù),就算寫了x=5,x也永遠(yuǎn)得不到這個(gè)值,所以語法錯(cuò)誤
keyword-only參數(shù)的另一種形式
def fn(* , x,y): print(x,y) fn(x=5,y=6)
*號(hào)之后,普通的形參都變成了必須給出的keyword-only參數(shù)
可變參數(shù)和參數(shù)默認(rèn)值
舉例:
def fn(*args,x=5): print(x) print(args) fn() -> OK fn(5)-> OK fn(x=6)->Ok fn(1,2,3,x=10)->Ok
舉例:
def fn(y,*args,x=5): print('x = {},y={}'.format(x,y)) fn()-> NG fn(5) -> OK fn(x=6) -> NG fn(1,2,3,x = 10) -> Ok fn(y = 17,2,3,x =10) -> NG # 位置傳參放在了keyword傳參后面了,要注意 fn(1,2,y=3,x=10) -> NG y傳參重復(fù)了
x 是keyword-only參數(shù)
舉例:
def fn(x=5,**kwargs): print('x = {}'.format(x)) print(kwargs) fn()-> OK fn(5)-> OK fn(x=6)-> OK fn(y=3,x=10)-> OK fn(3,y=10)-> OK
函數(shù)參數(shù)
參數(shù)規(guī)則
參數(shù)列表參數(shù)一般順序:
普通參數(shù) -> 缺省參數(shù) -> 可變位置參數(shù) -> keyword-only參數(shù)(可帶缺省值) -> 可變關(guān)鍵字參數(shù)
def fn(x,y,*args,m=4,n,**keargs): print(x,y,m,n) print(args) print(kwargs)
參數(shù)規(guī)則舉例:
def connect(host='localhost',port='3306',user='admin',password='admin',**kwargs): print(host,port) print(user,password) print(kwargs) connect(db='cmdb') connect(host='192.168.1.123',db='cmdb') connect(host='192.168.1.123',db='cmdb',password='mysql')
參數(shù)解構(gòu)
舉例:
加法函數(shù)
def add(x,y): return x + y add(4,5) add((4,5)) t = (4,5) add(t[0],t[1]) add(*t) 或 add(*(4,5))add(*[4,5])add(*{4,6}) add(*range(1,3))
參數(shù)解構(gòu):
1.給函數(shù)提供實(shí)參的時(shí)候,可以在集合類型前使用 * 或者 **, 把集合類型的結(jié)構(gòu)解開,提取所有元素作為函數(shù)的實(shí)參
2.非字典類型使用 * 解構(gòu)成 位置參數(shù)
3.字典類型使用 ** 解構(gòu)成 關(guān)鍵字參數(shù)
4.提取出來的元素?cái)?shù)目要和參數(shù)的要求匹配,也要和參數(shù)的類型匹配
def add(x,y): return x+y add(*(4,5))add(*[4,5])add(*{4,5})-> OK d = {'x':5,'y':6} add(**d)-> OK add(**{'a':5,'b':6})-> 解構(gòu)后為 (a=5, b=6) 沒有x,y NGadd(*{'a':5,'b':6}) -> 解構(gòu)后 ('a' ,'b') OK
參數(shù)解構(gòu) 和 可變參數(shù)
給函數(shù)提供實(shí)參的時(shí)候,可以在集合類型前使用* 或者 **,把集合類型的結(jié)構(gòu)解開,提取出所有元素作為函數(shù)的實(shí)參
def add(*iteable): result = 0 for x in iterable: result += x return result add(1,2,3)-> OK add(*[1,2,3])-> OK add(*range(10))-> OK add(range(10))-> NG
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。