python中的函數(二)

1,關鍵字參數
如果參數過多,不確定參數的順序,可以使用關鍵字參數傳遞數據,避免誤傳數據。

代碼示例:

def persion(name, age):
    print(name)
    print(age)

# 位置參數,最常見的參數傳遞形式
persion("張三", 34)
# 關鍵字參數,將數據傳給指定的參數,避免數據誤傳
persion(name="張三", age="34")
# 第一個不指定,第二個指定,這樣的形式是可以的
persion("張三", age="34")
# 這種形式報錯
# persion(name="張三", 34)
console:
張三
34
張三
34
張三
34

注:
函數的第一個參數不指定關鍵字,後面的參數依然可以使用關鍵字參數,但當函數的第一個參數使用了關鍵字參數時,後面的其他參數就必須要使用關鍵字參數來傳遞數據。


2,命名關鍵字參數
強制控制明明關鍵字的個數(python3新增的)

代碼示例:

# 星號表示後面的參數都必須使用命名關鍵字參數來傳值
def func(name, age, *, weight, position):
    print(name)
    print(age)
    print(weight)
    print(position)
# 這樣傳值會出錯
#func("李四", 45, 69, "china")
# 正確的傳值方法,即使順序顛倒也不會出錯
func("李四", 45, position="china", weight=69)
console:
李四
45
69
china

注:
使用命名關鍵字會使代碼的可讀性好,簡潔明瞭,不會出錯。


3,缺省參數
在形參中默認有值的參數,稱之爲缺省參數(默認參數)
調用函數時,缺省參數的值如果沒有傳入,則取默認值。
代碼示例:

# 創建函數時,默認參數寫在位置參數後面
def infor(name="abc", age=45):
    print(name)
    print(age)

# 這裏不設置任何參數
infor()
print("= "*10)
# 這裏的實際參數替換了默認參數
infor("張三",)
print("= "*10)
# 這裏把34傳給了默認參數
infor(34)
# 這裏將兩個默認參數都替換掉
print("= "*10)
infor("王五", 78)

注意:
帶有默認值的參數一定要位於參數列表的最後面。

3,1 缺省參數的坑
默認參數在定義時,一定要指向不可變數據類型。
示例:

# 這裏聲明瞭一個函數的缺省參數
def add(list=[]):
    list.append(100)
    print(list)

# 三次調用
add()
add()
add()
console:
[100]
[100, 100]
[100, 100, 100]

注:
原因在於我們在設置缺省參數時,將其設置爲可變數據類型,調用時,得到的不是我們想要的原生的空列表,而是在上一次的操作後得到的值,

調整一下:

# 這裏依然設置了一個函數的缺省值
def adda(list=None):
    # 這裏是一個初始化的操作
    if list == None:
        list = []
    list.append(100)
    print(list)

adda()
adda()
adda()
console:
[100]
[100]
[100]

注:
在這個函數中,每一次的調用都會判斷,然後將函數的缺省值初始化,保證與之前的調用無關聯。


3,不定長參數
有時可能需要一個函數能處理比當初聲明時更多的參數, 這些參數叫做不定長參數(即:可變參數),聲明時不會命名。

3,1 *age
可變參數的第一種形式
加了星號(*)的變量args會存放所有未命名的變量參數,args爲元組

代碼示例:

# *age會把傳進來的多個實參放入一個元祖中
def func(*age):
    print(age)
    print(type(age))
    # 分別取出每一個實參
    for i in age:
        print(i)

# 調用函數時,傳入了多個參數
func("李四", 45, "china")
console:
('李四', 45, 'china')
<class 'tuple'>
李四
45
china

注:*變量名可以將傳入的實參放入元祖中,可以通過遍歷取出每一個實參。

3,2 **kwargs
可變參數的第二種形式
加了兩個星號(**)的變量kwargs會存放所有的命名參數,即形如key=value的參數, kwargs爲字典。

# **kwargs會把傳進來的多個命名參數放入一個字典中
def func(**kwargs):
    print(kwargs)
    print(type(kwargs))
    for key, value in kwargs.items():
        print(key, value)

# 調用函數時,傳入了多個參數
func(name="李四", age=45, weight=69, position="china")
console:
{'name': '李四', 'age': 45, 'weight': 69, 'position': 'china'}
<class 'dict'>
name 李四
age 45
weight 69
position china

注:
**變量名可以將傳入的實參放入字典中,可以通過遍歷取出每一個實參。

3,3可變參數的混合使用

代碼示例1:

# 可變參數的混合使用
def func(a, b=2, c=3, *age, **kwargs):
    print(a)
    print(b)
    print(age)
    print(kwargs)
func(100, 200, 300, 400, 500, 600, pi=3.14, e=2.718)
# 這樣的形式會報錯,命名參數必須要寫在最後
func(100, b=200, c=300, 400, 500, 600, pi=3.14, e=2.718)

注:
由於**kwargs是收集所有的命名參數,所以在函數的形參列表中只要有**kwargs,調用函數傳遞參數時,實參列表中的命名參數必須要寫在最後。

代碼示例2:
未完待續。。。。。。

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