Python這些冷門(mén)特性,當(dāng)初也沒(méi)教啊
本期整理了Python中幾個(gè)冷門(mén)甚至奇特但又一直存在的特性,一起看看吧
for-else
if-else想必所有人都知道用來(lái)處理?xiàng)l件判斷,但Python中還有個(gè)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!
如該例,當(dāng)break
沒(méi)有發(fā)生在for循環(huán)中時(shí),將執(zhí)行else代碼塊,為了驗(yàn)證,我們稍做改動(dòng)
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!
在該例中,由于觸發(fā)了break
,else代碼塊未被執(zhí)行
256、257
如果在Python中比較數(shù)字,有時(shí)可能會(huì)得到意想不到的結(jié)果,如
>>> a=256
>>> b=256
>>> a is b
True
>>> x=257
>>> y=257
>>> x is y
False
這是因?yàn)镻ython 會(huì)預(yù)加載[-5, 256]
范圍內(nèi)的所有整數(shù),以節(jié)省時(shí)間和內(nèi)存成本,因此,當(dāng)聲明此范圍內(nèi)的整數(shù)時(shí),Python 僅引用緩存的整數(shù),而不會(huì)創(chuàng)建任何新對(duì)象
即該例中a
和b
是同一個(gè)對(duì)象,而x
和y
卻不是
為驗(yàn)證這點(diǎn),可以打印每個(gè)變量的id
>>> id(a)
1696073345424
>>> id(b)
1696073345424
>>> id(x)
1696122928496
>>> id(y)
1696122928752
這種情況在Python中稱(chēng)為integer caching
String caching
和前述integer caching,Python中也會(huì)對(duì)small-size strings進(jìn)行緩存,如該例
>>> a = 'Zhou'
>>> b = 'Zhou'
>>> a is b
True
>>> c = 'Cai Xukong'
>>> d = 'Cai Xukong'
>>> c is d
False
就Python3.7來(lái)看,使用AST優(yōu)化器最多可以緩存4096字符,但任何包含空格的字符串都不會(huì)緩存
>>> a = 'qyuqhsjkdbzksjgbvhjzsdbkjsfhlweakjfhiufgh'
>>> b = 'qyuqhsjkdbzksjgbvhjzsdbkjsfhlweakjfhiufgh'
>>> a is b
True
>>>
修改元組
在Python中元組是不可變對(duì)象,但考慮以下情況
tp = ([1, 2, 3], 4, 5)
tp[0].append(4)
print(tp)
# ([1, 2, 3, 4], 4, 5)
這是因?yàn)榍短譖ython對(duì)象的可變性取決于嵌套對(duì)象本身,雖然tp
是不可變?cè)M,但tp[0]
是可變列表(類(lèi)似的,還需注意嵌套類(lèi)型的深淺拷貝問(wèn)題)
0.1+0.2 == 0.3?
正常人都清楚0.1+0.2的結(jié)果為0.3,但Python中
print(0.1+0.2 == 0.3)
# False
那么為什么會(huì)這樣?我們打印出結(jié)果
>>> 0.1 + 0.2
0.30000000000000004
準(zhǔn)確的說(shuō)這是由于計(jì)算機(jī)只能以一定的精度存儲(chǔ)和處理浮點(diǎn)數(shù)。因此,浮點(diǎn)運(yùn)算依賴(lài)于機(jī)器處理器中的硬件實(shí)現(xiàn),并且沒(méi)有任何編程語(yǔ)言可以說(shuō)其浮點(diǎn)計(jì)算總是正確的
>>> 0.42 + 0.4
0.8200000000000001
+=比=快
在Python中連接字符串,使用+=
和+
運(yùn)算符雖然都可以達(dá)到目的,但代價(jià)不同,如
>>> 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
為啥會(huì)這樣,這是由于+=
不會(huì)創(chuàng)建新對(duì)象,這樣時(shí)間不就摳出來(lái)了,別小瞧這點(diǎn)時(shí)間,在字符串處理密集且繁雜的任務(wù)中這是不小的提升
…代替pass
大多數(shù)人可能還在使用pass
來(lái)代表占位符
def my_func():
? pass
但其實(shí)三個(gè)...
也有相同功效(我自己在搭代碼框架時(shí)也習(xí)慣用這種方式)
def my_func():
? ...
以上就是本期的全部?jī)?nèi)容,期待點(diǎn)贊在看,我是啥都生,下次再見(jiàn)