五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動態(tài)

關于Python函數參數的進階用法

發(fā)布日期:2021-12-25 05:06 | 文章來源:CSDN

1、關鍵字參數和位置參數

關鍵字參數(positional argument)和位置參數(keyword argument)

Python函數的參數根據函數 在調用時 (注意,不是函數定義時)傳參的形式分為關鍵字參數和位置參數。

(1)關鍵字參數

關鍵字參數是指在函數調用傳參時,由標識符(如name= )引導的參數,或者放在一個由**引導的字典里進行傳遞。如下所示:

complex(real=3, imag=5)
complex(**{'real': 3, 'imag': 5})

(2)位置參數

不是關鍵字參數的參數就是位置參數。它除了單獨傳遞之外,還可以放在一個由*引導的可迭代序列(列表、元組等)里進行傳遞。如下所示:

complex(3, 5)
complex(*(3, 5))

位置參數總是放在函數的參數列表最前方,關鍵字參數必須要放在位置參數后面。它們之間的位置關系如下所示:

def func(arg1, arg2, kwarg1, kwarg2):
func(1, 2, kwarg1=3, kwarg2=4)

這里arg1、arg2是位置參數,kwarg1,kwarg2是關鍵字參數。 關鍵字參數的key(也就是這里的 'kwarg1=3'中的 'kwarg1','kwarg2=4'中的'kwarg2')要保證和形參名稱一致 。

2、接受任意數量的參數

(1)接受任意數量的位置參數

"*"號表達式除了上一章我們講的用于對任意長度可迭代對象進行拆分之外, 還能在 函數定義 中使用,用于定義一個可以接受任意數量位置參數的函數,如下所示:

def avg(first, *rest):
 print(rest)  
 return (first + sum(rest)) / (1 + len(rest))
print(avg(1, 2, 3, 4, 5))
# (2, 3, 4, 5)
# 1. 5

"*"開頭的參數必須做為最后一個位置參數使用,且"*"開頭的參數傳進來后是元組數據結構。

(2)接受任意數量的關鍵字參數

想接受任意數量的關鍵字參數,我們可以類似地使用"**"開頭的參數。如下所示:

import html
def make_element(name, value, **attrs) -> str:
 key_values = [ ' %s="%s"' % item for item in attrs.items()]
 attr_str = ''.join(key_values)
 # Perform a string formatting operation. 
 element = '<{name} {attrs}>{value}</{name}>'.format(name=name, attrs=attr_str, value=html.escape(value))
 return  element
res_1 = make_element('item', 'Albatross', size='large', quantity=6)
res_2 = make_element('p', '<spam>') # escape會把這里'<spam>'中的'<'和'>'替代成安全的序列< >
print(res_1) # <item  size="large" quantity="6">Albatross</item> 
print(res_2) # <p ><spam></p>

"**"開頭的參數必須做為最后一個關鍵字參數使用,且"**"開頭的參數傳進來后是字典數據結構。

(3)同時接受任意數量的位置參數和關鍵字參數

如果想要函數同時接受任意數量的位置參數和關鍵字參數,只要聯(lián)合使用"*""**"即可。

def anyargs(*args:tuple, **kwargs:dict):
 print(args)
 print(kwargs)
anyargs(2, 3, 4, 5, time=1, data=2)
# (2, 3, 4, 5)
# {'time': 1, 'data': 2}

3、keyword-only參數

前面說過, "*"打頭的參數只能做為最后一個位置參數, "**"打頭的參數只能做為最后一個關鍵字參數(自然也是最后一個參數),而依此推斷"*"打頭的參數后的參數就必然是關鍵字參數了。

# 出現在*args之后的參數稱為keyword-only參數
# 這兩個例子中y都只能是關鍵字參數,在傳參時要保證key和形參的一致性
def a(x, *args, y):
 print(y)
def b(x, *args, y, **kwargs):
 print(y)
a(4, 6, 7, 8, y=1)
b(4, 6, 7, 3, y=1, data=2, year=3)
# 1
# 1

這樣的參數稱為keyword-only參數,即出現在*args之后的參數只能做為關鍵字參數使用。

我們可以充分利用這一性質,將關鍵字參數放在以*打頭的參數后,或者一個單獨的*之后,強迫函數的調用者必須傳關鍵字參數,比如下面這樣:

def recv(max_size, *, block):
 'Receives a message'
 pass
recv(1024, True)  # recv2() takes 1 positional argument but 2 were given
# and missing 1 required keyword-only argument: 'block'
recv(1024, block=True) # OK

這項技術在實際項目中,可以用來為接受任意數量的位置參數的函數來指定關鍵字參數,比如下面這個帶截斷功能的求最小值函數。這里的clip參數被強迫為必須按照關鍵字參數傳入,而且設定了一個默認值None, 使參數為可選的。如下所示:

def mininum(*values, clip=None):
 m = min(values)
 if clip is not None:
  m = clip if clip > m else m
 return m
res1 = mininum(1, 5, 2, -5, 10)
res2 = mininum(1, 5, 2, -4, 10, clip=0) 
print(res1, res2) # -5, 0

除此之外,keyword-only參數可以提高代碼可讀性,像下面這種函數寫法:

msg = recv(1024, False)

如果代碼的閱讀者不熟悉recv函數的工作方式,那么可能不太明白這里的False參數有什么作用,如果這個函數的調用可以寫成下面這樣的話,那就清晰多了(當然,需要這個函數的編寫者最開始就強制函數的使用者這樣寫):

msg = recv(1024, block=False)

最后,如果 函數定義 的的時候強制使用了keyword-only參數,那么當用戶請求幫助信息時,參數信息可以很自然地顯現出來:

print(help(recv))
# Help on function recv in module __main__:
# recv(max_size, *_, block)
#  Receives a message

3、可選參數(帶默認值的參數)

要想定義一個可選參數,需要在 函數定義 中為參數賦值,并保證默認參數出現在參數列表最后。像下面這樣:

def spam(a, b=42):
 print(a, b)
spam(1) # 1, 42
spam(1, 2) # 1, 2

如果默認值是可變容器,比如說列表、集合、字典等,需要把None做為默認值:如下所示:

def spam(a, b=None):
 if b is None:
  b = []

警示1:千萬不能直接像下面這樣寫:

def spam(a, b=[]):

如果像上面那樣寫,那么就會發(fā)生一些你所不期望看到的現象:如果默認值在函數體之外被修改了,那么這種修改在之后的函數調用中仍然陰魂不散,如下面所示:

def spam(a, b=[]):
 print(b)
 return b
x = spam(1)
x.append('oh!')
x.append('no!')
print(x)
spam(1)
# []
# ['oh!', 'no!']
# ['oh!', 'no!']

警示2:在函數體中,我們常常需要判斷參數是否為None,此處需要使用is運算符,千萬不能直接像下面這樣寫:

def spam(a, b=None):
 if not b:
  b = []

這里的問題在于:盡管None會被判定為False,可還有其他許多對象(比如長度為0的字符串、列表、元組、字典等)也存在這樣的行為。這樣,有很多其他的特定輸入也會被判定為False,然后本該是用戶傳進來的值直接被默認的[]覆蓋掉了。如下所示:

def spam(a, b=None):
 if not b:
  b = []
spam(1) # OK
x = []
spam(1, x) # Oops! x will be overwritten by default []
spam(1, 0) # Oops! 0 will be overwritten by default []
spam(1, '') # Oops! '' will be overwritten by default []

最后,我們再來討論一個非常棘手的問題。我們想要在函數中檢測調用者是否對可選參數提供了某個特定值(可以是任意值,None也算)這樣,我們自然就不能用None,0False當做默認值然后再來做檢測了,因為用戶本身就可能拿它們當做參數。

要解決這個問題,可以像下面這樣寫:

_no_value = object()
def spam(a, b=_no_value):
 if b == _no_value:
  print("No b value supplied")
  return
 print(a, b)
spam(1) # No b value supplied
spam(1, 2) # 1 2
spam(1, None) # 1 None

這里_no_value是基于object()類創(chuàng)建的一個獨有對象,可以用這個來對用戶提供的參數做檢測,因為用戶幾乎不可能把_no_value對象做為參數輸入(除非用戶傳入的是相同的對象,否則哪怕是object類型的另一個對象都和_no_value對象是不同的)。

這里簡要說明一下object類,objectPython中幾乎所有對象的基類,object對象沒有任何數據(底層缺少__dict__字典,甚至沒辦法設置任何屬性),它唯一的作用就是用來檢測相等性。

到此這篇關于關于Python函數參數的進階用法的文章就介紹到這了,更多相關Python函數參數內容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持本站!

版權聲明:本站文章來源標注為YINGSOO的內容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網站,禁止在非maisonbaluchon.cn所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內容來源于網友推薦、互聯(lián)網收集整理而來,僅供學習參考,不代表本站立場,如有內容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。

相關文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務

7x24全年不間斷在線

專屬顧問服務

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務熱線

關注
微信

關注官方微信
頂部