Python 函數入門:變化的參數

  變化的參數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]

  如此就會避免這個問題

  …

  …

相關文章
相關標籤/搜索