1、可變對象和不可變對象
在 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也會受影響
2、傳參
函數傳不可變對象
defChangeInt( a ):
a= 10b= 2ChangeInt(b)print( b )-------------------------------
2
函數傳可變對象
defchangeme( 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]]
3、參數
下面是調用函數時可使用的正常參數類型
必需參數
關鍵字參數
預設參數
不定長參數
必須參數
必需參數須以正确的順序傳入函數。調用時的數量必須和聲明時的一樣。
調用printme()函數,你必須傳入一個參數,不然會出現文法錯誤:
#錯誤示範
defprintme( str ):"列印任何傳入的字元串"
print(str)return
#調用printme函數
printme()----------------------------------------Traceback (most recent call last):
File"test.py", line 10, in printme()
TypeError: printme() missing1 required positional argument: 'str'
#函數缺少一個參數“str”
關鍵字參數
關鍵字參數和函數調用關系緊密,函數調用使用關鍵字參數來确定傳入的參數值。
使用關鍵字參數允許函數調用時參數的順序與聲明時不一緻,因為 Python 解釋器能夠用參數名比對參數值。
以下執行個體在函數 printme() 調用時使用參數名:
defprintme( str ):"列印任何傳入的字元串"
print(str)return
#調用printme函數
printme( str = "麻世骞")----------------------------------------------麻世骞
以下執行個體中示範了函數參數的使用不需要使用指定順序:
defprintinfo( 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)
如果在函數調用時沒有指定參數,它就是一個空元組。我們也可以不向函數傳遞未命名的變量。如下執行個體:
def printinfo( arg1, *vartuple ):"列印任何傳入的參數"
print ("輸出:")print(arg1)for var invartuple:print(var)return
#調用printinfo 函數
printinfo( 10)
printinfo(70, 60, 50)---------------------------------------輸出:10輸出:70
60
50
還有一種就是參數帶兩個星号 **,加了兩個星号 ** 的參數會以字典的形式導入。
def printinfo( arg1, **vardict ):"列印任何傳入的參數"
print ("輸出:")print(arg1)print(vardict)#調用printinfo 函數
printinfo(1, a=2,b=3)-------------------------------------------輸出:1{'a': 2, 'b': 3}
聲明函數時,參數中星号 * 可以單獨出現,例如:
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"", line 1, in TypeError: f() takes2 positional arguments but 3 were given
def f(a,b,*,c):return a+b+c
f(1,2,c=3) #正常
-----------------------------------
6