溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python 函數(shù) —— 定義,參數(shù),參數(shù)解構(gòu)

發(fā)布時(shí)間:2020-06-25 19:11:59 來源:網(wǎng)絡(luò) 閱讀:1092 作者:AiSmile 欄目:編程語言

函數(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



向AI問一下細(xì)節(jié)

免責(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)容。

AI