Python冷知識(shí)?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計(jì),咸陽(yáng)網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:咸陽(yáng)等地區(qū)。咸陽(yáng)做網(wǎng)站價(jià)格咨詢:18980820575
省略號(hào)也是對(duì)象
... 這是省略號(hào),在Python中,一切皆對(duì)象。它也不例外。
在 Python 中,它叫做 Ellipsis 。
在 Python 3 中你可以直接寫(xiě)…來(lái)得到這玩意。
>>> ... Ellipsis >>> type(...)
而在 2 中沒(méi)有…這個(gè)語(yǔ)法,只能直接寫(xiě)Ellipsis來(lái)獲取。
>>> Ellipsis Ellipsis >>> type(Ellipsis)>>>
它轉(zhuǎn)為布爾值時(shí)為真
>>> bool(...) True
最后,這東西是一個(gè)單例。
>>> id(...) 4362672336 >>> id(...) 4362672336
這東西有啥用呢?據(jù)說(shuō)它是Numpy的語(yǔ)法糖,不玩 Numpy 的人,可以說(shuō)是沒(méi)啥用的。
類首字母不一定大寫(xiě)
在正常情況下,我們所編寫(xiě)的所見(jiàn)到的代碼,好像都默許了類名首字母大寫(xiě),而實(shí)例用小寫(xiě)的這一準(zhǔn)則。但這并不是強(qiáng)制性的,即使你反過(guò)來(lái)的也沒(méi)有關(guān)系。
但有一些內(nèi)置的類,首字母都是小寫(xiě),而實(shí)例都是大寫(xiě)。
比如 bool 是類名,而 True,F(xiàn)alse 是其實(shí)例;
比如 ellipsis 是類名,Ellipsis是實(shí)例;
還有 int,string,float,list,tuple,dict 等一系列數(shù)據(jù)類型都是類名,它們都是小寫(xiě)。
增量賦值的性能更好
+= 其背后使用的魔法方法是 __iadd__,如果沒(méi)有實(shí)現(xiàn)這個(gè)方法則會(huì)退而求其次,使用 __add__ 。
這兩種寫(xiě)法有什么區(qū)別呢?
用列表舉例 a += b,使用 __iadd__ 的話就像是使用了a.extend(b),如果使用 __add__ 的話,則是 a = a+b,前者是直接在原列表上進(jìn)行擴(kuò)展,而后者是先從原列表中取出值,在一個(gè)新的列表中進(jìn)行擴(kuò)展,然后再將新的列表對(duì)象返回給變量,顯然后者的消耗要大些。
所以在能使用增量賦值的時(shí)候盡量使用它。
and和or的取值順序
and 和 or 是我們?cè)偈煜げ贿^(guò)的兩個(gè)邏輯運(yùn)算符。而我們通常只用它來(lái)做判斷,很少用它來(lái)取值。
如果一個(gè)or表達(dá)式中所有值都為真,Python會(huì)選擇第一個(gè)值,而and表達(dá)式則會(huì)選擇第二個(gè)。
如何修改解釋器提示符
這個(gè)當(dāng)做今天的一個(gè)小彩蛋吧。應(yīng)該算是比較冷門(mén)的,估計(jì)知道的人很少了吧。
正常情況下,我們?cè)?終端下 執(zhí)行Python 命令是這樣的。
>>> for i in range(2): ... print (i) ... 0 1
你是否想過(guò) >>> 和 ... 這兩個(gè)提示符也是可以修改的呢?
>>> import sys >>> sys.ps1 >>> >>> sys.ps2 ... >>> >>> sys.ps2 = ................ >>> sys.ps1 = Python編程時(shí)光>>> Python編程時(shí)光>>>for i in range(2): ................ print (i) ................ 0 1
默認(rèn)參數(shù)最好為不可變對(duì)象
函數(shù)的參數(shù)分三種
可變參數(shù)
默認(rèn)參數(shù)
關(guān)鍵字參數(shù)
這三者的具體區(qū)別,和使用方法在 廖雪峰的教程 里會(huì)詳細(xì)的解釋。這里就不搬運(yùn)了。
今天要說(shuō)的是,傳遞默認(rèn)參數(shù)時(shí),新手很容易踩雷的一個(gè)坑。
先來(lái)看一個(gè)示例
def func(item, item_list=[]): item_list.append(item) print(item_list) func( iphone ) func( xiaomi , item_list=[ oppo , vivo ]) func( huawei )
在這里,你可以暫停一下,思考一下會(huì)輸出什么?
思考過(guò)后,你的答案是否和下面的一致呢
[ iphone ] [ oppo , vivo , xiaomi ] [ iphone , huawei ]
如果是,那你可以跳過(guò)這部分內(nèi)容,如果不是,請(qǐng)接著往下看,這里來(lái)分析一下。
Python 中的 def 語(yǔ)句在每次執(zhí)行的時(shí)候都初始化一個(gè)函數(shù)對(duì)象,這個(gè)函數(shù)對(duì)象就是我們要調(diào)用的函數(shù),可以把它當(dāng)成一個(gè)一般的對(duì)象,只不過(guò)這個(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ì)將原來(lái)的默認(rèn)值覆蓋。如果調(diào)用方?jīng)]有指定新的默認(rèn)值,那就會(huì)使用原來(lái)的默認(rèn)值。
訪問(wèn)類中的私有方法
大家都知道,類中可供直接調(diào)用的方法,只有公有方法(protected類型的方法也可以,但是不建議)。也就是說(shuō),類的私有方法是無(wú)法直接調(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)用公有方法,沒(méi)問(wèn)題 ins.public() # 直接調(diào)用私有方法,不行 ins.__private() # 但你可以通過(guò)內(nèi)部公有方法,進(jìn)行代理 ins.call_private()
既然都是方法,那我們真的沒(méi)有方法可以直接調(diào)用嗎?
當(dāng)然有啦,只是建議你千萬(wàn)不要這樣弄,這里只是普及,讓你了解一下。
# 調(diào)用私有方法,以下兩種等價(jià) ins._Kls__private() ins.call_private()
時(shí)有時(shí)無(wú)的切片異常
這是個(gè)簡(jiǎn)單例子
my_list = [1, 2, 3, 4, 5] print(my_list[5])
執(zhí)行一下,和我們預(yù)期的一樣,會(huì)拋出索引異常。
Traceback (most recent call last): File "F:/Python Script/test.py", line 2, inprint(my_list[5]) IndexError: list index out of range
但是今天要說(shuō)的肯定不是這個(gè),而是一個(gè)你可能會(huì)不知道的冷知識(shí)。
來(lái)看看,如下這種寫(xiě)法就不會(huì)報(bào)索引異常,執(zhí)行my_list[5:],會(huì)返回一個(gè)新list:[]。
my_list = [1, 2, 3] print(my_list[5:])
哪些情況不需要換行符
在寫(xiě)代碼時(shí),為了代碼的可讀性,代碼的排版是尤為重要的。
為了實(shí)現(xiàn)高可讀性的代碼,我們常常使用到的就是續(xù)行符 。
>>> a = talk is cheap, ... show me the code. >>> >>> print(a) talk is cheap,show me the code.
那有些情況下,是不需要寫(xiě)續(xù)行符的呢?
經(jīng)過(guò)總結(jié),在這些符號(hào)中間的代碼換行可以省略掉續(xù)行符:[],(),{}
>>> my_list=[1,2,3, ... 4,5,6] >>> my_tuple=(1,2,3, ... 4,5,6) >>> my_dict={"name": "MING", ... "gender": "male"}
另外還有,在多行文本注釋中 ,續(xù)行符也是可以不寫(xiě)的。
>>> text = talk is cheap, ... show me the code
上面只舉了一些簡(jiǎn)單的例子。
但你要學(xué)會(huì)舉一反三。一樣的,在以下這些場(chǎng)景也同樣適用
類,和函數(shù)的定義。
列表推導(dǎo)式,字典推導(dǎo)式,集合推導(dǎo)式,生成器表達(dá)式
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。