參數傳遞
1、可更改與不可更改對象傳遞
-
傳遞不可變對象:strings, tuples, 和 numbers 是不可更改的對象
# 傳不可變對象實例
print("# 傳不可變對象實例")
def returnStr(a):
a="212"
return
b=123
print("調用函數之前取值:",b)
returnStr(b)
print("調用函數之後取值:",b)
print()
# 傳不可變對象實例
調用函數之前取值: 123
調用函數之後取值: 123
-
傳遞可變對象: list,dict 等則是可以修改的對象
# 傳可變對象實例
print("# 傳可變對象實例")
def changelist(list1):
list1.append([1,2,3])
print("函數內部調用列表取值:",list1)
return
list2=[8,7,6]
print("調用函數之前取值:",list2)
changelist(list2)
print("函數外部調用列表取值:",list2)
# 傳可變對象實例
調用函數之前取值: [8, 7, 6]
函數內部調用列表取值: [8, 7, 6, [1, 2, 3]]
函數外部調用列表取值: [8, 7, 6, [1, 2, 3]]
2、函數調用時,參數順序可以不一致
當非函數順序傳遞時,需指定函數中傳遞的參數名
# 函數參數傳遞時順序可以不重要
def printName(firstName,lastName):
print("姓氏:",firstName)
print("名稱:",lastName)
print()
return
print("按照函數參數順序傳遞:姓zhang,名san")
printName("zhang","san")
print("按照函數參數非順序傳遞:名san,姓zhang")
printName(lastName="san",firstName="zhang")
按照函數參數順序傳遞:姓zhang,名san
姓氏: zhang
名稱: san
按照函數參數非順序傳遞:名san,姓zhang
姓氏: zhang
名稱: san
3、不定長參數
加了星號(*)的變量名會存放所有未命名的變量參數
def functionname([formal_args,] *var_args_tuple ):
"函數_文檔字符串"
function_suite
return [expression]
實例如下:
def printName(firstName,lastName,*infoP):
print("姓氏:",firstName)
print("名稱:",lastName)
for idx in infoP:
print("其他信息",idx)
print()
return
printName("li","si")
printName("zhang","san","50kg","180cm")
姓氏: li
名稱: si
姓氏: zhang
名稱: san
其他信息 50kg
其他信息 180cm
匿名函數
python 使用 lambda 來創建匿名函數。
- lambda只是一個表達式,函數體比def簡單很多。
- lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
- lambda函數擁有自己的命名空間,且不能訪問自有參數列表之外或全局命名空間裏的參數。
- 雖然lambda函數看起來只能寫一行,卻不等同於C或C++的內聯函數,後者的目的是調用小函數時不佔用棧內存從而增加運行效率。
# 匿名函數
sum = lambda arg1, arg2: arg1 + arg2
# 調用sum函數
print("相加後的值爲 : ", sum(23, 27))
print("相加後的值爲 : ", sum(45, 6))
相加後的值爲 : 50
相加後的值爲 : 51
變量的作用域
一個程序的所有的變量並不是在哪個位置都可以訪問的。訪問權限決定於這個變量是在哪裏賦值的。
變量的作用域決定了在哪一部分程序你可以訪問哪個特定的變量名稱。兩種最基本的變量作用域如下:
- 全局變量
- 局部變量
total = 0 # 全局變量
print("total初始化:",total)
def sum(arg1, arg2):
total = arg1 + arg2 # 局部變量,相當於重新申明瞭一個新變量total
print("函數內是局部變量 total: ", total) #局部變量
return total
sum(4, 7)
print("函數外是全局變量 total: ", total) #全局變量,total賦值0後未重新賦值
total初始化: 0
函數內是局部變量 total: 11
函數外是全局變量 total: 0
如果在函數內要對全局變量賦值,則需要用到global進行指定
total = 0 # 全局變量
print("total初始化:",total)
def sum(arg1, arg2):
global total # 指定了total爲全局變量
total= arg1 + arg2 # 在global指定全局變量後,此處不在是局部變量
print("函數內是局部變量 total: ", total) # 不再是局部變量
return total
sum(4, 7)
print("函數外是全局變量 total: ", total) #全局變量,total賦值0後在函數內重新賦值
total初始化: 0
函數內是局部變量 total: 11
函數外是全局變量 total: 11