上一篇文章分享了 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")
