中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python參數類型有哪些

發布時間:2021-08-19 13:47:20 來源:億速云 閱讀:250 作者:小新 欄目:開發技術

這篇文章主要介紹Python參數類型有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

參數類型

首先我們列舉一下有關于Python的參數類型,以及實際上的運用和原理。

  • 位置參數(必選參數)

  • 默認參數

  • 可變參數

  • 關鍵字參數

位置參數(必選參數)

首先是位置參數,同時也被稱作必選參數,位置參數很好理解,只要記住這點:

在函數定義時直接給定的此參數名稱,調用時按照參數的位置順序,依次賦予參數值。

示例:

def person_info(name, age):
  print("My name is %s, I am %s years old" % (name, age))

person_info("zhangsan", "49")  
# name,age都是位置參數,按照位置順序,函數中依次接收參數值。

默認參數

默認參數,默認參數存在許多便利的地方,但是同時也存在許多坑,等到后面我們再去仔細分析下為什么存在這些坑,以下幾點我們需要注意的:

  • 可以為一個或者多個參數指定默認值,當調用函數時可以不用傳入該參數值,大大降低函數調用的難度。

  • 當需要用傳入的參數值代替默認參數的默認值時,可以按照參數位置順序傳入,同時也可以指定參數名傳入。

示例:

def person_info(name, age, sex='man'):
  print("My name is %s, I am %s years old, I am %s" % (name, age, sex))

person_info('zhangsan', '15')
person_info('lisi', '15', 'women')
person_info('lisi', '20', sex='women')

可變參數

可變參數,顧名思義就是傳入的參數數量是可變的:

可變參數在實際中,傳入的數量可以是任意多個,但也可以沒有。

而可變參數會在傳入函數內部時,是一個tuple的形式。

示例:

def add(*numbers):
  sum = 0
  for i in numbers:
    sum+=i
  return sum

print(add(1,3,4,2,1,4,1,3)) 

numbers=[2,3,4,1,5]
add(*numbers)
# 當傳入的參數為list時,會將list中所有的元素作為可變參數,傳進去

關鍵字參數

當可變參數在傳入0個或者任意個參數時,這些可變參數會在函數調用時自動組裝成一個tuple。而關鍵字參數也允許你傳入0個或者任意個含參數名的參數,這些關鍵字參數會函數內部自動組裝為一個dict。調用函數時,可以只傳入必選參數。

擴展函數的功能,**kwargs

示例:

def person_info(**kw):
  for key,value in kw.items():
    print(key, value)

person_info(name='zhangsan', age=15)
person = {'name': 'zhangsan', 'age': 13}
person_info(**person)

命名關鍵字參數

對于關鍵字參數,函數的調用者可以傳入任意不受限制的關鍵字參數。但是針對到底傳入了哪些參數,就需要通過函數內部分析檢查。所以命名關鍵字參數就是限制傳入的參數的名字,只能傳我已命名關鍵字參數。

  • 命名關鍵字參數需要一個特殊分隔符*,分隔符后面的參數會被視為命名關鍵字參數。

  • 當函數中已經存在一個可變參數,后面跟著的命名關鍵字參數就不需要一個*特殊分隔符——“”**。

  • 命名關鍵參數可以有默認值,從而簡化調用。

  • 命名關鍵參數必須傳入一個參數名,這和位置參數不同。如果沒有傳入參數名,調用將會報錯。

示例:

def person_info(name, *, age, sex):
  print(name, age, sex)

def person_info2(name, *args, age, sex):
  for i in args:
    print(i)
  print(name, age, sex)

person_info('zhangsan', age=12, sex='man')
person_info2('zhangsan', 'sksks', 'ssk', age=13, sex='man')

參數組合調用規則

在python定義函數過程中,可以用位置參數、默認參數、可變參數、關鍵字參數、命名關鍵字參數。這五種參數都可以通過組合使用。需要注意的是:

這五種參數定義的順序必須是:位置參數、默認參數、可變參數、命名關鍵字參數、關鍵字參數。

位置參數和默認參數組合

def Person(name, age=20):
  print(name,age)

Person('zhangsan')
Person('zhangsan', 20)

位置參數、默認參數、可變參數組合

def Person(name, age=20, *args):
  for i in args:
    print(i)
  print(name, age)

Person('zhangsan')
Person('zhangsan', 22, "Beijing")
Person('zhangsan', age=22, 'Shanghai')

位置參數、默認參數、可變參數、命名關鍵字參數組合

def Person(name, age=20, *args, city, **kwargs):
  for i in args:
    print(i)
  for key,value in kwargs.items():
    print(key, value)
  print(name, age, city)

Person('zhangsan', age=12, 'Author', city='Shanghai', company='Shanghai Software')

關于參數定義的一些坑

默認參數陷阱

關于默認參數陷阱的問題,我們先來看一看一個示例:

def Book(book, book_list=[]):
  print(id(book_list))
  book_list.append(book)
  for book in book_list:
    print(book)
  print(id(book_list))  

test = Book("First One")

輸出的結果:

Python參數類型有哪些

這個輸出的結果應該是意料之中,現在我們這時候再調用Book()方法,看看會發生什么:

Python參數類型有哪些

這時候輸出結果,竟然把之前的First one都輸出,看了他們的id,發現都是同一塊內存地址,這時候就開始納悶了,那么來找找出現這種狀況的原因。

經過查閱官方資料發現,這是一段Python官方文檔給出的解釋:

Important warning: The default value is evaluated only once. This makes a difference when the default is a mutable object such as a list, dictionary, or instances of most classes. For example, the following function accumulates the arguments passed to it on subsequent calls:

我們來看看解釋分析下,Python官方文檔給出的理由就是Python對默認值只計算一次,對于可變對象,在后續調用的情況下會累積傳遞給他們。而list、dict等這種都屬于可變對象。

那么對于這種默認值陷阱,我們是該如何避免造成一些不必要的麻煩呢?大致有兩種解決方法:

  • 避免使用可變對象作為默認值。

  • 在參數定義的時候可以使用None對象作為占位符。

對于第二種方法:

def Book(book, book_list=None):
  print(book_list)
  if book_list is None:
    book_list = []
  book_list.append(book)
  for book in book_list:
    print(book)
  print(id(book_list)) 

test1 = Book('First one')
test2 = Book('Second one')

測試結果:

Python參數類型有哪些

慎用變長參數

前面已經介紹過了,Python是支持可變長度的參數列表,可以在函數定義參數時使用*args和**kwargs兩個特殊的語法來實現。

那為什么要說慎用變長參數,我總結了一下有以下幾個原因:

使用過于靈活。比如在我上面有關不同類型參數組合使用的示例中,在位置參數和默認參數在的情況下,還有可變參數、關鍵字參數、命名關鍵字參數。這就很容易是的這個函數的簽名不夠清晰,調用者需要花費時間去了解你這個方法該如何調用。所以這就很容易使得團隊開發中效率低效。

另外一個原因,如果一個函數的列表過于長,雖然可以通過使用*args, **kwargs來簡化函數,但同時也意味這個函數或許有更好的實現方式,有重構的必要。

說完了要慎用,在說說看我們常用的變長參數的使用場景:

  • 為函數添加一個裝飾器。

  • 如果參數的數目不確定的時候,可以考慮使用變長參數。比如讀取一些配置文件中的配置項時。

  • 用來實現函數的多態,或者在繼承情況下子類需要調用父類的某些方法。

以上是“Python參數類型有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

噶尔县| 丹棱县| 张北县| 双鸭山市| 万安县| 永清县| 宜宾县| 安达市| 伊金霍洛旗| 青河县| 上虞市| 邛崃市| 龙门县| 绥德县| 苗栗市| 海晏县| 呼图壁县| 鹿泉市| 台中市| 永寿县| 马龙县| 雅安市| 宁陵县| 菏泽市| 永吉县| 呼和浩特市| 宝应县| 长治县| 义马市| 大庆市| 嘉义市| 隆回县| 邳州市| 炉霍县| 通辽市| 汽车| 伊金霍洛旗| 宕昌县| 福鼎市| 翁牛特旗| 仲巴县|