Python 函數 —— 定義,參數,參數解構

函數

函數

    數學定義: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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章