python函數參數化 python 參數為函數
python-函數可變參數類型
python中的函數,大多需要配置參數,以下是幾種函數的參數類型:
專注于為中小企業提供網站設計制作、成都做網站服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業中山免費做網站提供優質的服務。我們立足成都,凝聚了一批互聯網行業人才,有力地推動了數千家企業的穩健成長,幫助中小企業通過網站建設實現規模擴充和轉變。
1.必備參數:以正確的順序、個數傳入函數。調用時的參數情況要和聲明時一樣。最常用的情況。
def tplink(a,b):
c=a+b+b
return c?
tplink(4,2)
2.關鍵字參數:使用關鍵字參數允許函數調用時參數的順序和聲明時不一致,因為python解析器會在調用函數時,用參數名匹配參數值。
def tplink(age1,age2):
ageall=age1+age2+age2
return ageall
tplink(age2=4,age1=2)
3.默認參數:默認某個參數的取值
def tplink(age1,age2=5):
ageall=age1+age2+age2
return ageall
tplink(age1=4)
4.不定長參數:在聲明時并不確定 調用時的參數數量。這種情況,可以用不定長參數進行解決,具體操作是在參數名前用*。
但不能和 關鍵字參數并用。一般在正常參數arg之后。
*args、**kwargs的定義:
這兩個都是python中的不定長參數,又稱為可變參數。
*args 表示任何多個無名參數,它是一個 tuple ;
**kwargs 表示關鍵字參數,它是一個dict。
同時使用 * args和 ** kwargs 時,必須 * args參數列要在 ** kwargs前。且都在arg之后。
函數在調用時,會根據順序,看是否放進 *args 或者 **kwargs中。
具體可根據實際情況使用,可以 更方便靈活的接收信息。
Python的函數和參數
parameter 是函數定義的參數形式
argument 是函數調用時傳入的參數實體。
對于函數調用的傳參模式,一般有兩種:
此外,
也是關鍵字傳參
python的函數參數定義一般來說有五種: 位置和關鍵字參數混合 , 僅位置參數 , 僅關鍵字參數 , 可變位置參數 , 可變關鍵字參數 。其中僅位置參數的方式僅僅是一個概念,python語法中暫時沒有這樣的設計。
通常我們見到的函數是位置和關鍵字混合的方式。
既可以用關鍵字又可以用位置調用
或
這種方式的定義只能使用關鍵字傳參的模式
f(*some_list) 與 f(arg1, arg2, ...) (其中some_list = [arg1, arg2, ...])是等價的
網絡模塊request的request方法的設計
多數的可選參數被設計成可變關鍵字參數
有多種方法能夠為函數定義輸出:
非?;逎?/p>
如果使用可變對象作為函數的默認參數,會導致默認參數在所有的函數調用中被共享。
例子1:
addItem方法的data設計了一個默認參數,使用不當會造成默認參數被共享。
python里面,函數的默認參數被存在__default__屬性中,這是一個元組類型
例子2:
在例子1中,默認參數是一個列表,它是mutable的數據類型,當它寫進 __defauts__屬性中時,函數addItem的操作并不會改變它的id,相當于 __defauts__只是保存了data的引用,對于它的內存數據并不關心,每次調用addItem,都可以修改 addItem.__defauts__中的數據,它是一個共享數據。
如果默認參數是一個imutable類型,情況將會不一樣,你無法改變默認參數第一次存入的值。
例子1中,連續調用addItem('world') 的結果會是
而不是期望的
python 函數參數類型
python 的函數參數類型分為4種:
1.位置參數:調用函數時根據函數定義的參數位置來傳遞參數,位置參數也可以叫做必要參數,函數調用時必須要傳的參數。
當參數滿足函數必要參數傳參的條件,函數能夠正常執行:
add(1,2) #兩個參數的順序必須一一對應,且少一個參數都不可以
當我們運行上面的程序,輸出:
當函數需要兩個必要參數,但是調用函數只給了一個參數時,程序會拋出異常
add(1)
當我們運行上面的程序,輸出:
當函數需要兩個必要參數,但是調用函數只給了三個參數時,程序會拋出異常
add(1,2,3)
當我們運行上面的程序,輸出
2.關鍵字參數:用于函數調用,通過“鍵-值”形式加以指定??梢宰尯瘮蹈忧逦?、容易使用,同時也清除了參數的順序需求。
add(1,2) # 這種方式傳參,必須按順序傳參:x對應1,y對應:2
add(y=2,x=1) #以關健字方式傳入參數(可以不按順序)
正確的調用方式
add(x=1, y=2)
add(y=2, x=1)
add(1, y=2)
以上調用方式都是允許的,能夠正常執行
錯誤的調用方式
add(x=1, 2)
add(y=2, 1)
以上調用都會拋出SyntaxError 異常
上面例子可以看出:有位置參數時,位置參數必須在關鍵字參數的前面,但關鍵字參數之間不存在先后順序的
3.默認參數:用于定義函數,為參數提供默認值,調用函數時可傳可不傳該默認參數的值,所有位置參數必須出現在默認參數前,包括函數定義和調用,有多個默認參數時,調用的時候,既可以按順序提供默認參數,也可以不按順序提供部分默認參數。當不按順序提供部分默認參數時,需要把參數名寫上
默認參數的函數定義
上面示例第一個是正確的定義位置參數的方式,第二個是錯誤的,因為位置參數在前,默認參數在后
def add1(x=1,y) 的定義會拋出如下異常
默認參數的函數調用
注意:定義默認參數默認參數最好不要定義為可變對象,容易掉坑
不可變對象:該對象所指向的內存中的值不能被改變,int,string,float,tuple
可變對象,該對象所指向的內存中的值可以被改變,dict,list
這里只要理解一下這個概念就行或者自行百度,后續會寫相關的專題文章講解
舉一個簡單示例
4.可變參數區別:定義函數時,有時候我們不確定調用的時候會多少個參數,j就可以使用可變參數
可變參數主要有兩類:
*args: (positional argument) 允許任意數量的可選位置參數(參數),將被分配給一個元組, 參數名前帶*,args只是約定俗成的變量名,可以替換其他名稱
**kwargs:(keyword argument) 允許任意數量的可選關鍵字參數,,將被分配給一個字典,參數名前帶**,kwargs只是約定俗成的變量名,可以替換其他名稱
*args 的用法
args 是用來傳遞一個非鍵值對的可變數量的參數列表給函數
語法是使用 符號的數量可變的參數; 按照慣例,通常是使用arg這個單詞,args相當于一個變量名,可以自己定義的
在上面的程序中,我們使用* args作為一個可變長度參數列表傳遞給add()函數。 在函數中,我們有一個循環實現傳遞的參數計算和輸出結果。
還可以直接傳遞列表或者數組的方式傳遞參數,以數組或者列表方式傳遞參數名前面加(*) 號
理解* * kwargs
**kwargs 允許你將不定長度的鍵值對, 作為參數傳遞給函數,這些關鍵字參數在函數內部自動組裝為一個dict
下篇詳細講解 *args, **kwargs 的參數傳遞和使用敬請關注
Python基礎之pytest參數化
pytest是目前比較成熟功能齊全的測試框架,使用率肯定也不斷攀升。在實際
工作中,許多測試用例都是類似的重復,一個個寫最后代碼會顯得很冗余。這里,我們來了解一下
@pytest.mark.parametrize裝飾器,可以很好的解決上述問題。
釋義:參數名稱
格式:字符串"arg1,arg2,arg3"
釋義:參數值列表
格式:必須是列表,如[val1,val2,val3]
單個參數,里面是值的列表,如@pytest.mark.parametrize("name",["Jack","Locus","Bill"])
多個參數,需要用元祖來存放值,一個元祖對應一組參數的值,如@pytest.mark.parametrize("user,age",[("user1",15),("user2",24),("user3",25)])
釋義:可以理解為用例的id
格式:字符串列表,如["case1","case2","case3"]
釋義:當indirect=True時,若傳入的argnames是fixture函數名,此時fixture函數名將成為一個可執行的函數,
argvalues作為fixture的參數,執行fixture函數,最終結果再存入 request.param;當indirect=False時,fixture
函數只作為一個參數名給測試收集階段調用。
備注:這里可以將the setup phase(測試設置階段)理解為配置 conftest.py 階段,將the collection phase(
測試收集階段)理解為用例執行階段。
由以上代碼可以看到,當裝飾器裝飾測試類時,定義的數據集合會被傳遞給類的所有方法。
當測試用例只需要一個參數時,我們存放數據的列表無序嵌套序列,@pytest.mark.parametrize("name", data)
裝飾器的第一個參數也只需要一個變量接收列表中的每個元素,第二個參數傳遞存儲數據的列表,那么測試用
例需要使用同名的字符串接收測試數據(實例中的name)且列表有多少個元素就會生成并執行多少個測試用例。
當測試用例需要多個數據時,我們可以使用嵌套序列(嵌套元組嵌套列表)的列表來存放測試數據。
裝飾器@pytest.mark.parametrize()可以使用單個變量接收數據,也可以使用多個變量接收,同樣,測
試用例函數也需要與其保持一致。
當使用單個變量接收時,測試數據傳遞到測試函數內部時為列表中的每一個元素或者小列表,需
要使用索引的方式取得每個數據。
當使用多個變量接收數據時,那么每個變量分別接收小列表或元組中的每個元素列表嵌套多少個多
組小列表或元組,測生成多少條測試用例。
通過測試結果,我們不難分析,一個測試函數還可以同時被多個參數化裝飾器裝飾,那么多個
裝飾器中的數據會進行交叉組合的方式傳遞給測試函數,進而生成n * n個測試用例。
輸出結果顯示收集到4個用例,兩個通過,一個被跳過,一個標記失敗,當我們不想執行某組測試
數據時,我們可以標記skip或skipif;當我們預期某組數據會執行失敗時,我們可以標記為xfail等。
參數化裝飾器有一個額外的參數ids,可以標識每一個測試用例,自定義測試數據結果的顯示,
為了增加可讀性,我們可以標記每一個測試用例使用的測試數據是什么,適當的增加一些說明。
在使用前你需要知道,ids參數應該是一個字符串列表,必須和數據對象列表的長度保持一致。
不加ids參數的返回結果
加ids參數的返回結果
我們可以看到帶ids參數的返回結果中的用例都被一個列表明確的標記了,而且通過這種標記
可以更加直觀的看出來,每個測試用例使用的數據名稱及測試內容。
文章標題:python函數參數化 python 參數為函數
分享地址:http://www.xueling.net.cn/article/dosjpis.html