Python 函數入門:變化的參數

  變化的參數

  多個參數輸入

  位置參數

  關鍵字參數

  默認值

  不定長參數: * 和 **

  傳遞任意數量的參數值

  傳遞任意數量的鍵值對

  傳遞元組、列表、字典

  傳遞元組

  傳遞列表

  傳遞字典

  傳遞可能產生的問題

  多個參數輸入

  昨天程序裏大多是隻有一個參數的函數,不需要考慮其它問題。當我們需要多參數時,有以下幾種傳遞辦法可選

  位置參數

  位置參數,就是在傳遞參數值的時候,必須和函數定義的參數一一對應,否則傳遞會發生誤傳甚至報錯。

  例如下面這個有兩個參數的函數:

  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]

  如此就會避免這個問題

  …

  …


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章