默認(rèn)參數(shù)最好不為可變對(duì)象
函數(shù)的參數(shù)分三種
可變參數(shù)
默認(rèn)參數(shù)
關(guān)鍵字參數(shù)
這三者的具體區(qū)別,和使用方法在 廖雪峰的教程 里會(huì)詳細(xì)的解釋。這里就不搬運(yùn)了。
今天要說的是,傳遞默認(rèn)參數(shù)時(shí),新手很容易踩雷的一個(gè)坑。
先來看一個(gè)示例
deffunc(item,item_list=[]):
item_list.append(item)
print(item_list)
func('iphone')
func('xiaomi',item_list=['oppo','vivo'])
func('huawei')
在這里,你可以暫停一下,思考一下會(huì)輸出什么?
思考過后,你的答案是否和下面的一致呢
['iphone']
['oppo','vivo','xiaomi']
['iphone','huawei']
如果是,那你可以跳過這部分內(nèi)容,如果不是,請(qǐng)接著往下看,這里來分析一下。
Python 中的 def 語(yǔ)句在每次執(zhí)行的時(shí)候都初始化一個(gè)函數(shù)對(duì)象,這個(gè)函數(shù)對(duì)象就是我們要調(diào)用的函數(shù),可以把它當(dāng)成一個(gè)一般的對(duì)象,只不過這個(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ì)將原來的默認(rèn)值覆蓋。如果調(diào)用方?jīng)]有指定新的默認(rèn)值,那就會(huì)使用原來的默認(rèn)值。
訪問類中的私有方法
大家都知道,類中可供直接調(diào)用的方法,只有公有方法(protected類型的方法也可以,但是不建議)。也就是說,類的私有方法是無法直接調(diào)用的。
這里先看一下例子
classKls():
defpublic(self):
print('Hellopublicworld!')
def__private(self):
print('Helloprivateworld!')
defcall_private(self):
self.__private()
ins=Kls()
#調(diào)用公有方法,沒問題
ins.public()
#直接調(diào)用私有方法,不行
ins.__private()
#但你可以通過內(nèi)部公有方法,進(jìn)行代理
ins.call_private()
既然都是方法,那我們真的沒有方法可以直接調(diào)用嗎?
當(dāng)然有啦,只是建議你千萬不要這樣弄,這里只是普及,讓你了解一下。
#調(diào)用私有方法,以下兩種等價(jià)
ins._Kls__private()
ins.call_private()
時(shí)有時(shí)無的切片異常
這是個(gè)簡(jiǎn)單例子
my_list=[1,2,3,4,5]
print(my_list[5])
執(zhí)行一下,和我們預(yù)期的一樣,會(huì)拋出索引異常。
Traceback(mostrecentcalllast):
File"F:/PythonScript/test.py",line2,in
print(my_list[5])
IndexError:listindexoutofrange
但是今天要說的肯定不是這個(gè),而是一個(gè)你可能會(huì)不知道的冷知識(shí)。
來看看,如下這種寫法就不會(huì)報(bào)索引異常,執(zhí)行my_list[5:],會(huì)返回一個(gè)新list:[]。
my_list=[1,2,3]
print(my_list[5:])
哪些情況下不需要續(xù)行符
在寫代碼時(shí),為了代碼的可讀性,代碼的排版是尤為重要的。
為了實(shí)現(xiàn)高可讀性的代碼,我們常常使用到的就是續(xù)行符\
。
>>>a='talkischeap,'\
...'showmethecode.'
>>>
>>>print(a)
talkischeap,showmethecode.
那有哪些情況下,是不需要寫續(xù)行符的呢?
經(jīng)過總結(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='''talkischeap,
...showmethecode'''
上面只舉了一些簡(jiǎn)單的例子。
但你要學(xué)會(huì)舉一反三。一樣的,在以下這些場(chǎng)景也同樣適用
類,和函數(shù)的定義。
列表推導(dǎo)式,字典推導(dǎo)式,集合推導(dǎo)式,生成器表達(dá)式。
Py2 也可以使用 print()
我相信應(yīng)該有不少人,思維定式,覺得只有 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")
審核編輯:湯梓紅
-
參數(shù)
+關(guān)注
關(guān)注
11文章
1839瀏覽量
32287 -
python
+關(guān)注
關(guān)注
56文章
4798瀏覽量
84801
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論