盤點 Python 中的那些冷知識(二)
上一篇文章分享了 Python中的那些冷知識,地址在這裡
今天將接著分享!!
06. 預設引數最好不為可變物件
函式的引數分三種
- 可變引數
- 預設引數
- 關鍵字引數
這三者的具體區別,和使用方法在 廖雪峰的教程 裡會詳細的解釋。這裡就不搬運了。
今天要說的是,傳遞預設引數時,新手很容易踩雷的一個坑。
先來看一個示例
def func(item, item_list=[]): item_list.append(item) print(item_list) func('iphone') func('xiaomi', item_list=['oppo','vivo']) func('huawei')
在這裡,你可以暫停一下,思考一下會輸出什麼?
思考過後,你的答案是否和下面的一致呢
['iphone'] ['oppo', 'vivo', 'xiaomi'] ['iphone', 'huawei']
如果是,那你可以跳過這部分內容,如果不是,請接著往下看,這裡來分析一下。
Python 中的 def 語句在每次執行的時候都初始化一個函式物件,這個函式物件就是我們要呼叫的函式,可以把它當成一個一般的物件,只不過這個物件擁有一個可執行的方法和部分屬性。
對於引數中提供了初始值的引數,由於 Python 中的函式引數傳遞的是物件,也可以認為是傳地址,在第一次初始化 def 的時候,會先生成這個可變物件的記憶體地址,然後將這個預設引數 item_list 會與這個記憶體地址繫結。在後面的函式呼叫中,如果呼叫方指定了新的預設值,就會將原來的預設值覆蓋。如果呼叫方沒有指定新的預設值,那就會使用原來的預設值。

07. 訪問類中的私有方法
大家都知道,類中可供直接呼叫的方法,只有公有方法(protected型別的方法也可以,但是不建議)。也就是說,類的私有方法是無法直接呼叫的。
這裡先看一下例子
class Kls(): def public(self): print('Hello public world!') def __private(self): print('Hello private world!') def call_private(self): self.__private() ins = Kls() # 呼叫公有方法,沒問題 ins.public() # 直接呼叫私有方法,不行 ins.__private() # 但你可以通過內部公有方法,進行代理 ins.call_private()
既然都是方法,那我們真的沒有方法可以直接呼叫嗎?
當然有啦,只是建議你千萬不要這樣弄,這裡只是普及,讓你瞭解一下。
# 呼叫私有方法,以下兩種等價 ins._Kls__private() ins.call_private()
08. 時有時無的切片異常
這是個簡單例子
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
但是今天要說的肯定不是這個,而是一個你可能會不知道的冷知識。
來看看,如下這種寫法就不會報索引異常,執行my_list[5:],會返回一個新list:[]。
my_list = [1, 2, 3] print(my_list[5:])
09. 哪些情況下不需要續行符
在寫程式碼時,為了程式碼的可讀性,程式碼的排版是尤為重要的。
為了實現高可讀性的程式碼,我們常常使用到的就是續行符 \
。
>>> a = 'talk is cheap,'\ ...'show me the code.' >>> >>> print(a) talk is cheap,show me the code.
那有哪些情況下,是不需要寫續行符的呢?
經過總結,在這些符號中間的程式碼換行可以省略掉續行符: []
, ()
, {}
>>> my_list=[1,2,3, ...4,5,6] >>> my_tuple=(1,2,3, ...4,5,6) >>> my_dict={"name": "MING", ..."gender": "male"}
另外還有,在多行文字註釋中 '''
,續行符也是可以不寫的。
>>> text = '''talk is cheap, ...show me the code'''
上面只舉了一些簡單的例子。
但你要學會舉一反三。一樣的,在以下這些場景也同樣適用
- 類,和函式的定義。
- 列表推導式,字典推導式,集合推導式,生成器表示式
10. Py2 也可以使用 print()
我相信應該有不少人,思維定式,覺得只有 Py3 才可以使用 print(),而 Py2 只能使用print ''。
今天,小明要為 Py2 正名一次。
在Python 2.6之前,只支援
print "hello"
在Python 2.6和2.7中,可以支援如下三種
print "hello" print("hello") print ("hello")
在Python3.x中,可以支援如下兩種
print("hello") print ("hello")
