默認參數最好不為可變對象
函數的參數分三種
可變參數
默認參數
關鍵字參數
這三者的具體區別,和使用方法在 廖雪峰的教程 里會詳細的解釋。這里就不搬運了。
今天要說的是,傳遞默認參數時,新手很容易踩雷的一個坑。
先來看一個示例
deffunc(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 會與這個內存地址綁定。
在后面的函數調用中,如果調用方指定了新的默認值,就會將原來的默認值覆蓋。如果調用方沒有指定新的默認值,那就會使用原來的默認值。
訪問類中的私有方法
大家都知道,類中可供直接調用的方法,只有公有方法(protected類型的方法也可以,但是不建議)。也就是說,類的私有方法是無法直接調用的。
這里先看一下例子
classKls():
defpublic(self):
print('Hellopublicworld!')
def__private(self):
print('Helloprivateworld!')
defcall_private(self):
self.__private()
ins=Kls()
#調用公有方法,沒問題
ins.public()
#直接調用私有方法,不行
ins.__private()
#但你可以通過內部公有方法,進行代理
ins.call_private()
既然都是方法,那我們真的沒有方法可以直接調用嗎?
當然有啦,只是建議你千萬不要這樣弄,這里只是普及,讓你了解一下。
#調用私有方法,以下兩種等價
ins._Kls__private()
ins.call_private()
時有時無的切片異常
這是個簡單例子
my_list=[1,2,3,4,5]
print(my_list[5])
執行一下,和我們預期的一樣,會拋出索引異常。
Traceback(mostrecentcalllast):
File"F:/PythonScript/test.py",line2,in
print(my_list[5])
IndexError:listindexoutofrange
但是今天要說的肯定不是這個,而是一個你可能會不知道的冷知識。
來看看,如下這種寫法就不會報索引異常,執行my_list[5:],會返回一個新list:[]。
my_list=[1,2,3]
print(my_list[5:])
哪些情況下不需要續行符
在寫代碼時,為了代碼的可讀性,代碼的排版是尤為重要的。
為了實現高可讀性的代碼,我們常常使用到的就是續行符\
。
>>>a='talkischeap,'\
...'showmethecode.'
>>>
>>>print(a)
talkischeap,showmethecode.
那有哪些情況下,是不需要寫續行符的呢?
經過總結,在這些符號中間的代碼換行可以省略掉續行符:[]
,()
,{}
>>>my_list=[1,2,3,
...4,5,6]
>>>my_tuple=(1,2,3,
...4,5,6)
>>>my_dict={"name":"MING",
..."gender":"male"}
另外還有,在多行文本注釋中'''
,續行符也是可以不寫的。
>>>text='''talkischeap,
...showmethecode'''
上面只舉了一些簡單的例子。
但你要學會舉一反三。一樣的,在以下這些場景也同樣適用
類,和函數的定義。
列表推導式,字典推導式,集合推導式,生成器表達式。
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")
審核編輯:湯梓紅
-
參數
+關注
關注
11文章
1866瀏覽量
32855 -
python
+關注
關注
56文章
4823瀏覽量
86156
發布評論請先 登錄
電機選型計算公式與知識點匯總
電氣工程師必知必會的100個電?知識點分享
華邦電子安全閃存關鍵知識點
Aigtek功率放大器應用:電感線圈的知識點分享

后悔沒有早點看到:天線設計中的知識點!

硬件工程師面試基礎知識點

全新的半導體基礎知識

評論