1. 程式人生 > >函數部分小知識點

函數部分小知識點

查看 lar 如何 size 本質 初始化 下劃線 ... 劃線

1.變量的解壓

當函數的返回值是多個而又想直接取到每一個時,可以用變量的解壓 ,例如:

a,b,c,d,e = "hello"
print(a) ---->"h"
print(b) ---->"e"
print(c) ---->"l"
print(d) ---->"l"
print(e) ---->"o"


只想取首尾時中間的可以用下劃線“_”來表示,來占一位
a,_,_,_,e = "hello"
print(a) ---->"h"
print(e) ---->"o"


中間的多個下劃線可以用*_”來表示
a,*_,e = "hello"

也可以用head,tail表示頭尾
head,*_ = "hello"
print(head) = "h"

*_,tail = "hello"
print(tail) = "o"

變量的解壓,此處的變量可以使任何type的序列就可以
*_ = [1,2,3]
*_ = {"a":"你好"}


變量的解壓在函數中的應用

def bar(x.y):
return 1,2,3
res = bar(x,y)
print(res) ----> (1,2,3)

想一次得到每一個結果:

def bar(x.y):
return 1,2,3
a,b,c = bar(x,y)
print(a) ----> 1
print(b) ----> 2
print(c) ----> 3

2.定義函數後如何獲取函數名和函數體中的幫助信息

def timmer():

  "你好"

  print(1,2,3)

a = timmer.__name__

print(a) ----> "timmer"

print(type(a)) ----> class "str"

b = timmer.__doc__

print(b) ----> "你好"

3.捕捉異常

d = {"a":1, "b":2, "c":3}

i = iter(d)

while True:

  try:

    print(next(i))

  except StepIteration:

    break

使用try...except來捕捉異常,發現異常時,執行except作用域的代碼

註:for循環本質上就是一個處理了異常的叠代器,而使用while則要捕捉異常;

3.關於協程函數中,g.send()與next(g)區別

(1) 如果函數內yield是表達式形式,必須先next(g),初始化,然後才能g.send(),去傳值;

(2)二者的共同之處是都可以讓函數在上一次暫停的位置繼續運行,不一樣的地方在於send在觸發下一次代碼的執行時,會順便給yield傳一個值;

(3)g.send()可以傳多個值,但必須是元祖的形式,如g.send(("包子“,”水果“))

(4)g.send(None)就相當於初始化時的next(g)只觸發不傳值。

註:協程函數在使用時第一步是初始化,這個初始化可以用裝飾器來完成。

4.幾個表達式

(1) 列表推導

[ 表達式 for循環 if 判斷] 每一次循環,將以表達式的形式為一個元素,放入列表

l = ["egg%s" % i for i in range(100) if i > 5]

(2)生成器表達式

(表達式 for循環(可叠代對象) if 判斷) 每一次循環,將以表達式的形式生成一個結果,存在於這生成器之中,用next()方法查看

f = open("a.txt)

g = ( line.strip() for line in f)

list(g) 因g可叠代,故而可轉化為列表

(3)lambda 匿名函數

lambda 參數 : 返回值

如 lambda k : salaries[k] 結果是salaries[k]

函數部分小知識點