本期整理了Python/ target=_blank class=infotextkey>Python中幾個冷門甚至奇特但又一直存在的特性,一起看看吧
for-else
if-else想必所有人都知道用來處理條件判斷,但Python中還有個for-else
names = ["James", "Tim", "Peter"]
for name in names:
if name == "Steve":
print("Steve in the list!")
break
else:
print("Not found Peter!")
# Not found Peter!
如該例,當break
沒有發生在for循環中時,將執行else代碼塊,為了驗證,我們稍做改動
names = ["James", "Tim", "Peter", "Steve"]
for name in names:
if name == "Steve":
print("Steve in the list!")
break
else:
print("Not found Peter!")
# Steve in the list!
在該例中,由于觸發了break
,else代碼塊未被執行
256、257
如果在Python中比較數字,有時可能會得到意想不到的結果,如
>>> a=256
>>> b=256
>>> a is b
True
>>> x=257
>>> y=257
>>> x is y
False
這是因為Python 會預加載[-5, 256]
范圍內的所有整數,以節省時間和內存成本,因此,當聲明此范圍內的整數時,Python 僅引用緩存的整數,而不會創建任何新對象
即該例中a
和b
是同一個對象,而x
和y
卻不是
為驗證這點,可以打印每個變量的id
>>> id(a)
1696073345424
>>> id(b)
1696073345424
>>> id(x)
1696122928496
>>> id(y)
1696122928752
這種情況在Python中稱為integer caching
String caching
和前述integer caching,Python中也會對small-size strings進行緩存,如該例
>>> a = 'Zhou'
>>> b = 'Zhou'
>>> a is b
True
>>> c = 'CAI Xukong'
>>> d = 'Cai Xukong'
>>> c is d
False
就Python3.7來看,使用AST優化器最多可以緩存4096字符,但任何包含空格的字符串都不會緩存
>>> a = 'qyuqhsjkdbzksjgbvhjzsdbkjsfhlweakjfhiufgh'
>>> b = 'qyuqhsjkdbzksjgbvhjzsdbkjsfhlweakjfhiufgh'
>>> a is b
True
>>>
修改元組
在Python中元組是不可變對象,但考慮以下情況
tp = ([1, 2, 3], 4, 5)
tp[0].Append(4)
print(tp)
# ([1, 2, 3, 4], 4, 5)
這是因為嵌套Python對象的可變性取決于嵌套對象本身,雖然tp
是不可變元組,但tp[0]
是可變列表(類似的,還需注意嵌套類型的深淺拷貝問題)
0.1+0.2 == 0.3?
正常人都清楚0.1+0.2的結果為0.3,但Python中
print(0.1+0.2 == 0.3)
# False
那么為什么會這樣?我們打印出結果
>>> 0.1 + 0.2
0.30000000000000004
準確的說這是由于計算機只能以一定的精度存儲和處理浮點數。因此,浮點運算依賴于機器處理器中的硬件實現,并且沒有任何編程語言可以說其浮點計算總是正確的
>>> 0.42 + 0.4
0.8200000000000001
+=比=快
在Python中連接字符串,使用+=
和+
運算符雖然都可以達到目的,但代價不同,如
>>> import timeit
>>> print(timeit.timeit("s1 = s1 + s2 + s3", setup="s1 = ' ' * 100000; s2 = ' ' * 100000; s3 = ' ' * 100000", number=100))
0.45820390002336353
>>> print(timeit.timeit("s1 += s2 + s3", setup="s1 = ' ' * 100000; s2 = ' ' * 100000; s3 = ' ' * 100000", number=100))
0.20369120000395924
為啥會這樣,這是由于+=
不會創建新對象,這樣時間不就摳出來了,別小瞧這點時間,在字符串處理密集且繁雜的任務中這是不小的提升
…代替pass
大多數人可能還在使用pass
來代表占位符
def my_func():
pass
但其實三個...
也有相同功效(我自己在搭代碼框架時也習慣用這種方式)
def my_func():
...
以上就是本期的全部內容,期待點贊在看,我是啥都生,下次再見