欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python參數(shù)類(lèi)型以及常見(jiàn)的坑詳解

 更新時(shí)間:2019年07月08日 15:37:10   作者:李不李多  
這篇文章主要介紹了Python參數(shù)類(lèi)型以及常見(jiàn)的坑詳解,由于之前遇到過(guò)幾次有關(guān)于參數(shù)類(lèi)型的坑,以及經(jīng)常容易把一些參數(shù)類(lèi)型搞混淆,現(xiàn)在做一下有關(guān)參數(shù)類(lèi)型的總結(jié)記錄以及對(duì)之前踩坑經(jīng)歷的分析,需要的朋友可以參考下

導(dǎo)語(yǔ)

由于之前遇到過(guò)幾次有關(guān)于參數(shù)類(lèi)型的坑,以及經(jīng)常容易把一些參數(shù)類(lèi)型搞混淆,現(xiàn)在做一下有關(guān)參數(shù)類(lèi)型的總結(jié)記錄以及對(duì)之前踩坑經(jīng)歷的分析。

參數(shù)類(lèi)型

首先我們列舉一下有關(guān)于Python的參數(shù)類(lèi)型,以及實(shí)際上的運(yùn)用和原理。

  • 位置參數(shù)(必選參數(shù))
  • 默認(rèn)參數(shù)
  • 可變參數(shù)
  • 關(guān)鍵字參數(shù)

位置參數(shù)(必選參數(shù))

首先是位置參數(shù),同時(shí)也被稱(chēng)作必選參數(shù),位置參數(shù)很好理解,只要記住這點(diǎn):

在函數(shù)定義時(shí)直接給定的此參數(shù)名稱(chēng),調(diào)用時(shí)按照參數(shù)的位置順序,依次賦予參數(shù)值。

示例:

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

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

默認(rèn)參數(shù)

默認(rèn)參數(shù),默認(rèn)參數(shù)存在許多便利的地方,但是同時(shí)也存在許多坑,等到后面我們?cè)偃プ屑?xì)分析下為什么存在這些坑,以下幾點(diǎn)我們需要注意的:

  • 可以為一個(gè)或者多個(gè)參數(shù)指定默認(rèn)值,當(dāng)調(diào)用函數(shù)時(shí)可以不用傳入該參數(shù)值,大大降低函數(shù)調(diào)用的難度。
  • 當(dāng)需要用傳入的參數(shù)值代替默認(rèn)參數(shù)的默認(rèn)值時(shí),可以按照參數(shù)位置順序傳入,同時(shí)也可以指定參數(shù)名傳入。

示例:

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')

可變參數(shù)

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

可變參數(shù)在實(shí)際中,傳入的數(shù)量可以是任意多個(gè),但也可以沒(méi)有。

而可變參數(shù)會(huì)在傳入函數(shù)內(nèi)部時(shí),是一個(gè)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)
# 當(dāng)傳入的參數(shù)為list時(shí),會(huì)將list中所有的元素作為可變參數(shù),傳進(jìn)去

關(guān)鍵字參數(shù)

當(dāng)可變參數(shù)在傳入0個(gè)或者任意個(gè)參數(shù)時(shí),這些可變參數(shù)會(huì)在函數(shù)調(diào)用時(shí)自動(dòng)組裝成一個(gè)tuple。而關(guān)鍵字參數(shù)也允許你傳入0個(gè)或者任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)會(huì)函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict。調(diào)用函數(shù)時(shí),可以只傳入必選參數(shù)。

擴(kuò)展函數(shù)的功能,**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)

命名關(guān)鍵字參數(shù)

對(duì)于關(guān)鍵字參數(shù),函數(shù)的調(diào)用者可以傳入任意不受限制的關(guān)鍵字參數(shù)。但是針對(duì)到底傳入了哪些參數(shù),就需要通過(guò)函數(shù)內(nèi)部分析檢查。所以命名關(guān)鍵字參數(shù)就是限制傳入的參數(shù)的名字,只能傳我已命名關(guān)鍵字參數(shù)。

  • 命名關(guān)鍵字參數(shù)需要一個(gè)特殊分隔符*,分隔符后面的參數(shù)會(huì)被視為命名關(guān)鍵字參數(shù)。
  • 當(dāng)函數(shù)中已經(jīng)存在一個(gè)可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不需要一個(gè)*特殊分隔符——“”**。
  • 命名關(guān)鍵參數(shù)可以有默認(rèn)值,從而簡(jiǎn)化調(diào)用。
  • 命名關(guān)鍵參數(shù)必須傳入一個(gè)參數(shù)名,這和位置參數(shù)不同。如果沒(méi)有傳入?yún)?shù)名,調(diào)用將會(huì)報(bào)錯(cuò)。

示例:

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') 

參數(shù)組合調(diào)用規(guī)則

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

這五種參數(shù)定義的順序必須是:位置參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)、關(guān)鍵字參數(shù)。

位置參數(shù)和默認(rèn)參數(shù)組合

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

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

位置參數(shù)、默認(rèn)參數(shù)、可變參數(shù)組合

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') 

位置參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)組合

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') 

關(guān)于參數(shù)定義的一些坑

默認(rèn)參數(shù)陷阱

關(guān)于默認(rèn)參數(shù)陷阱的問(wèn)題,我們先來(lái)看一看一個(gè)示例:

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") 

輸出的結(jié)果:

這個(gè)輸出的結(jié)果應(yīng)該是意料之中,現(xiàn)在我們這時(shí)候再調(diào)用Book()方法,看看會(huì)發(fā)生什么:

這時(shí)候輸出結(jié)果,竟然把之前的First one都輸出,看了他們的id,發(fā)現(xiàn)都是同一塊內(nèi)存地址,這時(shí)候就開(kāi)始納悶了,那么來(lái)找找出現(xiàn)這種狀況的原因。

經(jīng)過(guò)查閱官方資料發(fā)現(xiàn),這是一段Python官方文檔給出的解釋?zhuān)?

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:

我們來(lái)看看解釋分析下,Python官方文檔給出的理由就是Python對(duì)默認(rèn)值只計(jì)算一次,對(duì)于可變對(duì)象,在后續(xù)調(diào)用的情況下會(huì)累積傳遞給他們。而list、dict等這種都屬于可變對(duì)象。

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

  • 避免使用可變對(duì)象作為默認(rèn)值。
  • 在參數(shù)定義的時(shí)候可以使用None對(duì)象作為占位符。

對(duì)于第二種方法:

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') 

測(cè)試結(jié)果:

慎用變長(zhǎng)參數(shù)

前面已經(jīng)介紹過(guò)了,Python是支持可變長(zhǎng)度的參數(shù)列表,可以在函數(shù)定義參數(shù)時(shí)使用*args和**kwargs兩個(gè)特殊的語(yǔ)法來(lái)實(shí)現(xiàn)。

那為什么要說(shuō)慎用變長(zhǎng)參數(shù),我總結(jié)了一下有以下幾個(gè)原因:

使用過(guò)于靈活。比如在我上面有關(guān)不同類(lèi)型參數(shù)組合使用的示例中,在位置參數(shù)和默認(rèn)參數(shù)在的情況下,還有可變參數(shù)、關(guān)鍵字參數(shù)、命名關(guān)鍵字參數(shù)。這就很容易是的這個(gè)函數(shù)的簽名不夠清晰,調(diào)用者需要花費(fèi)時(shí)間去了解你這個(gè)方法該如何調(diào)用。所以這就很容易使得團(tuán)隊(duì)開(kāi)發(fā)中效率低效。

另外一個(gè)原因,如果一個(gè)函數(shù)的列表過(guò)于長(zhǎng),雖然可以通過(guò)使用*args, **kwargs來(lái)簡(jiǎn)化函數(shù),但同時(shí)也意味這個(gè)函數(shù)或許有更好的實(shí)現(xiàn)方式,有重構(gòu)的必要。

說(shuō)完了要慎用,在說(shuō)說(shuō)看我們常用的變長(zhǎng)參數(shù)的使用場(chǎng)景:

  • 為函數(shù)添加一個(gè)裝飾器。
  • 如果參數(shù)的數(shù)目不確定的時(shí)候,可以考慮使用變長(zhǎng)參數(shù)。比如讀取一些配置文件中的配置項(xiàng)時(shí)。
  • 用來(lái)實(shí)現(xiàn)函數(shù)的多態(tài),或者在繼承情況下子類(lèi)需要調(diào)用父類(lèi)的某些方法。

總結(jié)

關(guān)于的Python參數(shù)類(lèi)型就寫(xiě)到這里了,剛開(kāi)始學(xué)Python的時(shí)候,經(jīng)常被函數(shù)定義的參數(shù)類(lèi)型搞懵,后面看了一些教程,自己在寫(xiě)一些腳本的時(shí)候遇到的一些坑,并且在看一些大牛分析背后的原理,后面感覺(jué)收獲良多。后面干脆想把自己學(xué)習(xí)過(guò)程遇到的東西都整理一下,做個(gè)記錄,加深理解。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python中如何獲取類(lèi)屬性的列表

    Python中如何獲取類(lèi)屬性的列表

    這篇文章主要給大家介紹了在Python中如何獲取類(lèi)屬性的列表,文中通過(guò)示例代碼介紹的很詳細(xì),相信對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2016-12-12
  • Python利用緩存流實(shí)現(xiàn)壓縮PDF文件

    Python利用緩存流實(shí)現(xiàn)壓縮PDF文件

    在Python中,有許多庫(kù)可以用來(lái)壓縮PDF文件,其中最常用的是PyPDF2和PDFMiner,本文將為大家介紹一個(gè)新的方法,即使用緩存流壓縮PDF文件,感興趣的可以了解下
    2023-08-08
  • 關(guān)于pycharm 切換 python3.9 報(bào)錯(cuò) ‘HTMLParser‘ object has no attribute ‘unescape‘ 的問(wèn)題

    關(guān)于pycharm 切換 python3.9 報(bào)錯(cuò) ‘HTMLParser‘ object has no attribu

    這篇文章主要介紹了pycharm 切換 python3.9 報(bào)錯(cuò) ‘HTMLParser‘ object has no attribute ‘unescape‘ 解決,需要的朋友可以參考下
    2020-11-11
  • 使用FFmpeg來(lái)無(wú)損壓縮視頻文件的操作方法

    使用FFmpeg來(lái)無(wú)損壓縮視頻文件的操作方法

    FFmpeg是業(yè)內(nèi)有名的開(kāi)源圖像視頻處理程序,在許多視頻剪輯軟件、圖像處理軟件中,都使用的FFmpeg,還有比如OBS這樣的導(dǎo)播軟件里面也使用了FFmpeg,FFmpeg的功能十分強(qiáng)大,遠(yuǎn)不止視頻壓縮的功能,本文介紹使用FFmpeg來(lái)無(wú)損壓縮視頻文件的操作方法,感興趣的朋友一起看看吧
    2023-12-12
  • Python入門(mén)教程之運(yùn)算符重載詳解

    Python入門(mén)教程之運(yùn)算符重載詳解

    運(yùn)算符重載意味著賦予超出其預(yù)定義的操作含義的擴(kuò)展含義。例如運(yùn)算符 + 用于添加兩個(gè)整數(shù)以及連接兩個(gè)字符串和合并兩個(gè)列表。本文將通過(guò)示例帶大家詳細(xì)了解Python的運(yùn)算符重載,感興趣的可以了解一下
    2022-09-09
  • 淺談pycharm的xmx和xms設(shè)置方法

    淺談pycharm的xmx和xms設(shè)置方法

    今天小編就為大家分享一篇淺談pycharm的xmx和xms設(shè)置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • openCV實(shí)踐項(xiàng)目之銀行卡卡號(hào)識(shí)別功能

    openCV實(shí)踐項(xiàng)目之銀行卡卡號(hào)識(shí)別功能

    最近在惡補(bǔ)opencv,在前期不太那么認(rèn)真的學(xué)習(xí)狀態(tài)下,著手搞了一下這個(gè)小項(xiàng)目實(shí)戰(zhàn),基于模板匹配下的銀行卡卡號(hào)識(shí)別,下面這篇文章主要給大家介紹了關(guān)于openCV實(shí)踐項(xiàng)目之銀行卡卡號(hào)識(shí)別功能的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Python視頻編輯庫(kù)MoviePy的使用

    Python視頻編輯庫(kù)MoviePy的使用

    這篇文章主要介紹了Python視頻編輯庫(kù)MoviePy的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 使用Python批量刪除MySQL數(shù)據(jù)庫(kù)的全部外鍵

    使用Python批量刪除MySQL數(shù)據(jù)庫(kù)的全部外鍵

    這篇文章主要為大家詳細(xì)介紹了如何使用Python批量刪除MySQL數(shù)據(jù)庫(kù)的全部外鍵,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • python中的type,元類(lèi),類(lèi),對(duì)象用法

    python中的type,元類(lèi),類(lèi),對(duì)象用法

    這篇文章主要介紹了python中的type,元類(lèi),類(lèi),對(duì)象用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評(píng)論