python3 之 函數傳參


一、可變對象與不可變對象

  在 python 中,strings, tuples, 和 numbers 是不可更改的對象,而 list,dict 等則是可以修改的對象。

不可變類型:變量賦值 a=5 后再賦值 a=10,這里實際是新生成一個 int 值對象 10,再讓 a 指向它,而 5 被丟棄,不是改變a的值,相當於新生成了a。
可變類型:變量賦值 la=[1,2,3,4] 后再賦值 la[2]=5 則是將 list la 的第三個元素值更改,本身la沒有動,只是其內部的一部分值被修改了。

python 函數的參數傳遞:

不可變類型:類似 c++ 的值傳遞,如 整數、字符串、元組。如fun(a),傳遞的只是a的值,沒有影響a對象本身。比如在 fun(a)內部修改 a 的值,
只是修改另一個復制的對象,不會影響 a 本身。

可變類型:類似 c++ 的引用傳遞,如 列表,字典。如 fun(la),則是將 la 真正的傳過去,修改后fun外部的la也會受影響

二、傳遞不可變對象
1 def ChangeInt( a ):
2     a = 10
3 
4 b = 2
5 ChangeInt(b)
6 print( b )
7 
8 # 2

三、傳遞可變對象

 1 def changeme(mylist):
 2     "修改傳入的列表"
 3     mylist.append([1, 2, 3, 4])
 4     print("函數內取值: ", mylist)
 5     return
 6 
 7 # 調用changeme函數
 8 mylist = [10, 20, 30]
 9 changeme(mylist)
10 print("函數外取值: ", mylist)
11 
12 # 函數內取值:  [10, 20, 30, [1, 2, 3, 4]]
13 # 函數外取值:  [10, 20, 30, [1, 2, 3, 4]]

四、必須參數

 必須參數:
   必需參數須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣。
   調用printme()函數,你必須傳入一個參數,不然會出現語法錯誤:
# 錯誤示范
def printme(str):
    "打印任何傳入的字符串"
    print(str)
    return

# 調用printme函數
printme()

# TypeError: printme() missing 1 required positional argument: 'str'

五、關鍵字參數

 關鍵字參數:
   關鍵字參數和函數調用關系緊密,函數調用使用關鍵字參數來確定傳入的參數值。
   使用關鍵字參數允許函數調用時參數的順序與聲明時不一致,因為 Python 解釋器能夠用參數名匹配參數值。
   以下實例在函數 printme() 調用時使用參數名:
#實例1:
def printme(str):
    "打印任何傳入的字符串"
    print(str)
    return

# 調用printme函數
printme(str="耿雨飛")

# 耿雨飛

#實例2:
# 以下實例中演示了函數參數的使用不需要使用指定順序:

def printinfo(name, age):
    "打印任何傳入的字符串"
    print("名字: ", name)
    print("年齡: ", age)
    return


# 調用printinfo函數
printinfo(age=50, name="耿雨飛")

# 名字:  耿雨飛
# 年齡:  50

六、默認參數

 默認參數:
   調用函數時,如果沒有傳遞參數,則會使用默認參數。以下實例中如果沒有傳入 age 參數,則使用默認值:
def printinfo(name, age=35):
    "打印任何傳入的字符串"
    print("名字: ", name)
    print("年齡: ", age)
    return
# 調用printinfo函數
printinfo(age=50, name="耿雨飛")
print("------------------------")
printinfo(name="耿雨飛")

# 名字:  耿雨飛
# 年齡:  50
# ------------------------
# 名字:  耿雨飛
# 年齡:  35

七、單星號元祖形參

 不定長參數:
   你可能需要一個函數能處理比當初聲明時更多的參數。這些參數叫做不定長參數,和上述 3 種參數不同,聲明時不會命名。
   加了星號 * 的參數會以元組(tuple)的形式導入,存放所有未命名的變量參數。
def printinfo(arg1, *vartuple):
    "打印任何傳入的參數"
    print("輸出: ")
    print(arg1)
    print(vartuple)

# 調用printinfo 函數
printinfo(70, 60, 50)

# 輸出:
# 70
# (60, 50)

#實例2: 如果在函數調用時沒有指定參數,它就是一個空元組。我們也可以不向函數傳遞未命名的變量。如下實例:

def printinfo(arg1, *vartuple):
    "打印任何傳入的參數"
    print("輸出: ")
    print(arg1)
    for var in vartuple:
        print(var)
    return

# 調用printinfo 函數
printinfo(10)
printinfo(70, 60, 50)

# 輸出:
# 10
# 輸出:
# 70
# 60
# 50

八、雙星號字典形參

參數:加了2個**,以字典的形式導入
 1 def printinfo(arg1, **vardict):
 2     "打印任何傳入的參數"
 3     print("輸出: ")
 4     print(arg1)
 5     print(vardict)
 6 
 7 
 8 # 調用printinfo 函數
 9 printinfo(1, a=2, b=3)
10 
11 # 輸出:
12 # 1
13 # {'a': 2, 'b': 3}

九、星號參數:

注意事項:

 1 #聲明函數時,參數中星號 * 可以單獨出現,例如:
 2 
 3 def f(a,b,*,c):
 4     return a+b+c
 5 
 6 # 如果單獨出現星號 * 后的參數必須用關鍵字傳入,否則會報錯。
 7 
 8 def f(a,b,*,c):
 9     return a+b+c
10 
11 f(1,2,3)   # 報錯
12 
13 # -------------------------------------------------------------------------
14 # Traceback (most recent call last):
15 #   File "<stdin>", line 1, in <module>
16 # TypeError: f() takes 2 positional arguments but 3 were given
17 
18 def f(a,b,*,c):
19     return a+b+c
20 
21 f(1,2,c=3) # 正常
22 # -----------------------------------
23 # 6

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM