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