函數部分小知識點
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]
函數部分小知識點