for 死循環(huán)
for 循環(huán)可以說是 基礎(chǔ)得不能再基礎(chǔ)的知識點(diǎn)了。但是如果讓你用 for 寫一個(gè)死循環(huán),你會寫嗎?
這是個(gè)開放性的問題,在往下看之前,建議你先嘗試自己思考,你會如何解答。
好了,如果你還沒有思路,那就來看一下 一個(gè)海外 MIT 群友的回答:
foriiniter(int,1):pass
是不是懵逼了。iter 還有這種用法?這為啥是個(gè)死循環(huán)?
這真的是個(gè)冷知識,關(guān)于這個(gè)知識點(diǎn),你如果看中文網(wǎng)站,可能找不到相關(guān)資料。
還好你可以通過 IDE 看 py 源碼里的注釋內(nèi)容,介紹了很詳細(xì)的使用方法。
原來iter有兩種使用方法,通常我們的認(rèn)知是第一種,將一個(gè)列表轉(zhuǎn)化為一個(gè)迭代器。
而第二種方法,他接收一個(gè) callable 對象,和一個(gè)sentinel 參數(shù)。第一個(gè)對象會一直運(yùn)行,直到它返回 sentinel 值才結(jié)束。
那int呢,這又是一個(gè)知識點(diǎn),int 是一個(gè)內(nèi)建方法。通過看注釋,可以看出它是有默認(rèn)值0的。你可以在終端上輸入int() 看看是不是返回0。
由于int() 永遠(yuǎn)返回0,永遠(yuǎn)返回不了1,所以這個(gè) for 循環(huán)會沒有終點(diǎn)。一直運(yùn)行下去。
奇怪的字符串
示例一
#Python2.7>>>a="Hello_Python">>>id(a)32045616>>>id("Hello"+"_"+"Python")32045616#Python3.7>>>a="Hello_Python">>>id(a)38764272>>>id("Hello"+"_"+"Python")32045616
示例二
>>>a="MING">>>b="MING">>>aisbTrue#Python2.7>>>a,b="MING!","MING!">>>aisbTrue#Python3.7>>>a,b="MING!","MING!">>>aisbFalse
示例三
#Python2.7>>>'a'*20is'aaaaaaaaaaaaaaaaaaaa'True>>>'a'*21is'aaaaaaaaaaaaaaaaaaaaa'False#Python3.7>>>'a'*20is'aaaaaaaaaaaaaaaaaaaa'True>>>'a'*21is'aaaaaaaaaaaaaaaaaaaaa'True
兩次return
我們都知道,try…finally… 語句的用法,不管 try 里面是正常執(zhí)行還是報(bào)異常,最終都能保證finally能夠執(zhí)行。
同時(shí),我們又知道,一個(gè)函數(shù)里只要遇到 return 函數(shù)就會立馬結(jié)束。
基于以上這兩點(diǎn),我們來看看這個(gè)例子,到底運(yùn)行過程是怎么樣的?
>>>deffunc():...try:...return'try'...finally:...return'finally'...>>>func()'finally'
驚奇的發(fā)現(xiàn),在try里的return居然不起作用。
原因是,在try…finally…語句中,try中的return會被直接忽視,因?yàn)橐WCfinally能夠執(zhí)行。
小整數(shù)池
先看例子。
>>>a=-6>>>b=-6>>>aisbFalse>>>a=256>>>b=256>>>aisbTrue>>>a=257>>>b=257>>>aisbFalse>>>a=257;b=257>>>aisbTrue
為避免整數(shù)頻繁申請和銷毀內(nèi)存空間,Python 定義了一個(gè)小整數(shù)池 [-5, 256] 這些整數(shù)對象是提前建立好的,不會被垃圾回收。
以上代碼請?jiān)?終端Python環(huán)境下測試,如果你是在IDE中測試,并不是這樣的效果。
那最后一個(gè)示例,為啥又是True?
因?yàn)楫?dāng)你在同一行里,同時(shí)給兩個(gè)變量賦同一值時(shí),解釋器知道這個(gè)對象已經(jīng)生成,那么它就會引用到同一個(gè)對象。如果分成兩成的話,解釋器并不知道這個(gè)對象已經(jīng)存在了,就會重新申請內(nèi)存存放這個(gè)對象。
intern機(jī)制
字符串類型作為 Python 中最常用的數(shù)據(jù)類型之一,Python解釋器為了提高字符串使用的效率和使用性能,做了很多優(yōu)化。
例如:Python 解釋器中使用了 intern(字符串駐留)的技術(shù)來提高字符串效率。
什么是 intern 機(jī)制?就是同樣的字符串對象僅僅會保存一份,放在一個(gè)字符串儲蓄池中,是共用的,當(dāng)然,肯定不能改變,這也決定了字符串必須是不可變對象。
>>>s1="hello">>>s2="hello">>>s1iss2True#如果有空格,默認(rèn)不啟用intern機(jī)制>>>s1="hello">>>s2="hello">>>s1iss2False#如果一個(gè)字符串長度超過20個(gè)字符,不啟動intern機(jī)制>>>s1="a"*20>>>s2="a"*20>>>s1iss2True>>>s1="a"*21>>>s2="a"*21>>>s1iss2False>>>s1="ab"*10>>>s2="ab"*10>>>s1iss2True>>>s1="ab"*11>>>s2="ab"*11>>>s1iss2False
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4332瀏覽量
62666 -
for
+關(guān)注
關(guān)注
0文章
44瀏覽量
15825 -
python
+關(guān)注
關(guān)注
56文章
4797瀏覽量
84727
原文標(biāo)題:for死循環(huán)、怪異字符串、兩次return……Python冷知識(三)
文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論