1. 程式人生 > >(D09)Python-函式的傳參

(D09)Python-函式的傳參

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)  # 出錯

函式的綜合傳參

  1. 函式的傳參方式在能確定形參能唯一匹配到相應實參的情
    況下可以任意組合
  2. 函式的位置傳參要先於關鍵字傳參

示例:

    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, …)
  • 作用:
    • 讓函式的呼叫者少傳遞引數來呼叫函式
  • 說明:
    1. 預設引數必須自右至左依次存在,如果一個引數有預設
      引數, 則其右側的所有引數都必須有預設引數
    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 函式名(*元組形參名):
    • 語句塊

作用:

  • 收集多餘的位置傳參

說明:

  • 元組形參名一般命名為’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)

全域性變數和區域性變數

  • 區域性變數
    1. 定義在函式內部的變數稱為區域性變數(函式的形參也是
      區域性變數)
    2. 區域性變數只能在函式內部使用
    3. 區域性變數在函式呼叫時才能建立,在函式呼叫之後會
      自動銷燬
  • 全域性變數
    1. 定義在函式外部,模組內部的變數稱為全域性變數
    2. 全域性變數所有的函式都可以直接訪問(但函式內部不能將
      其直接賦值)

說明:

  • 函式內部賦值語句不會對全域性變數造成影響