溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python冷知識(shí)

發(fā)布時(shí)間:2020-09-25 09:05:56 來(lái)源:億速云 閱讀:147 作者:Leah 欄目:編程語(yǔ)言

Python冷知識(shí)?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

省略號(hào)也是對(duì)象

... 這是省略號(hào),在Python中,一切皆對(duì)象。它也不例外。

在 Python 中,它叫做 Ellipsis 。

在 Python 3 中你可以直接寫…來(lái)得到這玩意。

>>> ...
Ellipsis
>>> type(...)
<class  ellipsis >

而在 2 中沒(méi)有…這個(gè)語(yǔ)法,只能直接寫Ellipsis來(lái)獲取。

>>> Ellipsis
Ellipsis
>>> type(Ellipsis)
<type  ellipsis >
>>>

它轉(zhuǎn)為布爾值時(shí)為真

>>> bool(...)
True

最后,這東西是一個(gè)單例。

>>> id(...)
4362672336
>>> id(...)
4362672336

這東西有啥用呢?據(jù)說(shuō)它是Numpy的語(yǔ)法糖,不玩 Numpy 的人,可以說(shuō)是沒(méi)啥用的。

類首字母不一定大寫

在正常情況下,我們所編寫的所見(jiàn)到的代碼,好像都默許了類名首字母大寫,而實(shí)例用小寫的這一準(zhǔn)則。但這并不是強(qiáng)制性的,即使你反過(guò)來(lái)的也沒(méi)有關(guān)系。

但有一些內(nèi)置的類,首字母都是小寫,而實(shí)例都是大寫。

比如 bool 是類名,而 True,F(xiàn)alse 是其實(shí)例;

比如 ellipsis 是類名,Ellipsis是實(shí)例;

還有 int,string,float,list,tuple,dict 等一系列數(shù)據(jù)類型都是類名,它們都是小寫。

增量賦值的性能更好

+= 其背后使用的魔法方法是 __iadd__,如果沒(méi)有實(shí)現(xiàn)這個(gè)方法則會(huì)退而求其次,使用 __add__ 。

這兩種寫法有什么區(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)該算是比較冷門的,估計(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, in <module>
    print(my_list[5])
IndexError: list index out of range

但是今天要說(shuō)的肯定不是這個(gè),而是一個(gè)你可能會(huì)不知道的冷知識(shí)。

來(lái)看看,如下這種寫法就不會(huì)報(bào)索引異常,執(zhí)行my_list[5:],會(huì)返回一個(gè)新list:[]。

my_list = [1, 2, 3]
print(my_list[5:])

哪些情況不需要換行符

在寫代碼時(shí),為了代碼的可讀性,代碼的排版是尤為重要的。

為了實(shí)現(xiàn)高可讀性的代碼,我們常常使用到的就是續(xù)行符 。

>>> a =  talk is cheap, 
...      show me the code. 
>>>
>>> print(a)
talk is cheap,show me the code.

那有些情況下,是不需要寫續(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ù)行符也是可以不寫的。

>>> 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)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI