一、不要使用可變對象作為函數(shù)默認(rèn)值
In [2]: my_list = append_to_list(1)
In [3]: my_list
Out[3]: [1]
In [4]: my_other_list = append_to_list(2)
In [5]: my_other_list
Out[5]: [1, 2] # 看到了吧,其實我們本來只想生成[2] 但是卻把第一次運行的效果頁帶了進來
In [6]: import time
In [7]: def report_arg(my_default=time.time()):
...: print(my_default)
...:
In [8]: report_arg() # 第一次執(zhí)行
1399562371.32
In [9]: time.sleep(2) # 隔了2秒
In [10]: report_arg()
1399562371.32 # 時間竟然沒有變
可以這樣改:
二、生成器不保留迭代過后的結(jié)果
In [13]: 2 in gen
Out[13]: True
In [14]: 3 in gen
Out[14]: True
In [15]: 1 in gen
Out[15]: False # 1為什么不在gen里面了? 因為調(diào)用1->2,這個時候1已經(jīng)不在迭代器里面了,被按需生成過了
In [20]: gen = (i for i in range(5))
In [21]: a_list = list(gen) # 可以轉(zhuǎn)化成列表,當(dāng)然a_tuple = tuple(gen) 也可以
In [22]: 2 in a_list
Out[22]: True
In [23]: 3 in a_list
Out[23]: True
In [24]: 1 in a_list # 就算循環(huán)過,值還在
Out[24]: True
三、lambda在閉包中會保存局部變量
In [30]: for l in my_list:
....: print(l())
....:
4
4
4
4
4
但是可以用生成器
In [32]: for l in my_gen:
....: print(l())
....:
0
1
2
3
4
In [34]: for l in my_list:
....: print(l())
....:
0
1
2
3
4
In [36]: groupby(range(9), 3)
Out[36]: [(0, 1, 2), (3, 4, 5), (6, 7, 8)]
四、在循環(huán)中修改列表項
In [45]: for i in a:
....: if not i % 2:
....: a.remove(i)
....:
In [46]: a
Out[46]: [1, 3, 5] # 沒有問題
In [50]: b = [2, 4, 5, 6]
In [51]: for i in b:
....: if not i % 2:
....: b.remove(i)
....:
In [52]: b
Out[52]: [4, 5] # 本來我想要的結(jié)果應(yīng)該是去除偶數(shù)的列表