這篇文章主要介紹Python中不常見的冷門知識(shí)有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
于2013年開始創(chuàng)新互聯(lián)專注于”幫助中小企業(yè)+互聯(lián)網(wǎng)”, 也是目前成都地區(qū)具有實(shí)力的互聯(lián)網(wǎng)服務(wù)商。團(tuán)隊(duì)致力于為企業(yè)提供--站式網(wǎng)站建設(shè)、移動(dòng)端應(yīng)用( H5手機(jī)營銷、app軟件定制開發(fā)、微信開發(fā))、軟件開發(fā)、信息化解決方案等服務(wù)。
下面時(shí)Python中一些不常見的冷門知識(shí),感興趣的小伙伴不妨來學(xué)習(xí)一下。
1、省略號(hào)也是對(duì)象
… 這是省略號(hào),在Python中,一切皆對(duì)象。它也不例外。在 Python 中,它叫做 Ellipsis 。在 Python 3 中你可以直接寫…來得到這玩意。
>>> ...
Ellipsis
>>> type(...)
<class 'ellipsis'>
而在 Python2 中沒有…這個(gè)語法,只能直接寫Ellipsis來獲取。
>>> Ellipsis
Ellipsis
>>> type(Ellipsis)
<type 'ellipsis'>
它轉(zhuǎn)為布爾值時(shí)為真
>>> bool(...)
True
最后,這東西是一個(gè)單例。
>>> id(...)
4362672336
>>> id(...)
4362672336
這東西有啥用呢?據(jù)說它是Numpy的語法糖,不玩 Numpy 的人,可以說是沒啥用的。
在網(wǎng)上只看到這個(gè) 用 … 代替 pass ,稍微有點(diǎn)用,但又不是必須使用的。
try:
1/0
except ZeroDivisionError:
...
2、增量賦值的性能更好
諸如 += 和 *= 這些運(yùn)算符,叫做 增量賦值運(yùn)算符。這里使用用 += 舉例,以下兩種寫法,在效果上是等價(jià)的。
# 第一種
a = 1 ; a += 1
# 第二種
a = 1; a = a + 1
+= 其背后使用的魔法方法是 iadd,如果沒有實(shí)現(xiàn)這個(gè)方法則會(huì)退而求其次,使用 add 。
這兩種寫法有什么區(qū)別呢?
用列表舉例 a += b,使用 add 的話就像是使用了a.extend(b),如果使用 add 的話,則是 a = a+b,前者是直接在原列表上進(jìn)行擴(kuò)展,而后者是先從原列表中取出值,在一個(gè)新的列表中進(jìn)行擴(kuò)展,然后再將新的列表對(duì)象返回給變量,顯然后者的消耗要大些。
所以在能使用增量賦值的時(shí)候盡量使用它。
3、and 和or 的取值順序
and 和 or 是我們?cè)偈煜げ贿^的兩個(gè)邏輯運(yùn)算符。而我們通常只用它來做判斷,很少用它來取值。
如果一個(gè)or表達(dá)式中所有值都為真,Python會(huì)選擇第一個(gè)值,而and表達(dá)式則會(huì)選擇第二個(gè)。
>>>(2 or 3) * (5 and 7)
14 # 2*7
4、修改解釋器提示符
>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>>
>>> sys.ps2 = '---------------- '
>>> sys.ps1 = 'Python編程時(shí)光>>>'
Python編程時(shí)光>>>for i in range(2):
---------------- print (i)
----------------
5、默認(rèn)參數(shù)最好不為可變對(duì)象
函數(shù)的參數(shù)分三種
可變參數(shù)
默認(rèn)參數(shù)
關(guān)鍵字參數(shù)
今天要說的是,傳遞默認(rèn)參數(shù)時(shí),新手很容易踩雷的一個(gè)坑。
先來看一個(gè)示例:
def func(item, item_list=[]):
item_list.append(item)
print(item_list)
func('iphone')
func('xiaomi', item_list=['oppo','vivo'])
func('huawei')
在這里,你可以暫停一下,思考一下會(huì)輸出什么?
思考過后,你的答案是否和下面的一致呢
['iphone']
['oppo', 'vivo', 'xiaomi']
['iphone', 'huawei']
如果是,那你可以跳過這部分內(nèi)容,如果不是,請(qǐng)接著往下看,這里來分析一下。
Python 中的 def 語句在每次執(zhí)行的時(shí)候都初始化一個(gè)函數(shù)對(duì)象,這個(gè)函數(shù)對(duì)象就是我們要調(diào)用的函數(shù),可以把它當(dāng)成一個(gè)一般的對(duì)象,只不過這個(gè)對(duì)象擁有一個(gè)可執(zhí)行的方法和部分屬性。
對(duì)于參數(shù)中提供了初始值的參數(shù),由于 Python 中的函數(shù)參數(shù)傳遞的是對(duì)象,也可以認(rèn)為是傳地址,在第一次初始化 def 的時(shí)候,會(huì)先生成這個(gè)可變對(duì)象的內(nèi)存地址,然后將這個(gè)默認(rèn)參數(shù) item_list 會(huì)與這個(gè)內(nèi)存地址綁定。在后面的函數(shù)調(diào)用中,如果調(diào)用方指定了新的默認(rèn)值,就會(huì)將原來的默認(rèn)值覆蓋。如果調(diào)用方?jīng)]有指定新的默認(rèn)值,那就會(huì)使用原來的默認(rèn)值。
在這里插入圖片描述
6、訪問類中的私有方法
大家都知道,類中可供直接調(diào)用的方法,只有公有方法(protected類型的方法也可以,但是不建議)。也就是說,類的私有方法是無法直接調(diào)用的。
這里先看一下例子
class Kls():
def public(self):
print('Hello public world!')
def __private(self):
print('Hello private world!')
def call_private(self):
self.__private()
ins = Kls()
# 調(diào)用公有方法,沒問題
ins.public()
# 直接調(diào)用私有方法,不行
ins.__private()
# 但你可以通過內(nèi)部公有方法,進(jìn)行代理
ins.call_private()
既然都是方法,那我們真的沒有方法可以直接調(diào)用嗎?
當(dāng)然有啦,只是建議你千萬不要這樣弄,這里只是普及,讓你了解一下。
# 調(diào)用私有方法,以下兩種等價(jià)
ins._Kls__private()
ins.call_private()
7、時(shí)有時(shí)無的切片異常
這是個(gè)簡單例子
my_list = [1, 2, 3, 4, 5]
print(my_list[5])
Traceback (most recent call last):
File "F:/Python Script/test.py", line 2, in <module>
print(my_list[5])
IndexError: list index out of range
來看看,如下這種寫法就不會(huì)報(bào)索引異常,執(zhí)行my_list[5:],會(huì)返回一個(gè)新list:[]。
my_list = [1, 2, 3]
print(my_list[5:])
8、for 死循環(huán)
for 循環(huán)可以說是 基礎(chǔ)得不能再基礎(chǔ)的知識(shí)點(diǎn)了。但是如果讓你用 for 寫一個(gè)死循環(huán),你會(huì)寫嗎?(問題來自群友 陳**)
這是個(gè)開放性的問題,在往下看之前,建議你先嘗試自己思考,你會(huì)如何解答。
好了,如果你還沒有思路,那就來看一下 一個(gè)海外 MIT 群友的回答:
for i in iter(int, 1):pass
是不是懵逼了。iter 還有這種用法?這為啥是個(gè)死循環(huán)?
這真的是個(gè)冷知識(shí),關(guān)于這個(gè)知識(shí)點(diǎn),你如果看中文網(wǎng)站,可能找不到相關(guān)資料。
還好你可以通過 IDE 看py源碼里的注釋內(nèi)容,介紹了很詳細(xì)的使用方法。
原來iter有兩種使用方法,通常我們的認(rèn)知是第一種,將一個(gè)列表轉(zhuǎn)化為一個(gè)迭代器。
而第二種方法,他接收一個(gè) callable對(duì)象,和一個(gè)sentinel 參數(shù)。第一個(gè)對(duì)象會(huì)一直運(yùn)行,直到它返回 sentinel 值才結(jié)束。
在這里插入圖片描述
那int 呢,這又是一個(gè)知識(shí)點(diǎn),int 是一個(gè)內(nèi)建方法。通過看注釋,可以看出它是有默認(rèn)值0的。你可以在終端上輸入 int() 看看是不是返回0。
在這里插入圖片描述
由于int() 永遠(yuǎn)返回0,永遠(yuǎn)返回不了1,所以這個(gè) for 循環(huán)會(huì)沒有終點(diǎn)。一直運(yùn)行下去。
9、奇怪的字符串
字符串類型作為 Python 中最常用的數(shù)據(jù)類型之一,Python解釋器為了提高字符串使用的效率和使用性能,做了很多優(yōu)化。
例如:Python 解釋器中使用了 intern(字符串駐留)的技術(shù)來提高字符串效率。
什么是 intern 機(jī)制?就是同樣的字符串對(duì)象僅僅會(huì)保存一份,放在一個(gè)字符串儲(chǔ)蓄池中,是共用的,當(dāng)然,肯定不能改變,這也決定了字符串必須是不可變對(duì)象。
示例一
# 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"
>>> a is b
True
# Python2.7
>>> a, b = "MING!", "MING!"
>>> a is b
True
# Python3.7
>>> a, b = "MING!", "MING!"
>>> a is b
False
示例三
# Python2.7
>>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'
True
>>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'
False
# Python3.7
>>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'
True
>>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'
True
示例四
>>> s1="hello"
>>> s2="hello"
>>> s1 is s2
True
# 如果有空格,默認(rèn)不啟用intern機(jī)制
>>> s1="hell o"
>>> s2="hell o"
>>> s1 is s2
False
# 如果一個(gè)字符串長度超過20個(gè)字符,不啟動(dòng)intern機(jī)制
>>> s1 = "a" * 20
>>> s2 = "a" * 20
>>> s1 is s2
True
>>> s1 = "a" * 21
>>> s2 = "a" * 21
>>> s1 is s2
False
>>> s1 = "ab" * 10
>>> s2 = "ab" * 10
>>> s1 is s2
True
>>> s1 = "ab" * 11
>>> s2 = "ab" * 11
>>> s1 is s2
False
10、兩次return
我們都知道,try…finally… 語句的用法,不管 try 里面是正常執(zhí)行還是報(bào)異常,最終都能保證finally能夠執(zhí)行。
同時(shí),我們又知道,一個(gè)函數(shù)里只要遇到 return 函數(shù)就會(huì)立馬結(jié)束。
基于以上這兩點(diǎn),我們來看看這個(gè)例子,到底運(yùn)行過程是怎么樣的?
>>> def func():
... try:
... return 'try'
... finally:
... return 'finally'
...
>>> func()
'finally'
驚奇的發(fā)現(xiàn),在try里的return居然不起作用。
原因是,在try…finally…語句中,try中的return會(huì)被直接忽視,因?yàn)橐WCfinally能夠執(zhí)行。
以上是Python中不常見的冷門知識(shí)有哪些的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
本文標(biāo)題:Python中不常見的冷門知識(shí)有哪些
當(dāng)前路徑:http://jinyejixie.com/article44/posohe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、動(dòng)態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作、全網(wǎng)營銷推廣、網(wǎng)站營銷、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)