Python 函式 引數傳遞
阿新 • • 發佈:2018-12-06
引數傳遞
在 python 中,型別屬於物件,變數是沒有型別的:
a=[1,2,3]
a="Runoob"
以上程式碼中,[1,2,3] 是 List 型別,"Runoob" 是 String 型別,而變數 a 是沒有型別,她僅僅是一個物件的引用(一個指標),可以是指向 List 型別物件,也可以是指向 String 型別物件。
可更改(mutable)與不可更改(immutable)物件
在 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(la),則是將 la 真正的傳過去,修改後fun外部的la也會受影響
python 中一切都是物件,嚴格意義我們不能說值傳遞還是引用傳遞,我們應該說傳不可變物件和傳可變物件。
python 傳不可變物件例項
#!/usr/bin/python3
def ChangeInt( a ):
a = 10
b = 2
ChangeInt(b)
print( b ) # 結果是 2
例項中有 int 物件 2,指向它的變數是 b,在傳遞給 ChangeInt 函式時,按傳值的方式複製了變數 b,a 和 b 都指向了同一個 Int 物件,在 a=10 時,則新生成一個 int 值物件 10,並讓 a 指向它。
傳可變物件例項
可變物件在函式裡修改了引數,那麼在呼叫這個函式的函式裡,原始的引數也被改變了。例如:
#!/usr/bin/python3
# 可寫函式說明
def changeme( mylist ):
"修改傳入的列表"
mylist.append([1,2,3,4])
print ("函式內取值: ", mylist)
return
# 呼叫changeme函式
mylist = [10,20,30]
changeme( mylist )
print ("函式外取值: ", mylist)
傳入函式的和在末尾新增新內容的物件用的是同一個引用。故輸出結果如下:
函式內取值: [10, 20, 30, [1, 2, 3, 4]]
函式外取值: [10, 20, 30, [1, 2, 3, 4]]
引數
以下是呼叫函式時可使用的正式引數型別:
必需引數
關鍵字引數
預設引數
不定長引數
必需引數
必需引數須以正確的順序傳入函式。呼叫時的數量必須和宣告時的一樣。
呼叫printme()函式,你必須傳入一個引數,不然會出現語法錯誤:
#!/usr/bin/python3
#可寫函式說明
def printme( str ):
"列印任何傳入的字串"
print (str)
return
#呼叫printme函式
printme()
以上例項輸出結果:
Traceback (most recent call last):
File "test.py", line 10, in <module>
printme()
TypeError: printme() missing 1 required positional argument: 'str'
關鍵字引數
關鍵字引數和函式呼叫關係緊密,函式呼叫使用關鍵字引數來確定傳入的引數值。
使用關鍵字引數允許函式呼叫時引數的順序與宣告時不一致,因為 Python 直譯器能夠用引數名匹配引數值。
以下例項在函式 printme() 呼叫時使用引數名:
#!/usr/bin/python3
#可寫函式說明
def printme( str ):
"列印任何傳入的字串"
print (str)
return
#呼叫printme函式
printme( str = "菜鳥教程")
以上例項輸出結果:
菜鳥教程
以下例項中演示了函式引數的使用不需要使用指定順序:
#!/usr/bin/python3
#可寫函式說明
def printinfo( name, age ):
"列印任何傳入的字串"
print ("名字: ", name)
print ("年齡: ", age)
return
#呼叫printinfo函式
printinfo( age=50, name="runoob" )
以上例項輸出結果
名字: runoob
年齡: 50
預設引數
呼叫函式時,如果沒有傳遞引數,則會使用預設引數。以下例項中如果沒有傳入 age 引數,則使用預設值:
#!/usr/bin/python3
#可寫函式說明
def printinfo( name, age = 35 ):
"列印任何傳入的字串"
print ("名字: ", name)
print ("年齡: ", age)
return
#呼叫printinfo函式
printinfo( age=50, name="runoob" )
print ("------------------------")
printinfo( name="runoob" )
以上例項輸出結果:
名字: runoob
年齡: 50
------------------------
名字: runoob
年齡: 35
不定長引數
你可能需要一個函式能處理比當初宣告時更多的引數。這些引數叫做不定長引數,和上述2種引數不同,宣告時不會命名。基本語法如下:
def functionname([formal_args,] *var_args_tuple ):
"函式_文件字串"
function_suite
return [expression]
加了星號(*)的變數名會存放所有未命名的變數引數。如果在函式呼叫時沒有指定引數,它就是一個空元組。我們也可以不向函式傳遞未命名的變數。如下例項:
#!/usr/bin/python3
# 可寫函式說明
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
宣告函式時,引數中星號(*)可以單獨出現,例如:
def f(a,b,*,c):
return a+b+c
用法:星號(*)後的引數必須用關鍵字傳入。
>>> def f(a,b,*,c):
... return a+b+c
...
>>> f(1,2,3) # 報錯
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() takes 2 positional arguments but 3 were given
>>> f(1,2,c=3) # 正常
6