1,引數傳遞
函式的引數傳遞都是參考傳遞,有些資料說函式的傳遞分為值傳遞和參考傳遞,那是從表象上看的現象,
其實就只有一種傳遞方式,那就是參考傳遞,
為什么會有值傳遞和參考傳遞的表象?
答:因為在進行引數傳值時,如果是基礎型別,str或者tuple,修改其值對被傳入的物件沒有影響,但是
傳入list,dict或者自定義類時,對其進行修改將導致被傳入物件的修改,

從表象上看,很容易讓人產生兩種傳遞方式的錯覺,那是因為a和 l 操作的資料物件不同,a操作的是變數本
身,而 l 操作的是變數的元素,當a += 10時,此時a的參考地址發生變法,所以對被傳入的物件沒有影響,
而 l.append(100)時,并沒有對變數 l 本身進行操作,所以 l 的參考地址沒有發生變法,對其元素的修改,也
體現在被傳入的引數上面(參考Python變數的賦值:https://www.cnblogs.com/lwp-boy/p/13269681.html)
2,默認引數
默認引數為帶默認值的引數,其定義必須在無默認值的引數后面,無默認值的引數必須傳遞,而帶默認值的
引數可傳可不傳,當不傳時,將使用默認值,
3,函式呼叫
函式呼叫時,引數可以指定名字,也可以不指定名字,指定名字時,函式將把該引數賦值給對應的變數,不
指定名字,函式將根據引數順序賦值給沒有指定名字的引數,函式呼叫時,指定名字的引數必須在無指定名
字之后,
def func(a, b, c=20):
print a, b, c
func(10, b=20) # a=10, b=20, c=20
func(c=30, b=20, a=10) # a=10, b=20, c=30
func(10, 20, 30) # a=10, b=20, c=30
4,可變引數
可變引數及為對引數個數和型別沒有限制的引數,python函式的可變引數通過 * 或者 ** 進行定義,例如:
def func(a, *args, **kwargs):
print a, args, kwargs
args:為元組,通過無名引數傳遞的引數都在args里面(a的引數除外),通過元組取資料,
kwargs:為字典,通過有名引數傳遞的引數都在kwargs里面(a的引數除外),通過字典取資料,
函式內部訪問直接訪問args和kwargs即可,
func(a=1) # a=1, args=(), kwargs={}
func(a=2, b=2) # a=1, args=(), kwargs={'b':10}
func(2, 3, a=1) # 錯誤,不能確定a是屬于a函式屬于kwargs
func(1, 2, b=2) # a=1, args=(2, ), kwargs={'b':10}
變參傳遞如下:
def func(a, *args, **kwargs):
print a, args, kwargs
def func2(a, b, *args, **kwargs):
func(a, b, 20, c=10, *args, **kwargs)
func2(1, 2) # a=1, args=(2, 20) kwargs={'c': 10}
5,回傳值
python函式的回傳值其實只有一個,當回傳多個值時,其實回傳的是一個元組,因為元組支持無標簽
格式,比如元組:a = 1, 2, 3 等價與 a = (1, 2, 3),當 return 1, 2, 3 時,其實執行的是 return (1, 2, 3)
6, lambda運算式
lambda運算式通常用作表示一個簡短的方程式(PEP8建議用函式替換lambda運算式),
定義方式:lambda 引數串列:方程式
回傳值:方程式的值
常見用法:
(1)全域運算式
lamb = lambda x, y: x+y
r = lamb(2, 3) # r=5
(2)閉包函式
def func(x):
return lambda y: x+y
f = func(5)(3) # f=8
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/71733.html
標籤:Python
上一篇:python常用模塊
