TCP連線的TIME_WAIT和CLOSE_WAIT 狀態解說
1,引數傳遞
函式的引數傳遞都是引用傳遞,有些資料說函式的傳遞分為值傳遞和引用傳遞,那是從表象上看的現象,其實就只有一種傳遞方式,那就是引用傳遞。
為什麼會有值傳遞和引用傳遞的表象?
答:因為在進行引數傳值時,如果是基礎型別,str或者tuple,修改其值對被傳入的物件沒有影響,但是傳入list,dict或者自定義類時,對其進行修改將導致被傳入物件的修改。
從表象上看,很容易讓人產生兩種傳遞方式的錯覺,那是因為a和 l 操作的資料物件不同,a操作的是變數本身,而 l 操作的是變數的元素。
當a += 10時,此時a的引用地址發生變法,所以對被傳入的物件沒有影響,而 l.append(100)時,並沒有對變數 l 本身進行操作,所以 l 的引用地址沒有發生變法,對其元素的修改,也體現在被傳入的引數上面(參考Python變數的賦值:
2,預設引數
預設引數為帶預設值的引數,其定義必須在無預設值的引數後面,無預設值的引數必須傳遞,而帶預設值的引數可傳可不傳,當不傳時,將使用預設值。
3,函式呼叫
函式呼叫時,引數可以指定名字,也可以不指定名字,指定名字時,函式將把該引數賦值給對應的變數,不指定名字,函式將根據引數順序賦值給沒有指定名字的引數。
函式呼叫時,指定名字的引數必須在無指定名字之後。
def func(a, b, c=20):
print a, b, c
func(10, b=20) # a=10, b=20, c=20func(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