08函數-參數

1.函數簡介

  • 函數也是一個對象
  • 函數用來保存一些可執行的代碼,在需要時可以重複調用
# 函數中保存的代碼不會立即執行,需要調用
'''
語法:
def fn(形參1,形參2...):
    代碼塊
'''
def fn():
    print('這是第一個函數')
# print(fn)   # <function fn at 0x0000000002882730>
fn()    # 這是第一個函數
# fn是函數對象,fn()是函數調用
  • 注意:函數名必須符合標識符命名規範(可以包含字母、數字、下劃線,但不能以數字開頭)

2.函數的參數

2.1形參和實參

  • 形參(形式參數)定義形參就相當於在函數內部聲明瞭變量,但是並不賦值
  • 實參(實際參數)指定了形參,在調用函數時必須傳遞實參,實參將會給形參賦值,實參與形參數量應保持相同
# 定義一個函數可以用來求任意兩個數的和
'''
賦值——是調用時賦值,或者定義時賦值
可以在定義函數時,在括號裏面定義數量不等的形參
函數定義時有形參,調用時也得有實參否則報錯
'''
def s(a,b):

    print(a+b)
s(5,6)  # 11
# s() # TypeError: s() missing 2 required positional arguments: 'a' and 'b'

2.2函數的傳遞方式

  • 默認值——定義形參時,可以爲形參指定默認值,但是若調用時有實參,則默認值被覆蓋
  • 位置傳參——將對應位置的實參賦值給對應位置的形參
  • 關鍵字傳參——可以不按照形參的位置傳遞參數,只要是按照形參的名稱對應賦值即可
  • 混合使用位置參數與關鍵字參數——位置參數必須在關鍵字參數之前
'''
默認值,c=10這個默認值,如果函數調用時另外傳遞實參,則不調用默認值,調用實參
如果函數調用時不傳遞這個實參,則調用默認值
即不傳遞實參,默認值生效
'''
'''
參數的傳遞方式
位置傳參
關鍵字傳參
'''
# 位置參數:將對應位置的實參賦值給對應位置的形參
# 形如:fn(1,2,3)——>fn(a,b,c)
def fn( a, b, c=10):
    print('a =', a)
    print('b =', b)
    print('c =', c)
fn(4, 5, 6)
# 結果是:
# a = 4
# b = 5
# c = 6
fn(4, 5)
# 結果是:
# a = 4
# b = 5
# c = 10

# 關鍵字傳參:不根據形參定義的順序,而是根據形參名字來進行傳參
# 形如:fn(b=4, c=5, a=6)——>fn(a,b,c)

fn(b=4, c=5, a=6)
# 結果是:
# a = 6
# b = 4
# c = 5
# 位置傳參和關鍵字傳參可以混合使用,並且關鍵字必須在後邊
fn(1, 2, c=30)
# 結果是:
# a = 1
# b = 2
# c = 30
# fn(c=30, 1, 2)  #  SyntaxError: positional argument follows keyword argument
# fn(a=10, 2, 3)   #  SyntaxError: positional argument follows keyword argument

'''
原理:形參和實參,位置傳參和關鍵字傳參
舉例:
import requests
headers={}
url=''
requests.request(url, headers=headers)
'''

3.不定長參數

  • 用於位置傳參的*args,在定義函數時,在一個形參前加上*,則這個形參可以獲取多個實參(多個實參存入元組中),
  • 帶*的形參可以和關鍵字傳參配合使用,但是隻能有一個
  • 帶*的形參不能處理關鍵字傳參,關鍵字傳參可以用帶**的形參
  • 用於關鍵字傳參的 **kwargs,獲取的多個實參是存入字典中,key=關鍵字傳參中的實參名,value=關鍵字傳參中的實參值
  • 帶**的形參只能有一個,必須寫在最後
  • 裝包–存入元組或字典
  • 解包–遍歷元組或字典
# 求任意個數的和

def fn(a,b):
    print(a+b)
fn(1, 2) # 3
'''
裝包:
通過*b的形式傳遞位置參數,將所有實參存入元組b中
'''
def fn1(*b):
    print('b =', b, type(b))
fn1(1,2,3,4,5)      # b = (1, 2, 3, 4, 5) <class 'tuple'>
'''
解包:
遍歷(通過*b存入元組中b)已經裝包的實參,即遍歷一個元組
'''
# 求任意個數的和
def s(*b):
    r=0 # 用來存儲計算結果
    for i in b:
        r+=i
    print(b,'各元素累加結果爲:', r)
s(1,3,54,6,6)   # (1, 3, 54, 6, 6) 各元素累加結果爲: 70
'''
可以有多個參數,剩餘元素統一裝入*b
*b此類參數只能有一個
若*b不是最後一個參數,其後的參數必須使用關鍵字傳參
*b形參,當實參都是關鍵字傳參時,錯誤
**b將關鍵字實參裝包人字典
即*形參不接收關鍵字參數,處理位置參數,**形參可以接收關鍵字參數,並處理
'''
def fn2(a,b,*c):
    print('a =', a)
    print('b =', b)
    print('c =', c)
fn2(1,3,4,6,7,8,8)
# 結果爲:
# a = 1
# b = 3
# c = (4, 6, 7, 8, 8)
# *b不在最後位置,其後參數使用關鍵字傳參
def fn3(a,*b,c):
    print('a =', a)
    print('b =', b)
    print('c =', c)
# fn3(1,3,4,6,7,8,8)  #  TypeError: fn3() missing 1 required keyword-only argument: 'c'
fn3(1,3,4,6,7,8,c=8)
# 結果是:
# a = 1
# b = (3, 4, 6, 7, 8)
# c = 8
# *b形參,當實參都是關鍵字傳參時,錯誤
# fn3(a=1,b=3,c=8)    #TypeError: fn3() got an unexpected keyword argument 'b'
# **b將關鍵字實參裝包人字典
def fn4(**b):
    print('b =', b, type(b))
fn4(a=1,b=2,c=3)    # b = {'a': 1, 'b': 2, 'c': 3} <class 'dict'>
def s1(a,c,**b):
    print('a =', a)
    print('b =', b)
    print('c =', c)
s1(c=3,b=6,d=0,e=5,a=1,f=8)
# 結果是:
# a = 1
# b = {'b': 6, 'd': 0, 'e': 5, 'f': 8}
# c = 3
s1(1,2,b=6,d=0,e=5)
# 結果是:
# a = 1
# b = {'b': 6, 'd': 0, 'e': 5}
# c = 2
'''
正規的寫法:*args,**kwargs
def fn(*args,**kwargs):
    語句塊
'''

4.參數的解包

  • 用於位置傳參的*args在裝包解包過程是通過元組、列表
  • 用於關鍵字傳參的 **kwargs在裝包解包過程是通過字典
'''
參數t爲元組、列表時通過*t可以將t中的元素依次賦值給函數中的形參,元素個數與形參個數必須一致
參數t爲字典時通過**t可以將t中的k-v中的value值依次賦值給函數中的形參,k-v個數與形參個數必須一致
'''
def fn(a,b,c):
    print('a =', a)
    print('b =', b)
    print('c =', c)
# t=[1,2,3]
t={'a':1, 'b':2, 'c':3}
print(type(t))
# fn(t[0],t[1],t[2])
# fn(*t)
fn(**t)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章