變化的參數html
多個參數輸入ide
位置參數函數
關鍵字參數ui
默認值spa
不定長參數: * 和 **.net
傳遞任意數量的參數值orm
傳遞任意數量的鍵值對htm
傳遞元組、列表、字典對象
傳遞元組it
傳遞列表
傳遞字典
傳遞可能產生的問題
多個參數輸入
昨天程序裏大可能是隻有一個參數的函數,不須要考慮其它問題。當咱們須要多參數時,有如下幾種傳遞辦法可選
位置參數
位置參數,就是在傳遞參數值的時候,必須和函數定義的參數一一對應,不然傳遞會發生誤傳甚至報錯。
例以下面這個有兩個參數的函數:
def price(name,cost):
print('商品名稱:%s,價格:%d'%(name,cost))
>>> price('Mate30',4999) #正確輸入
商品名稱:Mate30,價格:4999
>>> price(4999,'Mate30') #錯誤輸入
TypeError: %d format: a number is required, not str
然鵝聽說這種傳參是最經常使用的方法之一。
這種固定形式傳遞的方法,要求咱們對參數足夠熟悉,才能避免輸錯(用help啊)
關鍵字參數
爲了不發生剛纔的問題,就有了關鍵字參數:
依然是price函數
def price(name,cost):
print('商品名稱:%s,價格:%d'%(name,cost))
爲了不輸錯,在輸入參數的時候,咱們能夠用 指定參數名=值 的方法。
這裏直接反着輸入試一下:
>>> price(cost=4999,name='Mate30')
商品名稱:Mate30,價格:4999
在參數比較少的時候,咱們也能夠只指定一個參數:
>>> price('Mate30',cost=4999)
商品名稱:Mate30,價格:4999
可是,只能是以「左邊不指定,右邊指定」的 方式,若是反過來:
>>> price(name='Mate30',4999)
SyntaxError: positional argument follows keyword argument
>>> price(cost=4999,'Mate30')
SyntaxError: positional argument follows keyword argument
這是說關鍵字參數不正確的意思
默認值
默認值就是在定義函數的時候直接讓參數=一個值,當沒有給這個參數傳值的時候,這個參數就會用它本身的默認值
def price(name='',cost=998):
print('商品名稱:%s,價格:%d'%(name,cost))
這裏就是默認給name參數’ ’ ,默認給cost參數998
>>> price('ABC')
商品名稱:ABC,價格:998
可是,默認值的使用也有侷限性,在這個函數裏,默認狀況是輸入一個值,當咱們輸入price(6666)時,輸出則會是
>>> price(6666)
商品名稱:6666,價格:998
並且和關鍵字參數同樣,默認值定義函數的時候,也只能以「左邊不指定,右邊指定」的 方式,反過來則會報錯
>>> def price(name='ABC',cost):
print('商品名稱:%s,價格:%d'%(name,cost))
SyntaxError: non-default argument follows default argument
不定長參數: * 和 **
爲了使用方便,咱們在定義函數的時候是能夠設置成不定長參數的
傳遞任意數量的參數值
格式:
函數名([參數1,參數2,.....參數n,]*不定長參數)
有一點要注意的是,帶 * 的參數雖能夠接受任意數量的值,可是一個自定義函數裏只能有一個帶 * 的參數,並且只能放在最右邊。
例子以下:
這是一個記錄了一天都完成什麼任務的函數,完成的任務數量是不定的,因此要在result前面加一個*,這樣result就是一個不定長參數
>>> def record(date,*result):
print(date)
temp = ''
for i in result:
temp += ' ' + i
print(temp)
輸入當日完成任務:
>>> record('4月27日','Day11','高數Day11','英語Day11')
4月27日
Day11 高數Day11 英語Day11
而這個不定長參數是以什麼形式保存的呢?type一下便知
...
print(type(result))
...
4月27日
Day11 高數Day11 英語Day11
傳遞任意數量的鍵值對
格式:
函數名([參數1,參數2,.....參數n,]**不定長參數)
一樣,一個自定義函數只能有一個帶 ** 的不定長參數,並且只能放在最右邊。惟一不一樣的就是,如今傳遞的是鍵值對。
依然以記錄任務爲例,但此次要改爲鍵值對的樣子:
def record(date,**result):
print(date)
print(result)
輸入完成的任務(注意這裏輸入鍵和值的寫法)
>>> record('4月27日',='Day11',高數='Day11',英語='Day11')
4月27日
{'': 'Day11', '高數': 'Day11', '英語': 'Day11'}
type一下就知道此次傳遞回來的是什麼類型的數據了
傳遞元組、列表、字典
傳遞元組
>>> def record(date,result):
print(date)
print(type(result))
print(result)
>>> record('4月27日',('Day11','高數Day11','英語Day11'))
4月27日瀋陽婦科醫院 http://yyk.39.net/hospital/fc843_doctors.html
('Day11', '高數Day11', '英語Day11')
傳遞列表
函數同上,只不過在輸入的時候換成列表了
>>> record('4月27日',[Day11','高數Day11','英語Day11'])
4月27日
['Day11', '高數Day11', '英語Day11']
傳遞字典
函數依舊不變,輸入再改爲字典
>>> D = {'': 'Day11', '高數': 'Day11', '英語': 'Day11'}
>>> record('4月27日',D)
4月27日
{': 'Day11', '高數': 'Day11', '英語': 'Day11'}
傳遞可能產生的問題
以列表爲例,自定義一個單價打折函數:
>>> def discount(Mobile,price):
print(Mobile)
price[1] *= 0.9
print(price)
輸入
>>> L = ['Mate30',4999]
>>> discount('HUAWEI',L)
HUAWEI
['Mate30', 4499.1]
可是當咱們再查看列表L的時候
>>> L
['Mate30', 4499.1]
咱們發現,L也被改變了,這是由於不管傳遞前仍是傳遞後的對象(列表、元組、字典)都是指向同一個地址的,一旦咱們在自定義函數內部讓對象發生改變,這個改變會致使輸入的對象也發生改變,而這每每是咱們不但願發生的,因此爲了不這個現象發生,咱們能夠複製該對象。
函數應改成:
>>> def discount(Mobile,price):
print(Mobile)
L1 = price.copy()
L1[1] *= 0.9
print(L1)
再從新輸入
>>> discount('HUAWEI',L)
HUAWEI
['Mate30', 4499.1]
>>> L
['Mate30', 4999]
如此就會避免這個問題
…
…