1. 程式人生 > 實用技巧 >TCP連線的TIME_WAIT和CLOSE_WAIT 狀態解說

TCP連線的TIME_WAIT和CLOSE_WAIT 狀態解說

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