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

Python函數(shù)參數(shù)操作詳解

 更新時(shí)間:2018年08月03日 08:59:12   作者:一去丶二三里  
這篇文章主要介紹了Python函數(shù)參數(shù)操作,結(jié)合實(shí)例形式詳細(xì)分析了Python形參、實(shí)參、默認(rèn)參數(shù)、關(guān)鍵字參數(shù)、可變參數(shù)、對參數(shù)解包以及獲取參數(shù)個(gè)數(shù)等相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Python函數(shù)參數(shù)操作。分享給大家供大家參考,具體如下:

簡述

在 Python 中,函數(shù)的定義非常簡單,滿足對應(yīng)的語法格式要求即可。對于調(diào)用者來說,只需關(guān)注如何傳遞正確的參數(shù),以及獲取相應(yīng)的返回值就足夠了,無需了解函數(shù)的內(nèi)部實(shí)現(xiàn)(除非想學(xué)習(xí)、跟蹤源碼)。

話雖如此,但對于函數(shù)的定義來說,靈活性非常高。除了常規(guī)定義的必選參數(shù)以外,還支持默認(rèn)參數(shù)、可變參數(shù)、以及關(guān)鍵字參數(shù)。這樣以來,不但能處理復(fù)雜的參數(shù),還可以簡化調(diào)用者的代碼。

形參和實(shí)參

不止 Python,幾乎所有的編程語言都會涉及兩個(gè)術(shù)語:parameter 和 argument。那么,它們之間究竟有什么區(qū)別呢?

parameter 是指函數(shù)定義中的參數(shù),而 argument 指的是函數(shù)調(diào)用時(shí)的實(shí)際參數(shù)。

簡略描述:parameter = 形參(formal parameter), argument = 實(shí)參(actual parameter)。

例如,定義一個(gè)簡單的函數(shù):

>>> def greet(param1, param2):
...   pass
... 
>>> 
>>> greet('Hello', 'Python')

其中,param1 和 param2 是函數(shù)的形參,而在函數(shù) greet() 被調(diào)用時(shí),傳入的('Hello''Python')則是實(shí)參。

固定數(shù)量參數(shù)的函數(shù)

到目前為止,關(guān)于函數(shù),我們介紹的都是固定數(shù)量的參數(shù)。來看一個(gè)簡單的示例:

>>> def greet(say, msg):
...   print(say, msg)
... 
>>> 
>>> greet('Hello', 'Python')
Hello Python

這里,函數(shù) greet() 有兩個(gè)參數(shù),用兩個(gè)參數(shù)調(diào)用這個(gè)函數(shù),運(yùn)行得很順利,不會有任何錯(cuò)誤。

倘若,參數(shù)的個(gè)數(shù)不匹配,會發(fā)生什么?

>>> greet() # 沒有參數(shù)
...
TypeError: greet() missing 2 required positional arguments: 'say' and 'msg'
>>> 
>>> greet('Hi') # 只有一個(gè)參數(shù)
...
TypeError: greet() missing 1 required positional argument: 'msg'

顯然,解釋器會發(fā)牢騷。但是,對 Python 來說,要解決這個(gè)問題簡直是易如反掌,繼續(xù)往下看!

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

定義函數(shù)時(shí),可以使用賦值運(yùn)算符(=)為參數(shù)指定一個(gè)默認(rèn)值。

注意: 如果參數(shù)沒有默認(rèn)值,在調(diào)用時(shí)必需為其指定一個(gè)值;如果參數(shù)有默認(rèn)值,那么在調(diào)用時(shí)值是可選的,如果為其提供了一個(gè)值,將會覆蓋默認(rèn)值。

>>> def greet(say, name = 'James', msg = 'I am your biggest fan!'):
...   print(say, ',', name, ',', msg)
... 
>>> greet('Hi') # 只提供強(qiáng)制性的參數(shù)
Hi , James , I am your biggest fan!
>>> 
>>> greet('Hi', 'Kobe') # 給出一個(gè)可選參數(shù)
Hi , Kobe , I am your biggest fan!
>>> 
>>> greet('Hi', 'Kobe', 'I want to challenge you!') # 給出所有參數(shù)
Hi , Kobe , I want to challenge you!

由于 say 沒有默認(rèn)值,所以必須指定;name、msg 有默認(rèn)值,所以值是可選的。

函數(shù)中的所有參數(shù)都可以有默認(rèn)值,但是,一旦存在一個(gè)默認(rèn)參數(shù),其右側(cè)的所有參數(shù)也必須有默認(rèn)值。也就是說,非默認(rèn)參數(shù)不能在默認(rèn)參數(shù)之后。

例如,將上面的函數(shù)定義為:

def greet(name = 'James', say):

就會引發(fā)錯(cuò)誤:

SyntaxError: non-default argument follows default argument

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

當(dāng)使用某些值調(diào)用函數(shù)時(shí),這些值將根據(jù)其位置分配給參數(shù)。

例如,在上述函數(shù) greet() 中,當(dāng)使用 greet('Hi', 'Kobe') 調(diào)用它時(shí),'Hi' 被賦值給參數(shù) say,同樣地,'Kobe' 被賦值給 name。

Python 允許使用 kwarg = value 格式的關(guān)鍵字參數(shù)調(diào)用函數(shù):

>>> def greet(say, name = 'James'):
...   print(say, ',', name)
... 
>>> 
>>> greet(say = 'Hi', name = 'Kobe') # 2 個(gè)關(guān)鍵字參數(shù)
Hi , Kobe
>>> 
>>> greet(name = 'Kobe', say = 'Hi') # 2 個(gè)關(guān)鍵字參數(shù)(次序顛倒)
Hi , Kobe
>>> 
>>> greet('Hi', name = 'Kobe') # 位置參數(shù)與關(guān)鍵字參數(shù)混合使用
Hi , Kobe

當(dāng)以這種方式調(diào)用函數(shù)時(shí),關(guān)鍵字參數(shù)必須在位置參數(shù)之后,所有傳遞的關(guān)鍵字參數(shù)都必須與函數(shù)接受的某個(gè)參數(shù)匹配,并且它們的順序不重要。

例如,像下面這樣調(diào)用,會引發(fā)錯(cuò)誤:

>>> greet(name = 'Kobe', 'Hi') # 關(guān)鍵字參數(shù)在位置參數(shù)之前
...
SyntaxError: positional argument follows keyword argument
>>>
>>> greet('Hi', na = 'Kobe') # na 不匹配
...
TypeError: greet() got an unexpected keyword argument 'na'

可變參數(shù)

可變參數(shù)也被稱為不定長參數(shù),顧名思義,就是傳入的參數(shù)個(gè)數(shù)是可變的,可以是任意個(gè)(0、1、2 … N)。

要定義可變參數(shù),僅需在參數(shù)名之前添加一個(gè)星號(*)。在函數(shù)內(nèi)部,這些參數(shù)被包裝為一個(gè) tuple。

注意: 此 * 非彼 *,不要誤認(rèn)為是 C/C++ 中的指針。

>>> def greet(*names):
...   print(names)
... 
>>> 
>>> greet() # 沒有參數(shù),返回空元組
()
>>>
>>> greet('Jordan', 'James', 'Kobe')
('Jordan', 'James', 'Kobe')

有時(shí),必須在函數(shù)定義中使用位置參數(shù)以及可變參數(shù),但位置參數(shù)始終必須在可變參數(shù)之前。

>>> def greet(say, *names):
...   print(say, names)
... 
>>> 
>>> greet('Hi')
Hi ()
>>> 
>>> greet('Hi', 'Jordan', 'James', 'Kobe')
Hi ('Jordan', 'James', 'Kobe')

通常情況下,可變參數(shù)會出現(xiàn)在形參列表的最后,因?yàn)樗鼈儠褌鬟f給函數(shù)的所有剩余輸入?yún)?shù)都收集起來??勺儏?shù)之后出現(xiàn)的任何形參都是“強(qiáng)制關(guān)鍵字”參數(shù),這意味著,它們只能被用作關(guān)鍵字參數(shù),而不能是位置參數(shù)。

>>> def greet(*names, sep = ','):
...   return sep.join(names)
... 
>>> 
>>> greet('Jordan', 'James', 'Kobe')
'Jordan,James,Kobe'
>>> 
>>> greet('Jordan', 'James', 'Kobe', sep = '/') # 被用作關(guān)鍵字參數(shù)
'Jordan/James/Kobe'
>>>
>>> greet('Jordan', 'James', 'Kobe', '/') # 被用作位置參數(shù)
'Jordan,James,Kobe,/'

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

還有一種機(jī)制,用于任意數(shù)量的關(guān)鍵字參數(shù)。為了做到這一點(diǎn),使用雙星號(**):

>>> def greet(**all_star):
...   print(all_star)
... 
>>> greet() # 沒有參數(shù),返回空字典
{}
>>> 
>>> greet(name = 'James', age = 18)
{'name': 'James', 'age': 18}

當(dāng)最后一個(gè)形式為 **msgs 的形參出現(xiàn)時(shí),它將收到一個(gè)字典,其中包含所有關(guān)鍵字參數(shù),除了與形參對應(yīng)的關(guān)鍵字參數(shù)之外。還可以與 *names 的形參相結(jié)合(*names 必須出現(xiàn)在 **msgs 之前)。

例如,定義一個(gè)這樣的函數(shù):

>>> def greet(say, *names, **msgs):
...   print('--', say)
...   for name in names:
...     print(name)
...   print('-' * 40)
...   keys = sorted(msgs.keys())
...   for key in keys:
...     print(key, ':', msgs[key])
... 
>>> 
>>> greet('Hi', 'Jordan', 'James', 'Kobe', msg = 'I want to challenge you!', challenger = 'Waleon')
-- Hi
Jordan
James
Kobe
----------------------------------------
challenger : Waleon
msg : I want to challenge you!

注意: 在打印內(nèi)容之前,通過對 msgs 字典的 keys() 方法的結(jié)果進(jìn)行排序來創(chuàng)建關(guān)鍵字參數(shù)名稱列表。如果沒有這樣做,則打印參數(shù)的順序是未定義的。

對參數(shù)進(jìn)行解包

正如“可變參數(shù)”那樣,也可在函數(shù)調(diào)用中使用 * 操作符。只不過在這種情況下,與在函數(shù)定義中 * 的語義相反,參數(shù)將被解包而不是打包。

>>> def greet(name, age):
...   print(name, age)
... 
>>> 
>>> t = ('James', 18)
>>> greet(*t)
James 18

還有一種方式,幾乎沒有必要提到,這里也羅嗦一下:

>>> greet(t[0], t[1])
James 18

與解包相比,這種調(diào)用方式顯然不舒適。另外,在一般情況下,調(diào)用 greet(t[0], t[1]) 幾乎是徒勞的,因?yàn)殚L度是未知的?!拔粗钡囊馑际牵洪L度只在運(yùn)行時(shí)才知道,而不是在編寫腳本時(shí)就知道。

同樣地,字典也可以用 ** 操作符傳遞關(guān)鍵字參數(shù):

>>> def greet(name, age = 18):
...   print(name, age)
... 
>>> 
>>> d = {'name':'James', 'age':32}
>>> greet(**d)
James 32

Python獲取函數(shù)參數(shù)個(gè)數(shù):

Python2.7寫法:

# -*- coding:utf-8 -*-
#! python2
def abc(a,b,c):
  print a,b
yy=abc.func_code.co_argcount
print yy

輸出結(jié)果為

3

python3.6寫法

# -*- coding:utf-8 -*-
#! python3
def abc(a,b,c):
  print(a,b)
a=abc.__code__.co_argcount
print(a)

輸出結(jié)果為

3

使用場景:

比如在REST規(guī)范的代碼中,request數(shù)據(jù)格式檢驗(yàn),判斷攜帶參數(shù)個(gè)數(shù)是否符合該函數(shù)所需參數(shù)的個(gè)數(shù),不是就可以return error了

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python函數(shù)使用技巧總結(jié)》、《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 用Python實(shí)現(xiàn)篩選文件腳本的方法

    用Python實(shí)現(xiàn)篩選文件腳本的方法

    今天小編就為大家分享一篇用Python實(shí)現(xiàn)篩選文件腳本的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python 解壓、復(fù)制、刪除 文件的實(shí)例代碼

    python 解壓、復(fù)制、刪除 文件的實(shí)例代碼

    這篇文章主要介紹了python 解壓、復(fù)制、刪除 文件的實(shí)例代碼,代碼簡單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python用post訪問restful服務(wù)接口的方法

    python用post訪問restful服務(wù)接口的方法

    今天小編就為大家分享一篇python用post訪問restful服務(wù)接口的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python條件語句與循環(huán)語句

    Python條件語句與循環(huán)語句

    這篇文章主要介紹了Python條件語句與循環(huán)語句,條件語句就是通過指定的表達(dá)式的運(yùn)行結(jié)果來判斷當(dāng)前是執(zhí)行還是跳過某些指定的語句塊,循環(huán)語句就是對某些語句的重復(fù)執(zhí)行,這個(gè)重復(fù)執(zhí)行是通過指定表達(dá)式來控制的,下面來看具體內(nèi)容及續(xù)航管案例吧,需要的朋友可以參考一下
    2021-11-11
  • Python3.7黑帽編程之病毒篇(基礎(chǔ)篇)

    Python3.7黑帽編程之病毒篇(基礎(chǔ)篇)

    這篇文章主要介紹了Python3.7黑帽編程之病毒篇(基礎(chǔ)篇),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • django基礎(chǔ)之?dāng)?shù)據(jù)庫操作方法(詳解)

    django基礎(chǔ)之?dāng)?shù)據(jù)庫操作方法(詳解)

    下面小編就為大家?guī)硪黄猟jango基礎(chǔ)之?dāng)?shù)據(jù)庫操作方法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • python實(shí)現(xiàn)的分層隨機(jī)抽樣案例

    python實(shí)現(xiàn)的分層隨機(jī)抽樣案例

    這篇文章主要介紹了python實(shí)現(xiàn)的分層隨機(jī)抽樣案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python實(shí)現(xiàn)遍歷讀取文件或文件夾

    Python實(shí)現(xiàn)遍歷讀取文件或文件夾

    搞機(jī)器學(xué)習(xí)或者深度學(xué)習(xí)算法很多時(shí)候需要遍歷某個(gè)目錄讀取文件,特別是經(jīng)常需要讀取某個(gè)特定后綴的文件。本文為大家準(zhǔn)備了Python遍歷讀取文件或文件夾的示例代碼,需要的可以參考一下
    2022-08-08
  • 帶你用Python實(shí)現(xiàn)Saga 分布式事務(wù)的方法

    帶你用Python實(shí)現(xiàn)Saga 分布式事務(wù)的方法

    在這篇文章里,我們介紹了 SAGA 的理論知識,也通過一個(gè)例子,完整給出了編寫一個(gè) SAGA 事務(wù)的過程,涵蓋了正常成功完成,異常情況,以及成功回滾的情況,需要的朋友參考下吧
    2021-09-09
  • Pycharm安裝各種庫(第三方庫)的兩種方法

    Pycharm安裝各種庫(第三方庫)的兩種方法

    這篇文章主要給大家介紹了關(guān)于Pycharm安裝各種庫(第三方庫)的兩種方法,Pycharm中通常需要安裝很多第三方庫,才可以使用相應(yīng)的拓展功能,需要的朋友可以參考下
    2024-01-01

最新評論