1、定義函數(shù)
公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出龍安免費做網(wǎng)站回饋大家。
函數(shù)是可重用的程序。本書中已經(jīng)使用了許多內(nèi)建函數(shù),如len()函數(shù)和range()函數(shù),但是還沒自定義過函數(shù)。定義函數(shù)的語法格式如下:
def 函數(shù)名(參數(shù)):
函數(shù)體
定義函數(shù)的規(guī)則如下:
①關(guān)鍵字def用來定義一個函數(shù),它是define的縮寫。
②函數(shù)名是函數(shù)的唯一標識,函數(shù)名的命名規(guī)則遵循標識符的命名規(guī)則。
③函數(shù)名后面一定要緊跟著一個括號,括號內(nèi)的參數(shù)是可選的,括號后面要有冒號。
④函數(shù)體(statement)為一個或一組Python語句,注意要有縮進。
⑤函數(shù)體的第一行可以有文檔字符串,用于描述函數(shù)的功能,用三引號括起來。
按照定義規(guī)則,可以定義第一個函數(shù)了:
def?hello_world():
...?????print('Hello,world!')???#?注意函數(shù)體要有縮進
...
hello_world()
Hello,world!
這個函數(shù)不帶任何參數(shù),它的功能是打印出“Hello,world!”。最后一行代碼hello_world()是調(diào)用函數(shù),即讓Python執(zhí)行函數(shù)的代碼。
2、全局變量和局部變量
全局變量是定義在所有函數(shù)外的變量。例如,定義一個全局變量a,分別在函數(shù)test1()和test2()使用變量a:
a?=?100???#?全局變量
def?test1():
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
100
test2()
100
定義了全局變量a之后,在函數(shù)test1()和test2()內(nèi)都可以使用變量a,由此可知,全局變量的作用范圍是全局。
局部變量是在函數(shù)內(nèi)定義的變量,除了用關(guān)鍵字global修飾的變量以外。例如,在函數(shù)test1()內(nèi)定義一個局部變量a,分別在函數(shù)外和另一個函數(shù)test2()內(nèi)使用變量a:
def?test1():
...?????a?=?100???#?局部變量
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
100
print(a)
Traceback?(most?recent?call?last):
File?"stdin",?line?1,?in?module
NameError:?name?'a'?is?not?defined
test2()
Traceback?(most?recent?call?last):
File?"stdin",?line?1,?in?module
File?"stdin",?line?2,?in?test2
NameError:?name?'a'?is?not?defined
Python解釋器提示出錯了。由于局部變量a定義在函數(shù)test1()內(nèi),因此,在函數(shù)test1()內(nèi)可以使用變量a,但是在函數(shù)外或者另一個函數(shù)test2()內(nèi)使用變量a,都會報錯,由此可見,局部變量的作用范圍是定義它的函數(shù)內(nèi)部。
一般情況下,在函數(shù)內(nèi)聲明的變量都是局部變量,但是采用關(guān)鍵字global修飾的變量卻是全局變量:
def?test1():
...?????global?a???#?全局變量
...?????a?=?100
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
100
print(a)
100
test2()
100
這個程序與上個程序相比,只是在函數(shù)test1()中多了一行代碼“global a”,程序便可以正確運行了。在函數(shù)test1()中,采用關(guān)鍵字global修飾了變量a之后,變量a就變成了全局變量,不僅可以在該函數(shù)內(nèi)使用,還可以在函數(shù)外或者其他函數(shù)內(nèi)使用。
如果在某個函數(shù)內(nèi)局部變量與全局變量同名,那么在該函數(shù)中局部變量會覆蓋全局變量:
a?=?100???#?全局變量
def?test1():
...?????a?=?200???#?同名局部變量
...?????print(a)
...
def?test2():
...?????print(a)
...
test1()
200
test2()
100
由于在函數(shù)test1()中定義了一個與全局變量同名的局部變量a,因此,在函數(shù)test1()中全局變量a的值被局部變量覆蓋了,但是在函數(shù)test2()中全局變量a的值沒有被覆蓋。
綜上所述,在Python中,全局變量保存的數(shù)據(jù)供整個腳本文件使用;而局部變量只用于臨時保存數(shù)據(jù),變量僅供局部代碼塊使用。
第一個那個*x是*args的意思,就是任意個參數(shù),C++里的 va_arg,...符號這種,python函數(shù)里可以有*args和**kwargs。
*args之后可以隨便放有默認值的和沒有默認值的。
因為這之后的任何東西都得用”y=1“”z=1“這種來賦值。
比如說第一個函數(shù),def fun(*x, y=4, z),我寫fun(1,2,3,4,5),這五個數(shù)全跑到*x里了。我想給y和z賦值必須要寫fun(1,2,3,4,5,y=6,z=7)。相當于z跟有默認值的那種也差不多了。所以規(guī)定可以把z放在*x后面的任何位置,包括y=4后面,它們的位置關(guān)系已經(jīng)沒有用了。
規(guī)定def fun(x=4, y) y必須放在x前,就是要保留這種位置關(guān)系,要不我寫fun(1),你說這個1是給x的還是y的?就有了歧義。所以必須要有正確的位置關(guān)系。但是*x后面所有東西都是用參數(shù)名賦值的,位置關(guān)系不起作用了,所以可以任意順序了。
要理解規(guī)定背后的原因。同理,**kwargs放在最后,也是這個原因。消除歧義性。
Ball是一個類,類定義 在代碼 最前面
myBall=Ball() Ball() 生成 一個Ball類的實例,myBall是一個Ball類實例
myBall.bounce()調(diào)用 類方法bounce
【常見的內(nèi)置函數(shù)】
1、enumerate(iterable,start=0)
是python的內(nèi)置函數(shù),是枚舉、列舉的意思,對于一個可迭代的(iterable)/可遍歷的對象(如列表、字符串),enumerate將其組成一個索引序列,利用它可以同時獲得索引和值。
2、zip(*iterables,strict=False)
用于將可迭代的對象作為參數(shù),將對象中對應(yīng)的元素打包成一個個元組,然后返回由這些元組組成的列表。如果各個迭代器的元素個數(shù)不一致,則返回列表長度與最短的對象相同,利用*號操作符,可以將元組解壓為列表。
3、filter(function,iterable)
filter是將一個序列進行過濾,返回迭代器的對象,去除不滿足條件的序列。
4、isinstance(object,classinfo)
是用來判斷某一個變量或者是對象是不是屬于某種類型的一個函數(shù),如果參數(shù)object是classinfo的實例,或者object是classinfo類的子類的一個實例,
返回True。如果object不是一個給定類型的的對象, 則返回結(jié)果總是False
5、eval(expression[,globals[,locals]])
用來將字符串str當成有效的表達式來求值并返回計算結(jié)果,表達式解析參數(shù)expression并作為Python表達式進行求值(從技術(shù)上說是一個條件列表),采用globals和locals字典作為全局和局部命名空間。
【常用的句式】
1、format字符串格式化
format把字符串當成一個模板,通過傳入的參數(shù)進行格式化,非常實用且強大。
2、連接字符串
常使用+連接兩個字符串。
3、if...else條件語句
Python條件語句是通過一條或多條語句的執(zhí)行結(jié)果(True或者False)來決定執(zhí)行的代碼塊。其中if...else語句用來執(zhí)行需要判斷的情形。
4、for...in、while循環(huán)語句
循環(huán)語句就是遍歷一個序列,循環(huán)去執(zhí)行某個操作,Python中的循環(huán)語句有for和while。
5、import導入其他腳本的功能
有時需要使用另一個python文件中的腳本,這其實很簡單,就像使用import關(guān)鍵字導入任何模塊一樣。
可以使用 pytest.fixture() 查看 fixture() 函數(shù)的源碼和所需要的參數(shù),同F(xiàn)ixture裝飾器需要的參數(shù)一樣。
說明:
使用Fixture裝飾器來實現(xiàn)部分用例的前后置。
比如:我們在測試一個操作流程時,有的測試用例需要登陸,有的測試用例執(zhí)行不需要用戶登陸。
如果要直接使用 setup_function() 前置函數(shù)來實現(xiàn),該文件中的所有用例執(zhí)行前都需要進行用戶登陸。
如下示例:
我們可以使用Fixture裝飾器來實現(xiàn)部分用例的前后置,如下示例:
前面的示例,是在用例前加前置條件,相當于執(zhí)行了 setup() 前置函數(shù),既然有 setup() 前置函數(shù)那就會有 teardown() 后置函數(shù),F(xiàn)ixture里面的 teardown() 后置函數(shù)用 yield 來喚醒。
示例:
yield 是當用例執(zhí)行完之后,會執(zhí)行 yield 后面的代碼,但用例不能有 return 返回值。
addfinalizer 實現(xiàn)功能跟 yield 一樣,但是用例可以 return 參數(shù),傳給后面用例。
示例1:
示例2:
示例3:
使用 yield 也可以返回數(shù)據(jù)。(這種方式好神奇)
上面例子是帶返回值并且還要實現(xiàn) teardown() 后置函數(shù)的Fixture寫法。
這里就是單純的說明帶返回值的Fixture。
我們可以選擇讓Fixture返回我們需要的東西,如果Fixture需要配置一些數(shù)據(jù),讀個文件,或者連接一個數(shù)據(jù)庫,那么你可以讓Fixture返回這些數(shù)據(jù)或資源。
示例:
Fixture修飾的函數(shù)可以通過添加 params 參數(shù)來實現(xiàn)參數(shù)化。(實際工作中,不常用此方式)
request 代表Fixture的調(diào)用狀態(tài), request.param 作為返回值供測試使用。
示例:
參數(shù)是一個元組列表格式的數(shù)據(jù)。
總結(jié): params 參數(shù)支持的格式。
@pytest.mark.usefixtures("fixturename") 裝飾類也是一種調(diào)用Fixture的方式。
@pytest.mark.usefixtures("fixturename") 裝飾類可以裝飾模塊、類、函數(shù)、方法。
usefixtures 與傳 fixture 區(qū)別:
如果Fixture有返回值,則不能用 @pytest.mark.usefixtures("fixturename") 裝飾器修飾用例。
如果Fixture沒有返回值,用 @pytest.mark.usefixtures("fixturename") 裝飾器和 @pytest.fixture() 裝飾器作用一樣。
示例: