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