(D09)Python-函式的傳參
阿新 • • 發佈:2018-12-08
Python-函式的傳參
函式的傳參(把資料傳給函式)
函式的形參(接收函式呼叫的資料)
Python函式的引數傳遞
- 傳遞方式
- 位置傳遞
- 序列傳參
- 關鍵字傳參
- 字典關鍵字傳參
下面是函式的實參傳遞:
位置傳參:
- 實際引數(實參) 的對應關係與形式引數的對應關係是按位置來一次對應的
- 說明:
- 實參和形參通過位置進行傳遞和匹配
- 實參的個數 必須與形參的個數相同
示例:
# 此示例示意位置傳參 def myfun(a, b, c): '''這是一個函式傳參的示例''' print('a的值是:', a) print('b的值是:', b) print('c的值是:', c) myfun(1, 2, 3) myfun(4, 5, 6) myfun("ABC", [1,2,3], (44,55,66))
序列傳參:
- 序列傳參是指函式在呼叫過程中用*將序列拆解後按位置進行傳遞的傳參方式
- 說明:
- 序列傳參時,序列拆解的位置將於形參一一對應
示例:
# 此示例示意 序列傳參 def myfun(a, b, c): '''這是一個函式傳參的示例''' print('a的值是:', a) print('b的值是:', b) print('c的值是:', c) L = [11, 22, 33] # myfun(L[0], L[1], L[2]) myfun(*L) # myfun(L) `` **關鍵字傳參:** - 關鍵字傳參是指傳參時,按著形參名稱給形參賦值,實參和形參按名稱匹配 - 說明: - 可以不按位置進行匹配 **示例:**
此示例示意 關鍵字傳參
def myfun(a, b, c):
‘’‘這是一個函式傳參的示例’’’
print(‘a的值是:’, a)
print(‘b的值是:’, b)
print(‘c的值是:’, c)
myfun(c=33, b=22, a=11)
myfun(b=222, c=333, a=111)
``
字典關鍵字傳參:
- 是指實參為字典,將字典用** 拆解後進行關鍵字傳參的傳遞方式
- 說明:
- 字典的鍵名和形參名必須一致
- 字典的鍵名必須為合法的標示符命名規則的字串
- 字典的鍵名要在形參中存在
示例:
# 此示例示意 字典關鍵字傳參
def myfun(a, b, c):
'''這是一個函式傳參的示例'''
print('a的值是:', a)
print('b的值是:', b)
print('c的值是:', c)
d = {'a':100, 'c':300, 'b':200}
# myfun(a=d['a'], c=d['c'], b=d['b'])
myfun(**d) # 等同於上面一條語句
# myfun(d) # 出錯
函式的綜合傳參
- 函式的傳參方式在能確定形參能唯一匹配到相應實參的情
況下可以任意組合 - 函式的位置傳參要先於關鍵字傳參
示例:
def myfun(a, b, c):
pass
myfun(100, *[200, 300])
myfun(100, *"BC")
myfun(*"AB", 300)
myfun(*[100], 200, *[300])
myfun(100, c=300,b=200)
myfun(a=100, 200, c=300) # 錯誤的
myfun(100, **{'c':300, 'b':200})
myfun(100, **{'c':300}, b=200)
myfun(100, b=200, **{'c':300})
下面是函式的形參:
函式的預設引數
- 語法:
- def 函式名(形參名1=預設實參1, 形參名2=預設實參2,
形參名3=預設實參3, …)
- def 函式名(形參名1=預設實參1, 形參名2=預設實參2,
- 作用:
- 讓函式的呼叫者少傳遞引數來呼叫函式
- 說明:
- 預設引數必須自右至左依次存在,如果一個引數有預設
引數, 則其右側的所有引數都必須有預設引數 - 預設引數可以有0個,1個或多個,甚至全部都有預設引數
- 預設引數必須自右至左依次存在,如果一個引數有預設
示例:
如:
def fn(a, b=10, c): # 錯誤
pass
def fn(a=0, b=None, c=False): # 是這對的
pass
函式的可變實參和不可變實參的傳遞
- 說明:
- 當一個可變物件通過函式實參傳入函式內時,在函式內
可以通過區域性變數來操作可變物件(列表,字典,集合…)
- 當一個可變物件通過函式實參傳入函式內時,在函式內
面試題:
- 試執行以下程式的結果是什麼, 為什麼?
L = [1, 2]
def fn(a, lst=[]):
lst.append(a)
print(lst)
fn(3, L) # [1, 2, 3]
fn(4, L) # [1, 2, 3, 4]
fn(5) # [5]
fn(6) # [5, 6]
fn(7) # [5, 6, 7]
函式形參的定義方式
- 位置形參
- 星號元組形參
- 命名關鍵字形參
- 雙星號字典形參
位置形參:
- 語法:
- def 函式名(形參變數1, 形參變數2, …):
- 語句塊
- def 函式名(形參變數1, 形參變數2, …):
星號元組形參
語法:
- def 函式名(*元組形參名):
- 語句塊
作用:
- 收集多餘的位置傳參
說明:
- 元組形參名一般命名為’args’
- *元組形參一個函式只能有一個
命名關鍵字形參
語法:
- def 函式名(*,命名關鍵字形參1, 命名關鍵字形參2,…):
- 語句塊
或
- 語句塊
- def 函式名(*args,命名關鍵字形參1, 命名關鍵字形參2,…):
- 語句塊
作用:
- 強制所有的命名關鍵字形參都必須用關鍵字傳參或字典關
鍵字傳參
示例:
# 此示例示意命名關鍵字形參
def func(a, b, *, c, d):
print(a, b, c, d)
# func(1, 2, 3, 4) # 傳參失敗
func(1, 2, c=30, d=40)
func(a=10, b=20, c=30, d=40)
func(1, 2, **{'d':400, 'c':300})
雙星號字典形參:
語法:
- def 函式名(**字典形參名):
- 語句塊
作用:
- 收集多餘的關鍵字傳參
說明:
- 字典形參名一般命名為’kwargs’
- 一個函式內字典形參最多隻有一個
示例:
# 此示例示意雙星號字典形參
def func(**kwargs):
print("關鍵字傳參的個數是:", len(kwargs))
print('kwargs=', kwargs)
func(name="張老師", age=35, address="朝陽區")
def func(*,a, b, **kwargs):
print("關鍵字傳參的個數是:", len(kwargs))
print('kwargs=', kwargs)
func(a=1, b=2, c=3, d=4)
函式的形參說明:
- 位置形參,預設引數,星號元組形參,雙星號字典形參可以混
合使用
函式形參自左至右的定義順序為:
- 位置形參
- 星號元組形參
- 命名關鍵字形參
- 雙星號字典形參
示例:
def fn(a, b, *args, c, **kwargs):
pass
fn(1, 2, 3, 4, c=30, d=40, e=50)
函式的不定長引數:
- 有兩種: 星號元組形參,雙星號字典形參
- 用不定長引數可以接收任意的傳參
如:
def fn(*args, **kwargs):
print(args, kwargs)
全域性變數和區域性變數
- 區域性變數
- 定義在函式內部的變數稱為區域性變數(函式的形參也是
區域性變數) - 區域性變數只能在函式內部使用
- 區域性變數在函式呼叫時才能建立,在函式呼叫之後會
自動銷燬
- 定義在函式內部的變數稱為區域性變數(函式的形參也是
- 全域性變數
- 定義在函式外部,模組內部的變數稱為全域性變數
- 全域性變數所有的函式都可以直接訪問(但函式內部不能將
其直接賦值)
說明:
- 函式內部賦值語句不會對全域性變數造成影響