python

一、Python介紹

Python 是一個高層次的結(jié)合了解釋性脖律、編譯性、互動性和面向?qū)ο蟮哪_本語言腕侄。

Python 的設(shè)計具有很強(qiáng)的可讀性小泉,相比其他語言經(jīng)常使用英文關(guān)鍵字,其他語言的一些標(biāo)點符號冕杠,它具有比其他語言更有特色語法結(jié)構(gòu)微姊。

Python 是一種解釋型語言: 這意味著開發(fā)過程中沒有了編譯這個環(huán)節(jié)。類似于PHP和Perl語言分预。

Python 是交互式語言: 這意味著柒桑,您可以在一個Python提示符,直接互動執(zhí)行寫你的程序噪舀。

Python 是面向?qū)ο笳Z言: 這意味著Python支持面向?qū)ο蟮娘L(fēng)格或代碼封裝在對象的編程技術(shù)魁淳。

Python 是初學(xué)者的語言:Python 對初級程序員而言,是一種偉大的語言与倡,它支持廣泛的應(yīng)用程序開發(fā)界逛,從簡單的文字處理到 WWW 瀏覽器再到游戲。

二纺座、發(fā)展歷程

Python 是由 Guido van Rossum 在八十年代末和九十年代初息拜,在荷蘭國家數(shù)學(xué)和計算機(jī)科學(xué)研究所設(shè)計出來的。

Python 本身也是由諸多其他語言發(fā)展而來的,這包括 ABC净响、Modula-3少欺、C、C++馋贤、Algol-68赞别、SmallTalk、Unix shell 和其他的腳本語言等等配乓。

像 Perl 語言一樣仿滔,Python 源代碼同樣遵循 GPL(GNU General Public License)協(xié)議。

現(xiàn)在 Python 是由一個核心開發(fā)團(tuán)隊在維護(hù)犹芹,Guido van Rossum 仍然占據(jù)著至關(guān)重要的作用崎页。

三、Python的特點

易于學(xué)習(xí):Python有相對較少的關(guān)鍵字腰埂,結(jié)構(gòu)簡單飒焦,和一個明確定義的語法,學(xué)習(xí)起來更加簡單屿笼。

易于閱讀:Python代碼定義的更清晰牺荠。

易于維護(hù):Python的成功在于它的源代碼是相當(dāng)容易維護(hù)的翁巍。

一個廣泛的標(biāo)準(zhǔn)庫:Python的最大的優(yōu)勢之一是豐富的庫,跨平臺的志电,在UNIX,Windows和Macintosh兼容很好蛔趴。

互動模式:互動模式的支持挑辆,您可以從終端輸入執(zhí)行代碼并獲得結(jié)果的語言,互動的測試和調(diào)試代碼片斷孝情。

可移植:基于其開放源代碼的特性鱼蝉,Python已經(jīng)被移植(也就是使其工作)到許多平臺。

可擴(kuò)展:如果你需要一段運行很快的關(guān)鍵代碼箫荡,或者是想要編寫一些不愿開放的算法魁亦,你可以使用C或C++完成那部分程序,然后從你的Python程序中調(diào)用羔挡。

數(shù)據(jù)庫:Python提供所有主要的商業(yè)數(shù)據(jù)庫的接口洁奈。

GUI編程:Python支持GUI可以創(chuàng)建和移植到許多系統(tǒng)調(diào)用。

可嵌入: 你可以將Python嵌入到C/C++程序绞灼,讓你的程序的用戶獲得"腳本化"

四利术、Pycharm及python安裝詳細(xì)教程

4.1. 安裝python

4.1.1.python下載地址

進(jìn)入之后如下圖,選擇圖中紅色圈中區(qū)域進(jìn)行下載

image.png

4.1.2. 下載完成后如下圖所示

image.png

4.1.3. 安裝

雙擊exe文件進(jìn)行安裝低矮,如下圖印叁,并按照圈中區(qū)域進(jìn)行設(shè)置,切記要勾選打鉤的框军掂,然后再點擊Customize installation進(jìn)入到下一步:

image.png

image.png

image.png

4.1.4. 自定義安裝路徑

對于上圖中轮蜕,可以通過Browse進(jìn)行自定義安裝路徑,也可以直接點擊Install進(jìn)行安裝蝗锥,點擊install后便可以完成安裝了跃洛。

image.png

4.1.5. 檢測安裝是否成功

為了檢查我們的python是否安裝成功,可以在命令窗口中輸入python進(jìn)行查詢终议,如顯示下圖一的信息則表示成功了税课,如顯示第二張圖的信息則表示出錯了。

image.png

4.2. 安裝pycharm

4.2.1.下載地址

首先從網(wǎng)站下載pycharm痊剖,進(jìn)入之后如下圖韩玩,根據(jù)自己電腦的操作系統(tǒng)進(jìn)行選擇,對于windows系統(tǒng)選擇圖中紅色圈中的區(qū)域陆馁。

image.png

4.2.2. 下載完成之后如下圖:

image.png

4.2.3. 直接雙擊下載好的exe文件進(jìn)行安裝找颓,安裝截圖如下:

image.png

點擊Next進(jìn)入下一步:

image.png

點擊Next進(jìn)入下一步:

image.png

點擊Install進(jìn)行安裝:

image.png

image.png

安裝完成后出現(xiàn)下圖界面,點級Finish結(jié)束安裝:

image.png

下面我們來創(chuàng)建自己的第一個程序:

1叮贩、單擊桌面上的pycharm圖標(biāo)击狮,進(jìn)入到pycharm中佛析,如下圖所示:

image.png

2、我們選擇第二個彪蓬,然后點擊Ok:

image.png

3寸莫、點擊上圖中的Accept進(jìn)入下一步:

image.png

4、點擊上圖中的ok進(jìn)入下一步:

image.png

5档冬、點擊Create New Project膘茎,進(jìn)入如下圖的界面,圖中的Location是選擇你安裝的python的位置酷誓,選擇好后披坏,點擊create。

image.png

五盐数、第一個Python程序

1.創(chuàng)建python file

2.練習(xí)打印hello world

image.png

六棒拂、Python變量和數(shù)據(jù)類型

6.1. 變量的定義

在程序中,有時我們需要對2個數(shù)據(jù)進(jìn)行求和玫氢,那么該怎樣做呢帚屉?

大家類比一下現(xiàn)實生活中,比如去超市買東西漾峡,往往咱們需要一個菜籃子涮阔,用來進(jìn)行存儲物品,等到所有的物品都購買完成后灰殴,在收銀臺進(jìn)行結(jié)賬即可

如果在程序中敬特,需要把2個數(shù)據(jù),或者多個數(shù)據(jù)進(jìn)行求和的話牺陶,那么就需要把這些數(shù)據(jù)先存儲起來伟阔,然后把它們累加起來即可

在Python中,存儲一個數(shù)據(jù)掰伸,需要一個叫做變量的東西皱炉,如下示例:

num1=100#num1就是一個變量,就好一個小菜籃子num2=87#num2也是一個變量result=num1+num2 #把num1和num2這兩個"菜籃子"中的數(shù)據(jù)進(jìn)行累加狮鸭,然后放到 result變量中

說明:

所謂變量合搅,可以理解為菜籃子,如果需要存儲多個數(shù)據(jù)歧蕉,最簡單的方式是有多個變量灾部,當(dāng)然了也可以使用一個

程序就是用來處理數(shù)據(jù)的,而變量就是用來存儲數(shù)據(jù)的

程序中:

為了更充分的利用內(nèi)存空間以及更有效率的管理內(nèi)存惯退,變量是有不同的類型的赌髓,如下所示:

Python3 中有六個標(biāo)準(zhǔn)的數(shù)據(jù)類型:

image.png

Python3 的六個標(biāo)準(zhǔn)數(shù)據(jù)類型中:

不可變數(shù)據(jù)(3 個):Number(數(shù)字)、String(字符串)、Tuple(元組)锁蠕;

可變數(shù)據(jù)(3 個):List(列表)夷野、Dictionary(字典)、Set(集合)荣倾。

注意:在python中悯搔,只要定義了一個變量,而且它有數(shù)據(jù)舌仍,那么它的類型就已經(jīng)確定了妒貌,不需要咱們開發(fā)者主動的去說明它的類型,系統(tǒng)會自動辨別

可以使用type(變量的名字)抡笼,來查看變量的類型

6.1.1 概念

整數(shù)

Python可以處理任意大小的整數(shù)苏揣,當(dāng)然包括負(fù)整數(shù)黄鳍,在Python程序中推姻,整數(shù)的表示方法和數(shù)學(xué)上的寫法一模一樣,例如:1框沟,100藏古,-8080,0忍燥,等等拧晕。

浮點數(shù)

浮點數(shù)也就是小數(shù),之所以稱為浮點數(shù)梅垄,是因為按照科學(xué)記數(shù)法表示時厂捞,一個浮點數(shù)的小數(shù)點位置是可變的,比如队丝,1.23x109和12.3x108是相等的靡馁。浮點數(shù)可以用數(shù)學(xué)寫法,如1.23机久,3.14臭墨,-9.01,等等膘盖。

整數(shù)和浮點數(shù)在計算機(jī)內(nèi)部存儲的方式是不同的胧弛,整數(shù)運算永遠(yuǎn)是精確的(除法難道也是精確的?是的O琅稀)结缚,而浮點數(shù)運算則可能會有四舍五入的誤差。

字符串

字符串是以''或""括起來的任意文本软棺,比如'abc'掺冠,"xyz"等等。請注意,''或""本身只是一種表示方式德崭,不是字符串的一部分斥黑,因此,字符串'abc'只有a眉厨,b锌奴,c這3個字符。

布爾值

布爾值和布爾代數(shù)的表示完全一致憾股,一個布爾值只有True鹿蜀、False兩種值,要么是True服球,要么是False茴恰,在Python中,可以直接用True斩熊、False表示布爾值(請注意大小寫)往枣,也可以通過布爾運算計算出來。

布爾值可以用and粉渠、or和not運算分冈。

and運算是與運算,只有所有都為 True霸株,and運算結(jié)果才是 True雕沉。A與B true true

or運算是或運算,只要其中有一個為 True去件,or 運算結(jié)果就是 True坡椒。

not運算是非運算,它是一個單目運算符尤溜,把 True 變成 False倔叼,F(xiàn)alse 變成 True。

空值

空值是Python里一個特殊的值靴跛,用None表示缀雳。None不能理解為0,因為0是有意義的梢睛,而None是一個特殊的空值肥印。

6.1.2 代碼示例

#整數(shù)a=1;#浮點數(shù)b=1.1;#字符串c="abc";#boolean類型d=True;#空值e=None;print(a);print(b);print(c);print(d);print(e)a=TrueandTrue# ==> Trueb=TrueandFalse# ==> Falsec=FalseandTrue# ==> Falsed=FalseandFalse# ==> Falsee=TrueorTrue# ==> Truef=TrueorFalse# ==> Trueg=FalseorTrue# ==> Trueh=FalseorFalse# ==> Falsei=notTrue# ==> Falsej=notFalse# ==> Trueprint(a,b,c,d,e,f,g,h,i,j)

說明:

在計算 a and b 時,如果 a 是 False,則根據(jù)與運算法則,整個結(jié)果必定為 False钩乍,因此返回 a云茸;如果 a 是 True雅倒,則整個計算結(jié)果必定取決與 b,因此返回 b哩俭。

在計算 a or b 時桦踊,如果 a 是 True绞蹦,則根據(jù)或運算法則力奋,整個計算結(jié)果必定為 True,因此返回 a幽七;如果 a 是 False景殷,則整個計算結(jié)果必定取決于 b,因此返回 b澡屡。

所以Python解釋器在做布爾運算時猿挚,只要能提前確定計算結(jié)果,它就不會往后算了驶鹉,直接返回結(jié)果绩蜻。

6.1.3 標(biāo)識符

什么是標(biāo)識符?

開發(fā)人員在程序中自定義的一些符號和名稱

標(biāo)識符是自己定義的,如變量名 室埋、函數(shù)名等

標(biāo)識符的命名規(guī)則

. 標(biāo)識符只能由字母办绝、下劃線“_”、數(shù)字組成词顾。. 標(biāo)識符不能以數(shù)字開頭八秃。. 標(biāo)識符不能使用關(guān)鍵字. 標(biāo)識符對大小寫敏感碱妆。(建議:標(biāo)識符命名應(yīng)“見名知意”)

python中的關(guān)鍵字

'False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

注釋:

單行注釋:

/*? *///定義一個變量name="jack"

多行注釋:

'''

定義一個變量

'''name="jack"

課堂思考:下列哪些標(biāo)識符符合規(guī)則

ifname? and? my_list? ? my_list1from#1age2listasTruewetyui? height? ? my_log? ? qwe&qwe

標(biāo)識符的命名方法

小駝峰式命名法:

函數(shù)名? ? ? addName

大駝峰式命名法:

類名? ? ? AddName

6.2.Python中print語句

print() 方法用于打印輸出肉盹,最常見的一個函數(shù)。

語法:

print(*objects, sep=' ', end='\n', file=sys.stdout)

參數(shù):

objects -- 復(fù)數(shù)疹尾,表示可以一次輸出多個對象上忍。輸出多個對象時,需要用 , 分隔纳本。

sep -- 用來間隔多個對象窍蓝,默認(rèn)值是一個空格。

end -- 用來設(shè)定以什么結(jié)尾繁成。默認(rèn)值是換行符 \n吓笙,我們可以換成其他字符串。

file -- 要寫入的文件對象巾腕。

#直接打印print("哈哈哈哈")#多條打印print("哈哈哈哈","呵呵呵呵","吼吼吼吼"),#打印+計算print("100+200的和是:",100+200);#設(shè)置間隔符號print("www","runoob","com",sep=".")? # 設(shè)置間隔符? www.runoob.com

格式化輸出

方式一:使用百分號(%)字符串格式化

print("my name is %s, and my age is %d" %(name,age))

方式二:使用format字符串格式化

位置參數(shù)

print("my name is{}, and my age is{}".format(age,name))

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

print("my name is {name}, and my age is {age}".format(age=18,name="jack"))

注釋:位置參數(shù)("{0}".format())面睛,關(guān)鍵字參數(shù)("{關(guān)鍵字}".format())

6.3.設(shè)置換行符號

print(a,b,c,d,e,sep=";",end="\n");

6.4.Python中input語句

input() 用來獲取控制臺的輸入。

語法:

input([prompt])

image.png

6.5.Python中變量

在Python中尊搬,變量的概念基本上和初中代數(shù)的方程變量是一致的叁鉴。

例如,對于方程式 y=x*x 佛寿,x就是變量幌墓。當(dāng)x=2時,計算結(jié)果是4,當(dāng)x=5時常侣,計算結(jié)果是25蜡饵。

只是在計算機(jī)程序中,變量不僅可以是數(shù)字胳施,還可以是任意數(shù)據(jù)類型验残。

在Python程序中,變量是用一個變量名表示巾乳,變量名必須是大小寫英文您没、數(shù)字和下劃線(_)的組合,且不能用數(shù)字開頭胆绊,比如:

a = 123? ? # a是整數(shù)print (a)a = 'imooc'? # a變?yōu)樽址畃rint (a)b=11; #b是整數(shù)d=11.1;#d是浮點數(shù)print(b*d)

七氨鹏、Python條件循環(huán)和判斷

7.1. If語句

Python 編程中 if 語句用于控制程序的執(zhí)行,基本形式為:

if 判斷條件:? ? 執(zhí)行語句……else:? ? 執(zhí)行語句……

其中"判斷條件"成立時(非零)压状,則執(zhí)行后面的語句仆抵,而執(zhí)行內(nèi)容可以多行,以縮進(jìn)來區(qū)分表示同一范圍种冬。

else 為可選語句镣丑,當(dāng)需要在條件不成立時執(zhí)行內(nèi)容則可以執(zhí)行相關(guān)語句,具體

7.2.If else 語句

age = 12if age>18:? ? print("年齡大于18")else:? ? print("年齡小于等于18")age=20;if age>18:? ? print("年齡大于18")if not age <=18:? ? print("年齡大于18")

注意:Python代碼的縮進(jìn)規(guī)則娱两。具有相同縮進(jìn)的代碼被視為代碼塊莺匠,上面的 print 語句就構(gòu)成一個代碼塊。如果 if 語句判斷為 True十兢,就會執(zhí)行這個代碼塊趣竣。

縮進(jìn)請嚴(yán)格按照Python的習(xí)慣寫法:4個空格,一個Tab旱物,更不要混合Tab和空格遥缕,否則很容易造成因為縮進(jìn)引起的語法錯誤。

7.3. If else else 多層嵌套方式

age=10;if age >= 18:? ? print ('adult')else:? ? if age >= 6:? ? ? ? print ('teenager')? ? else:? ? ? ? if age >= 3:? ? ? ? ? ? print ('kid')? ? ? ? else:? ? ? ? ? ? print ('baby')

標(biāo)準(zhǔn)格式

if 語句的判斷條件可以用>(大于)宵呛、<(小于)单匣、==(等于)、>=(大于等于)宝穗、<=(小于等于)來表示其關(guān)系户秤。

當(dāng)判斷條件為多個值時,可以使用以下形式:

if 判斷條件1:? ? 執(zhí)行語句1……elif 判斷條件2:? ? 執(zhí)行語句2……elif 判斷條件3:? ? 執(zhí)行語句3……else:執(zhí)行語句4……

案例:

score=85;if score>=90:? ? print("成績優(yōu)秀")elif score>=80:? ? print("成績不錯")elif score>=60:? ? print("及格")else:? ? print("不及格");

7.4. For循環(huán):重復(fù)執(zhí)行語句

forn inrange(1,20):print(n)arr=[100,90,86,80,77]forindex in arr:print(index)

注意:? b這個變量是在 for 循環(huán)中定義的讽营,意思是虎忌,依次取出list中的每一個元素,并把元素賦值給 name橱鹏,然后執(zhí)行for循環(huán)體(就是縮進(jìn)的代碼塊)

練習(xí):求四個同學(xué)的平均成績 L = [75, 92, 59, 68]

arr=[100,90,86,80,77]sum=0.0forindex in arr:sum+=indexprint(sum/len(arr))

7.5. While 循環(huán)

Python 編程中 while 語句用于循環(huán)執(zhí)行程序膜蠢,即在某條件下堪藐,循環(huán)執(zhí)行某段程序,以處理需要重復(fù)處理的相同任務(wù)挑围。其基本形式為:

while 判斷條件:? ? 執(zhí)行語句……

執(zhí)行語句可以是單個語句或語句塊礁竞。判斷條件可以是任何表達(dá)式,任何非零杉辙、或非空(null)的值均為true模捂。當(dāng)判斷條件假false時,循環(huán)結(jié)束,while 循環(huán)不會迭代 list 或 tuple 的元素

要從 0 開始打印不大于 N 的整數(shù):

N = 20i = 0while i < N:? ? print(i)? ? i += 1;

練習(xí):求100以內(nèi)的和

sum = 0i = 0while i < 100:? ? sum += i? ? i += 1print(sum)

7.6. Break中斷循環(huán)

break語句用來終止循環(huán)語句蜘矢,即循環(huán)條件沒有False條件或者序列還沒被完全遞歸完狂男,也會停止執(zhí)行循環(huán)語句。

break語句用在while和for循環(huán)中品腹。

如果您使用嵌套循環(huán)岖食,break語句將停止執(zhí)行最深層的循環(huán),并開始執(zhí)行下一行代碼舞吭。

var=10whilevar>0:print(var)var=var-1ifvar==5:# 當(dāng)變量var等于5時退出循環(huán)break

7.7. Continue

Python continue 語句跳出本次循環(huán)泡垃,而break跳出整個循環(huán)。

continue 語句用來告訴Python跳過當(dāng)前循環(huán)的剩余語句羡鸥,然后繼續(xù)進(jìn)行下一輪循環(huán)蔑穴。

continue語句用在while和for循環(huán)中。

var=10whilevar>0:var=var-1ifvar==5:continueprint(var)

7.8.嵌套循環(huán)

Python 語言允許在一個循環(huán)體里面嵌入另一個循環(huán)

for x in ['A', 'B', 'C']:? ? for y in ['1', '2', '3']:? ? ? ? print (x + y)

7.9.Python字符串操作

字符串轉(zhuǎn)義

a='learn? "python" from teacher liang';b='bob said \"I\'m ok\"';print(a)print(b);

\n 表示換行

\t 表示一個制表符

\ 表示 \ 字符本身

字符串截取操作(左閉右開)

a="hello world";print(a[0:2])? #he 截取字符串 從第0到第2個 包含頭不包含尾print(a[1]) #e 某個索引的字符

字符串拼接

b="hello";c="world"d=b+c;print(d)#hello world 字符串拼接

包含不包含,使用in和not in判斷是否包含

e="hello world";f='he' in e;g='haahha' in e;h="he" not in e;i='haahha' not in e;print(f,g); #True False 判斷是否包含print(h,i); #False true 判斷是否不包含

常用字符串的操作api

a="hello world"print(a.upper())#HELLO WORLD 變成大寫b=a.startswith("hello");#true? 是以什么進(jìn)行開頭c=a.endswith("world");#true 以什么進(jìn)行結(jié)尾d=a.replace("h","hhhhh");#hhhhhello world 替換字符print(d);

八惧浴、Python中List和Tuple類型

序列是Python中最基本的數(shù)據(jù)結(jié)構(gòu)存和。

序列中的每個元素都分配一個數(shù)字 - 它的位置,或索引赶舆,第一個索引是0哑姚,第二個索引是1祭饭,依此類推芜茵。

Python有6個序列的內(nèi)置類型,但最常見的是列表和元組倡蝙。

序列都可以進(jìn)行的操作包括索引九串,切片,加寺鸥,乘猪钮,檢查成員。

此外胆建,Python已經(jīng)內(nèi)置確定序列的長度以及確定最大和最小的元素的方法烤低。

列表是最常用的Python數(shù)據(jù)類型,它可以作為一個方括號內(nèi)的逗號分隔值出現(xiàn)笆载。

列表的數(shù)據(jù)項不需要具有相同的類型

創(chuàng)建一個列表扑馁,只要把逗號分隔的不同的數(shù)據(jù)項使用方括號括起來即可涯呻。如下所示:

a= ['physics', 'chemistry', 1997, 2000]b = [1, 2, 3, 4, 5 ]c = ["a", "b", "c", "d"]

8.1. 定義集合

a=["aaa",123,"bbb",True];#定義集合

8.2. 獲取某個索引的元素

print(a[1]);#123 獲取索引值為1處的元素

8.3. 倒序獲取元素

print(a[-1],a[-2],a[-3],a[-4]);#True bbb 123 aaa 倒數(shù)第一個,倒數(shù)第二個腻要,倒數(shù)第三個

8.4.添加元素

追加

a.append("哈哈哈");print(a);#['aaa',123,'bbb',True,'哈哈哈']

插入

a.insert(1,"82歲韓美林);a.insert(2,"PGone")print(a);#['aaa','李小璐','PGone',123,'bbb',True,'哈哈哈']

8.5.刪除元素

a.pop(2);a.pop(1);print(a);#['aaa',123,'bbb',True,'哈哈哈']刪除某索引值的元素

8.6.替換元素

a[2]="賈乃亮";a[-1]="吼吼吼"print(a);#['aaa',123,'賈乃亮',True,'吼吼吼']替換指定位置元素

8.7.定義元組(Tuple)[?tjup(?)l]

Python的元組與列表類似复罐,不同之處在于元組的元素不能修改。

元組使用小括號雄家,列表使用方括號效诅。

元組創(chuàng)建很簡單,只需要在括號中添加元素趟济,并使用逗號隔開即可乱投。

t = ('Adam', 'Lisa', 'Bart')

現(xiàn)在,這個 t 就不能改變了顷编,tuple沒有 append()方法篡腌,也沒有insert()和pop()方法。所以勾效,新同學(xué)沒法直接往 tuple 中添加嘹悼,老同學(xué)想退出 tuple 也不行。

a=("a","b","c");print(a);#('a','b','c')

8.8. 可變Tuple

元組可以使用下標(biāo)索引來訪問元組中的值层宫,如下實例:

a = (1, 2, 3, 4, 5, 6, 7 )print(a[1:5]) # 2,3,4,5

元組中的元素值是不允許修改的杨伙,但我們可以對元組進(jìn)行連接組合,如下實例:

tup1=(12,34.56)tup2=('abc','xyz')tup3=tup1+tup2print(tup3)a=("a","b",["c"]);print(a);#('a','b','c')l=a[2];l.insert(0,"d");print(a)#('a','b',['d','c'])

九萌腿、Dict介紹--字典類型 dictionary

9.1.字典介紹

我們已經(jīng)知道限匣,list 和 tuple 可以用來表示順序集合,例如毁菱,班里同學(xué)的名字:

['Adam','Lisa','Bart']

或者考試的成績列表:

[95,85,59]

但是米死,要根據(jù)名字找到對應(yīng)的成績,用兩個 list 表示就不方便贮庞。

如果把名字和分?jǐn)?shù)關(guān)聯(lián)起來峦筒,組成類似的查找表:

'Adam'==>95'Lisa'==>85'Bart'==>59

給定一個名字,就可以直接查到分?jǐn)?shù)窗慎。

Python的 dict 就是專門干這件事的物喷。用 dict 表示“名字”-“成績”的查找表如下:

d = {? ? 'Adam': 95,? ? 'Lisa': 85,? ? 'Bart': 59}

我們把名字稱為key,對應(yīng)的成績稱為value遮斥,dict就是通過 key 來查找 value峦失。

花括號 {} 表示這是一個dict,然后按照 key: value, 寫出來即可术吗。最后一個 key: value 的逗號可以省略尉辑。

字典是另一種可變?nèi)萜髂P停铱纱鎯θ我忸愋蛯ο蟆?/p>

字典的每個鍵值 key=>value 對用冒號 : 分割较屿,每個鍵值對之間用逗號 , 分割隧魄,整個字典包括在花括號 {} 中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }

鍵必須是唯一的实幕,但值則不必。

值可以取任何數(shù)據(jù)類型堤器,但鍵必須是不可變的昆庇,如字符串,數(shù)字或元組闸溃。

一個簡單的字典實例:

key value(鍵值對)形式數(shù)據(jù)對應(yīng)整吆,比如 name:張三 age:18 sex:男

info={"name":"張三","age":18,"sex":"男"}

9.2. Dict特點

字典和列表一樣,也能夠存儲多個數(shù)據(jù)

列表中找某個元素時辉川,是根據(jù)下標(biāo)進(jìn)行的表蝙;字典中找某個元素時,是根據(jù)'名字'(就是冒號:前面的那個值乓旗,例如上面代碼中的'name'府蛇、'age'、'sex')

dict的第一個特點是查找速度快屿愚,無論dict有10個元素還是10萬個元素汇跨,查找速度都一樣。而list的查找速度隨著元素增加而逐漸下降妆距。

不過dict的查找速度快不是沒有代價的穷遂,dict的缺點是占用內(nèi)存大,還會浪費很多內(nèi)容娱据,list正好相反蚪黑,占用內(nèi)存小,但是查找速度慢中剩。

由于dict是按 key 查找忌穿,所以,在一個dict中结啼,key不能重復(fù)掠剑。

dict的第二個特點就是存儲的key-value序?qū)κ菦]有順序的!這和list不一樣:

dict的第三個特點是作為 key 的元素必須不可變妆棒,Python的基本類型如字符串澡腾、整數(shù)、浮點數(shù)都是不可變的糕珊,都可以作為 key。但是list是可變的毅糟,就不能作為 key红选。

9.3. 元素獲取

print(info["name"])print(info.get("name"))##print(info.get("xx"))如果元素沒有會報錯誤

9.4. 字典的增刪改操作

修改元素

字典中每個元素都是可修改的,只要通過key找到姆另,既可以修改Demo

info["name"]="李四"

添加元素

想要添加元素喇肋,只需要指定key 指定 value就可以

info["address"]="北京"

刪除元素

對字典進(jìn)行刪除操作坟乾,有以下兩種方式:

# del info[] 指定要刪除的元素delinfo["name"]# clear 清空元素info.clear()

9.5. 字典內(nèi)置函數(shù)&方法

號函數(shù)及描述實例

1len(dict)計算字典元素個數(shù),即鍵的總數(shù)蝶防。 >>> dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}>>> len(dict)3

2str(dict)輸出字典甚侣,以可打印的字符串表示。? ? >>> dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}>>> str(dict)"{'Name': 'Runoob', 'Class': 'First', 'Age': 7}"

3type(variable)返回輸入的變量類型间学,如果變量是字典就返回字典類型殷费。? >>> dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}>>> type(dict)<class 'dict'>

9.6.字典的常見操作

keys() 獲取字典的所有key 列表

print(info.keys())

values 獲取字典的所有values 列表

print(info.values())

items 返回一個包含所有元組(鍵,值)的列表

print(info.items())

9.7. 字典的遍歷

遍歷key

for key in info.keys():? ? print(key)

遍歷value

forvalueininfo.values():print(value)

遍歷items

for item in info.items():? print(item)

遍歷key? value

forkey,valueininfo.items():print(key,value)

十低葫、Python中函數(shù)

10.1.什么是函數(shù)

如果在開發(fā)的時候详羡,需要某塊代碼多次,但是為了提高便攜的效率以及代碼的重用嘿悬,所以把具有獨立功能的代碼塊組織成一個小的模塊实柠,這就是函數(shù)。

10.2.函數(shù)定義和調(diào)用

10.2.1.? 定義函數(shù)

定義函數(shù)的格式如下:

def函數(shù)名():代碼

定義一個函數(shù)善涨,能夠完成打印信息的功能

defprintInfo():print'------------------------------------'print'? ? ? ? 人生苦短窒盐,我用Python'print'------------------------------------'

10.2.2. 調(diào)用函數(shù)

定義了函數(shù)之后,就相當(dāng)于有了一個具有某些功能的代碼钢拧,想要讓這些代碼能夠執(zhí)行登钥,需要調(diào)用它

調(diào)用函數(shù)很簡單的,通過函數(shù)名() 即可完成調(diào)用

案例:

# 定義完函數(shù)后娶靡,函數(shù)是不會自動執(zhí)行的牧牢,需要調(diào)用它才可以printInfo()

10.3.函數(shù)的好處

減少代碼的冗余,減少維護(hù)量姿锭,功能的封裝塔鳍,降低學(xué)習(xí)成本,提高開發(fā)速度

10.4. 函數(shù)參數(shù)

定義帶有參數(shù)的函數(shù):

defprintSum(a,b):print(a+b)

調(diào)用帶有參數(shù)的函數(shù)

printSum(10,20)

形式參數(shù)和實際參數(shù)

定義時小括號中的參數(shù)呻此,用來接受參數(shù)用的,稱為“形參”

調(diào)用時小括號中的參數(shù)轮纫,用來傳遞給函數(shù)用的,稱為”實際參數(shù)”

10.5.缺省參數(shù)

默認(rèn)有參數(shù)值的函數(shù)

defstudent(name,age,sex="男"):print(name,age,sex)student("格日倉",18)student("格日倉",20,"女")

10.6. 可變參數(shù)(一 元組類型)

defgetSum(*args):print(args)sum=0foriinargs:sum+=ireturnsumprint(getSum(1,2,3,4))

10.7. 可變參數(shù)(二 字典類型)

dic={'a':90,'b':80,'c':70,'d':100}defkv(**kwargs):print(kwargs)kv(a=90,b=80,c=70,d=100)

十一焚鲜、函數(shù)返回值

所謂返回值掌唾,就是程序中函數(shù)完成一件事后,最后給調(diào)用者的結(jié)果忿磅。

11.1.定義帶有返回值的函數(shù)

11.2.調(diào)用帶有返回值參數(shù)的函數(shù)

11.3.多個返回值的函數(shù)

案例:兩個數(shù)字除數(shù)和商

十二糯彬、函數(shù)類型

12.1.無參數(shù),無返回值的函數(shù)

12.2.無參數(shù)葱她,有返回值的函數(shù)

12.3.有參數(shù)撩扒,無返回值的函數(shù)

12.4.有參數(shù),有返回值的函數(shù)

十三吨些、函數(shù)的嵌套調(diào)用

案例:在函數(shù)A中調(diào)用函數(shù)B搓谆,然后調(diào)用函數(shù)炒辉。

分析調(diào)用順序。

defadd():print("這是add1")print("加法運算的邏輯")defadd2():print("想實現(xiàn)加法的運算")add()print("計算出一個結(jié)果")add2()

十四泉手、局部變量

局部變量黔寇,就是在函數(shù)內(nèi)部定義的變量

不同的函數(shù),可以定義相同的名字的局部變量斩萌,各用個的不會影響

局部變量作用:為了臨時保存數(shù)據(jù)需要在函數(shù)中定義變量來存儲缝裤。

十五、全局變量

如果一個變量术裸,既能在一個函數(shù)中使用倘是,又能在其他函數(shù)中使用,這樣的變量就是全局變量袭艺。

在函數(shù)外邊定義的變量叫做全局變量

全局變量能夠在所有的函數(shù)中進(jìn)行訪問

如果在函數(shù)中修改全局變量搀崭,那么就需要使用global進(jìn)行聲明,否則出錯

如果全局變量的名字和局部變量的名字相同猾编,那么使用的是局部變量的

#全局變量瘤睹,局部變量#全局變量:在函數(shù)外定義的變量#局部變量:在函數(shù)內(nèi)部定義的變量#全局變量與局部變量,就近原則a=100b=200defadd():globala#修改全局變量a=200#局部變量returna+bdefadd2():returna+bre=add()print(re)print(add2())

十六答倡、遞歸函數(shù)

如果一個函數(shù)在內(nèi)部不調(diào)用其它的函數(shù)轰传,而是自己本身的話,這個函數(shù)就是遞歸函數(shù)瘪撇。

16.1.循環(huán)完成

求n的階乘

defgetMultipy(n):i=1result=1whilei<=n:result=result*i? ? ? ? i+=1returnresultprint(getMultipy(10))

16.2.函數(shù)調(diào)用函數(shù)自身

求n的階乘

defgetMultipy(n):ifn>=1:result=n*getMultipy(n-1)else:result=1returnresultprint(getMultipy(3))

十七获茬、Python中模塊和包

在Python中有一個概念叫做模塊(module),這個和C語言中的頭文件以及Java中的包很類似倔既,比如在Python中要調(diào)用sqrt函數(shù)恕曲,必須用import關(guān)鍵字引入math這個模塊。

導(dǎo)入模塊import 語句

模塊定義好后渤涌,我們可以使用 import 語句來引入模塊佩谣,語法如下:

importmodule1[,module2[,...moduleN]

比如要引用模塊 math,就可以在文件最開始的地方用 import math 來引入实蓬。

在調(diào)用 math 模塊中的函數(shù)時茸俭,必須這樣引用:

#模塊名.函數(shù)名importmathprint(math.pi);#3.141592653589793

from…import 語句

Python 的 from 語句讓你從模塊中導(dǎo)入一個指定的部分到當(dāng)前命名空間中。語法如下:

from modname import name1[, name2[, ... nameN]]

例如安皱,要導(dǎo)入模塊 math 的 pi 函數(shù)调鬓,使用如下語句:

frommathimportpiprint(pi)

17.1.導(dǎo)入自定義模塊

在test1中定義求和方法

defsum(a,b):returna+b

test中直接導(dǎo)入方法

fromtest2importsumprint(sum(1,2))

十八、文件操作

18.1. 什么是文件

使用文件的目的:就是把一些文件存儲存放起來练俐,可以讓程序下一次執(zhí)行的時候直接使用袖迎,而不必重新制作一份,省時省力

在操作文件的整體過程與使用word編寫一份簡歷的過程是很相似的:

打開文件腺晾,或者新建立一個文件

讀/寫數(shù)據(jù)

關(guān)閉文件

18.2. 打開燕锥、關(guān)閉文件

python中打開文件,可以使用open函數(shù)悯蝉,可以打開一個已經(jīng)存在的文件归形,或者創(chuàng)建一個新的文件。

open(文件名鼻由,訪問模式)

# 新建一個文件暇榴,文件名為:test.txtf = open('test.txt', 'w')# 關(guān)閉這個文件f.close()

18.3. 文件訪問模式

文件打開分為兩種:文本模式(r/w/a),二進(jìn)制模式(rb/wb/ab)

image.png

18.4. 文件的讀寫

寫數(shù)據(jù)(write) - write()方法

write()方法可將任何字符串寫入一個打開的文件蕉世。需要重點注意的是蔼紧,Python字符串可以是二進(jìn)制數(shù)據(jù),而不是僅僅是文字狠轻。

write()方法不會在字符串的結(jié)尾添加換行符('\n'):

f=open('test.txt','w')f.write('hello world, i am here!')f.close()

讀數(shù)據(jù)(read)

使用read(num)可以從文件中讀取數(shù)據(jù)奸例,num表示要從文件中讀取的數(shù)據(jù)的長度(單位是字節(jié)),如果沒有傳入num向楼,那么就表示讀取文件中所有的數(shù)據(jù)

f = open('test3.txt','r')print(f.read())

Python寫入內(nèi)容

file=open("test.txt","r+")content=file.read(2)print(content)content=file.read()print(content)file.close()

如果open是打開一個文件查吊,那么可以不用寫打開的模式,即只寫 open('test.txt')

如果使用讀了多次湖蜕,那么后面讀取的數(shù)據(jù)是從上次讀完后的位置開始的

讀數(shù)據(jù)(readline)按照行讀取內(nèi)容

Python寫入內(nèi)容

file=open("test.txt","r+")content=file.readline()print(content)content=file.readline()print(content)

讀數(shù)據(jù)(readlines)讀取每一行

就像read沒有參數(shù)時一樣逻卖,readlines可以按照行的方式把整個文件中的內(nèi)容進(jìn)行一次性讀取,并且返回的是一個列表昭抒,其中每一行的數(shù)據(jù)為一個元素

#coding=utf-8f = open('test.txt', 'r')content = f.readlines()print(type(content))i=1for temp in content:? ? print("%d:%s"%(i, temp))? ? i+=1f.close()file = open("E:\\ceshi.txt")read = file.readlines()read2= file.readline()print(read)print(read2)

18.5. File對象的屬性

一個文件被打開后评也,你有一個file對象,你可以得到有關(guān)該文件的各種信息灭返。

以下是和file對象相關(guān)的所有屬性的列表:

屬性描述

file.closed返回true如果文件已被關(guān)閉盗迟,否則返回false。

file.mode返回被打開文件的訪問模式婆殿。

file.name返回文件的名稱诈乒。

file.softspace如果用print輸出后,必須跟一個空格符婆芦,則返回false怕磨。否則返回true。

如下實例:

#!/usr/bin/python# -*- coding: UTF-8 -*-# 打開一個文件fo = open("foo.txt", "w")print "文件名: ", fo.nameprint "是否已關(guān)閉 : ", fo.closedprint "訪問模式 : ", fo.modeprint "末尾是否強(qiáng)制加空格 : ", fo.softspace

十九消约、文件的重命名肠鲫、刪除

有些時候,需要對文件進(jìn)行重命名或粮、刪除等一些操作导饲,python的os模塊中都有這么功能

19.1.文件重命名

os模塊中的rename()可以完成對文件的重命名操作

rename(需要修改的文件名, 新的文件名)

importosos.rename("畢業(yè)論文.txt","畢業(yè)論文-最終版.txt")

19.2.刪除文件

os模塊中的remove()可以完成對文件的刪除操作

remove(待刪除的文件名)import osos.remove("畢業(yè)論文.txt")

19.3.創(chuàng)建文件夾,刪除文件夾

Python里的目錄:

所有文件都包含在各個不同的目錄下,不過Python也能輕松處理渣锦。

os模塊有許多方法能幫你創(chuàng)建硝岗,刪除和更改目錄。

mkdir()方法

可以使用os模塊的mkdir()方法在當(dāng)前目錄下創(chuàng)建新的目錄們袋毙。你需要提供一個包含了要創(chuàng)建的目錄名稱的參數(shù)型檀。

rmdir()方法

rmdir()方法刪除目錄,目錄名稱以參數(shù)傳遞听盖。

注意:在刪除這個目錄之前胀溺,它的所有內(nèi)容應(yīng)該先被清除。

Import osos.mkdir("aaa")os.rmdir("test")print(os.getcwd()) 獲取當(dāng)前目錄

二十皆看、文件拷貝

打開現(xiàn)有一個文件1仓坞,讀取文件當(dāng)中的內(nèi)容

test = open("E:\\ceshi.txt","r")read = test.readlines()

新建一個文件腰吟,寫入文件1當(dāng)中的內(nèi)容

test2=open("test2.txt","w")forx in read:test2.write(x)test.close()test2.close()

讀取新文件內(nèi)容

test3 = open("test2.txt",'r')print(test3 .read())

十三禾乘、Python面向?qū)ο缶幊?/p>

面向過程:根據(jù)業(yè)務(wù)邏輯從上到下寫代碼

面向?qū)ο螅?/b>將數(shù)據(jù)與函數(shù)綁定到一起江耀,進(jìn)行封裝晾腔,這樣能夠更快速的開發(fā)程序睡腿,減少了重復(fù)代碼的重寫過程

面向?qū)ο缶幊痰?個非常重要的概念:類和對象

對象是面向?qū)ο缶幊痰暮诵哪踝叮谑褂脤ο蟮倪^程中捧搞,為了將具有共同特征和行為的一組對象抽象定義晚树,提出了另外一個新的概念——類

就相當(dāng)于制造飛機(jī)時的圖紙,用它來進(jìn)行創(chuàng)建的飛機(jī)就相當(dāng)于對象

類與對象的關(guān)系:類就是創(chuàng)建對象的模板

13.1. Python定義類并創(chuàng)建實例

13.1.1類(Class) 由3個部分構(gòu)成:

類的名稱:類名

類的屬性:一組數(shù)據(jù)

類的方法:允許對進(jìn)行操作的方法 (行為)

對象 = 屬性 + 方法

靜態(tài) + 動態(tài)

引入:

案例一:人類設(shè)計,只關(guān)心3樣?xùn)|西:

事物名稱(類名):人(Person)

屬性:身高(height)胡陪、年齡(age)

方法(行為/功能):跑(run)蒂阱、打架(fight)

案例二:狗類的設(shè)計

類名:狗(Dog)

屬性:品種 了嚎、毛色伶氢、性別、名字掌眠、 腿兒的數(shù)量

方法(行為/功能):叫 蕾盯、跑钟哥、咬人缰犁、吃、搖尾巴

13.1.2 以 Person 為例垛叨,定義一個Person類如下:

classPerson(object):passxiaoming=Person();xiaohong=Person();print(xiaoming)#<__main__.Person object at 0x000001C113239128>print(xiaohong)#<__main__.Person object at 0x000001C113239160>print(xiaohong==xiaohong)#False

按照 Python 的編程習(xí)慣迅腔,類名以大寫字母開頭装畅,緊接著是(object),表示該類是從哪個類繼承下來的沧烈。類的繼承將在后面的章節(jié)講解掠兄,現(xiàn)在我們只需要簡單地從object類繼承。

pass語句什么也不做锌雀,一般作為占位符或者創(chuàng)建占位程序蚂夕,pass語句不會執(zhí)行任何操作

13.2.創(chuàng)建對象

通過上一節(jié)課程,定義了一個Car類腋逆;就好比有車一個張圖紙婿牍,那么接下來就應(yīng)該把圖紙交給生成工人們?nèi)ド闪?/p>

python中,可以根據(jù)已經(jīng)定義的類去創(chuàng)建出一個個對象

創(chuàng)建對象的格式為:

對象名 = 類名()

創(chuàng)建對象demo:

# 定義類classCar:# 移動defmove(self):print('車在奔跑...')# 鳴笛deftoot(self):print("車在鳴笛...嘟嘟..")# 創(chuàng)建一個對象惩歉,并用變量BMW來保存它的引用BMW=Car()BMW.color='黑色'BMW.wheelNum=4#輪子數(shù)量BMW.move()BMW.toot()print(BMW.color)print(BMW.wheelNum)

image.png

總結(jié):

BMW = Car()等脂,這樣就產(chǎn)生了一個Car的實例對象俏蛮,此時也可以通過實例對象BMW來訪問屬性或者方法

第一次使用BMW.color = '黑色'表示給BMW這個對象添加屬性,如果后面再次出現(xiàn)BMW.color = xxx表示對屬性進(jìn)行修改

BMW是一個對象上遥,它擁有屬性(數(shù)據(jù))和方法(函數(shù))

當(dāng)創(chuàng)建一個對象時搏屑,就是用一個模子,來制造一個實物

13.3. Python中創(chuàng)建實例屬性

雖然可以通過Person類創(chuàng)建出xiaoming粉楚、xiaohong等實例辣恋,但是這些實例看上除了地址不同外,沒有什么其他不同模软。在現(xiàn)實世界中伟骨,區(qū)分xiaoming、xiaohong要依靠他們各自的名字撵摆、性別底靠、生日等屬性。

如何讓每個實例擁有各自不同的屬性特铝?由于Python是動態(tài)語言,對每一個實例壹瘟,都可以直接給他們的屬性賦值鲫剿,例如,給xiaoming這個實例加上name稻轨、gender和birth屬性:

classPerson(object):passxiaoming=Person();xiaohong=Person();xiaoming.name="小明"xiaoming.age=12xiaoming.grade=3xiaohong.name="小紅"xiaohong.age=19;xiaohong.sex="女"print(xiaoming)#地址print(xiaohong)#地址print(xiaoming.name)#小明print(xiaoming==xiaohong)#False

13.4. Python中初始化實例屬性

在定義 Person 類時灵莲,可以為Person類添加一個特殊的init()方法,當(dāng)創(chuàng)建實例時殴俱,init()方法被自動調(diào)用政冻,我們就能在此為每個實例都統(tǒng)一加上以下屬性:

classPerson:def__init__(self,name,sex,age):self.name=name;self.sex=sex;self.age=age;person1=Person("小明","男",19);person2=Person("小紅","女",20);print(person1.name,person1.sex,person1.age);#小明 男 19print(person2.name,person2.sex,person2.age);#小紅 女 20

init()方法,在創(chuàng)建一個對象時默認(rèn)被調(diào)用线欲,不需要手動調(diào)用init(self)中明场,默認(rèn)有1個參數(shù)名字為self,如果在創(chuàng)建對象時傳遞了2個實參李丰,那么init(self)中出了self作為第一個形參外還需要2個形參苦锨,例如init(self,x,y)

init(self)中的self參數(shù),不需要開發(fā)者傳遞趴泌,python解釋器會自動把當(dāng)前的對象引用傳遞進(jìn)去

13.5. Python中訪問限制

我們可以給一個實例綁定很多屬性舟舒,如果有些屬性不希望被外部訪問到怎么辦?

Python對屬性權(quán)限的控制是通過屬性名來實現(xiàn)的嗜憔,如果一個屬性由雙下劃線開頭(__)秃励,該屬性就無法被外部訪問

classPerson(object):def__init__(self,name,score):self.name=nameself.__score=scorep=Person('Bob',59)print(p.name,p._score);

但是,如果一個屬性以"xxx"的形式定義吉捶,那它又可以被外部訪問了夺鲜,以"xxx"定義的屬性在Python的類中被稱為特殊屬性廓鞠,有很多預(yù)定義的特殊屬性可以使用,通常我們不要把普通屬性用"xxx"定義谣旁。

13.6. python中定義實例方法

一個實例的私有屬性就是以__開頭的屬性床佳,無法被外部訪問,那這些屬性定義有什么用榄审?

雖然私有屬性無法從外部訪問砌们,但是,從類的內(nèi)部是可以訪問的搁进。除了可以定義實例的屬性外浪感,還可以定義實例的方法。

實例的方法就是在類中定義的函數(shù)饼问,它的第一個參數(shù)永遠(yuǎn)是 self影兽,指向調(diào)用該方法的實例本身,其他參數(shù)和一個普通函數(shù)是完全一樣的:

classPerson:def__init__(self,name,age):self.__name=nameself.age=agedefgetName(self):returnself.__name;person1=Person("張三",19)print(person1.getName())

13.7. python中創(chuàng)建類屬性

類是模板莱革,而實例則是根據(jù)類創(chuàng)建的對象峻堰。

綁定在一個實例上的屬性不會影響其他實例,

但是盅视,類本身也是一個對象捐名,如果在類上綁定一個屬性,則所有實例都可以訪問類的屬性闹击,并且镶蹋,所有實例訪問的類屬性都是同一個!

也就是說赏半,實例屬性每個實例各自擁有贺归,互相獨立,而類屬性有且只有一份断箫。

classPerson:#聲明address地址address="earth"def__init__(self,name,age):self.name=nameself.age=ageperson1=Person('zhangsan',19)print(person1.address)#earthprint(Person.address)#earth

13.8. python中定義類方法

和屬性類似拂酣,方法也分實例方法和類方法。

在class中定義的全部是實例方法瑰枫,實例方法第一個參數(shù) self 是實例本身踱葛。

classPerson(object):count=0@classmethoddefhowMany(cls):returncls.countdef__init__(self,name):self.name=name? ? ? ? Person.count=Person.count+1print(Person.count,"-----------")person1=Person("張三");print(person1.howMany())#1print(Person.howMany())#1

十四、Python中繼承

14.1. 繼承概念

面向?qū)ο蟮木幊處淼闹饕锰幹皇谴a的重用光坝,實現(xiàn)這種重用的方法之一是通過繼承機(jī)制尸诽。

通過繼承創(chuàng)建的新類稱為子類或派生類,被繼承的類稱為基類盯另、父類或超類性含。

14.2. 為什么要繼承

新類不必從頭編寫,代碼的重用

新類從現(xiàn)有類繼承鸳惯,就自動擁有了現(xiàn)有類的所有功能

新類只需要編寫現(xiàn)有類缺少的新功能

在程序中,繼承描述的是事物之間的所屬關(guān)系,例如貓和狗都屬于動物.

image.png

14.3. 繼承特點以及單繼承

子類在繼承的時候商蕴,在定義類時叠萍,小括號()中為父類的名字

父類的屬性、方法绪商,會被繼承給子類

classDog(object):def__init__(self,name,color="黃色"):self.name=nameself.color=colordefrun(self):print("%s在跑著"%self.name)classJinMao(Dog):defsetNewName(self,name):self.name=namedefeat(self):print("%s在吃飯苛谷,顏色是%s"%(self.name,self.color))dog1=JinMao("大黃")dog1.run()dog1.setNewName("小阿黃")dog1.eat()

說明:雖然子類沒有定義init方法,但是父類有格郁,所以在子類繼承父類的時候這個方法被繼承了腹殿,所以只要創(chuàng)建子類的對象,就默認(rèn)執(zhí)行了這個init方法.

14.4. 多繼承

classMa(object):defprintMa(self):print("ma的特性")classLv(object):defprintLv(self):print("lv的特性")classLuoZi(Ma,Lv):defprintLuo(self):print("騾子的特性")luo=LuoZi()luo.printLuo()luo.printLv()luo.printMa()

14.5. 多繼承同名方法調(diào)用

classMa(object):defprintMa(self):print("ma的特性")defrun(self):print("萬馬奔騰")classLv(object):defprintLv(self):print("lv的特性")defrun(self):print("萬驢奔騰")classLuoZi(Ma,Lv):defprintLuo(self):print("騾子的特性")luo=LuoZi()luo.run()print(LuoZi.__mro__)

先繼承哪個例书,就調(diào)用哪個的方法

關(guān)于Python類的多繼承中的mro屬性使用的C3算法以及繼承順序解釋

14.6. 方法的重寫及調(diào)用父類方法

#方法的重寫classAnimal(object):def__init__(self,name,sex,color):self.name=nameself.sex=sexself.color=colordefplay(self):print("動物都有各自的玩法")classCat(Animal):def__init__(self,name,sex,color,age):#super代表父類super().__init__(name,sex,color)self.age=age#方法的重寫/覆蓋defplay(self):super().play()print("%d歲的貓喜歡爬墻"%self.age)c=Cat("小花","母","花色",8)c.play()#貓喜歡爬墻print(c.name,c.sex)

14.7. 類屬性和對象屬性

類屬性就是類(類對象)所擁有的屬性锣尉。它被類和所有對象所擁有。對于共有類屬性决采,在類外可以通過類對象和實例對象訪問自沧。

類屬性

classDog(object):name="Tom"__age=10print(Dog.name)#正確print(Dog.__age)#錯誤,__age屬于私有屬性树瞭,不能在外邊訪問d=Dog()print(d.name)#正確print(d.__age)#錯誤拇厢,__age屬于私有屬性,不能在外邊訪問

對象屬性

def__init__(self,name):self.name=nameprint(Dog.name)#Tomd=Dog("大黃",19)print(d.name)#大黃print(d.getAge())defgetAge(self):returnself.__age

14.8.python中多態(tài)(了解)

類具有繼承關(guān)系移迫,并且子類類型可以向上轉(zhuǎn)型看做父類類型旺嬉,如果我們從 Person 派生出 Student和Teacher ,并都寫了一個 whoAmI() 方法厨埋,在一個函數(shù)中,如果我們接收一個變量 x捐顷,則無論該 x 是 Person荡陷、Student還是 Teacher,都可以正確打印出結(jié)果:這種行為稱為多態(tài)迅涮。

方法調(diào)用將作用在 x 的實際類型上废赞。s 是Student類型,它實際上擁有自己的 whoAmI()方法以及從 Person繼承的 whoAmI方法叮姑,但調(diào)用 s.whoAmI()總是先查找它自身的定義唉地,如果沒有定義,則順著繼承鏈向上查找传透,直到在某個父類中找到為止耘沼。

classPerson(object):def__init__(self,name,gender):self.name=nameself.gender=genderdefwhoAmI(self):return'I am a Person, my name is '+self.nameclassStudent(Person):def__init__(self,name,gender,score):super().__init__(name,gender)self.score=scoredefwhoAmI(self):return'I am a Student, my name is '+self.nameclassTeacher(Person):def__init__(self,name,gender,course):super(Teacher,self).__init__(name,gender)self.course=coursedefwhoAmI(self):return'I am a Teacher, my name is '+self.namep=Person('Tim','Male')s=Student('Bob','Male',88)t=Teacher('Alice','Female','English')print(p.whoAmI())print(s.whoAmI())print(t.whoAmI())

14.9.python中多重繼承(了解)

除了從一個父類繼承外,Python允許從多個父類繼承朱盐,稱為多重繼承群嗤。

classA(object):def__init__(self,a):print('init A...')self.a=aclassB(A):def__init__(self,a):super().__init__(a)print('init B...')classC(A):def__init__(self,a):super().__init__(a)print('init C...')classD(B,C):def__init__(self,a):super().__init__(a)print('init D...')d=D("--");# init A...# init C...# init B...# init D...

十五、Python中異常

15.1. 什么是異常兵琳?

異常即是一個事件狂秘,該事件會在程序執(zhí)行過程中發(fā)生骇径,影響了程序的正常執(zhí)行。

一般情況下者春,在Python無法正常處理程序時就會發(fā)生一個異常破衔。

異常是Python對象,表示一個錯誤钱烟。

當(dāng)Python腳本發(fā)生異常時我們需要捕獲處理它晰筛,否則程序會終止執(zhí)行。

#演示各種異常情況#第一個異常忠售,數(shù)學(xué)異常# ZeroDivisionError: division by zero <

15.2.異常處理

捕捉異炒荩可以使用try/except語句。

try/except語句用來檢測try語句塊中的錯誤稻扬,從而讓except語句捕獲異常信息并處理卦方。

如果你不想在異常發(fā)生時結(jié)束你的程序,只需在try里捕獲它泰佳。

try的工作原理是盼砍,當(dāng)開始一個try語句后,python就在當(dāng)前程序的上下文中作標(biāo)記逝她,這樣當(dāng)異常出現(xiàn)時就可以回到這里浇坐,try子句先執(zhí)行,接下來會發(fā)生什么依賴于執(zhí)行時是否出現(xiàn)異常黔宛。

如果當(dāng)try后的語句執(zhí)行時發(fā)生異常近刘,python就跳回到try并執(zhí)行第一個匹配該異常的except子句,異常處理完畢臀晃,控制流就通過整個try語句(除非在處理異常時又引發(fā)新的異常)觉渴。

如果在try后的語句里發(fā)生了異常,卻沒有匹配的except子句徽惋,異常將被遞交到上層的try案淋,或者到程序的最上層(這樣將結(jié)束程序,并打印缺省的出錯信息)险绘。

如果在try子句執(zhí)行時沒有發(fā)生異常踢京,python將執(zhí)行else語句后的語句(如果有else的話),然后控制流通過整個try語句宦棺。

15.3.異常效果

try:i=1/0except:print("出現(xiàn)錯誤")else:print("一切正常")try:i=1/0exceptArithmeticError:print("出現(xiàn)數(shù)學(xué)錯誤")exceptModuleNotFoundError:print("model找不到")else:print("一切正常")

15.4.Try-finally 語句

try:i=1/0except:print("出現(xiàn)錯誤")else:print("一切正常")finally:print("無論如何都會執(zhí)行")

15.5.主動觸發(fā)異常

我們可以使用raise語句自己觸發(fā)異常

raise語法格式如下

i=1;ifi<10:raiseException("數(shù)字i不能小于10")#異常觸發(fā)后瓣距,后邊代碼就不會執(zhí)行#拋出異常classPerson(object):def__init__(self,name,age):self.name=name? ? ? ? self.__age=agedefsetAge(self,age):ifage<0orage>150:raiseException("年齡非法")else:self.__age=agedefgetAge(self):returnself.__agetry:p=Person("張三",18)p.setAge(190)exceptExceptionasresult:print(result)

十六、Python單元測試

16.1. 單元測試框架Unittest介紹

TestCase:一個測試用例,或是一個完整的測試流程渺氧,包括測試前準(zhǔn)備環(huán)境的搭建(setUp)旨涝,執(zhí)行測試代碼(run)以及測試后環(huán)境的還原(tearDown)。

單元測試(unittest)的本質(zhì)也就在這里,一個測試用例是一個完整的測試單元白华,通過運行這個測試單元慨默,可以對某一個問題進(jìn)行驗證。

TestSuite:多個測試用例TestCase集合在一起弧腥,就是TestSuite厦取,而且TestSuite也可以嵌套TestSuite。

TestLoader:用來加載TestCase到TestSuite中的管搪,其中有幾個loadTestsFrom__()方法虾攻,就是從各個地方尋找TestCase,創(chuàng)建它們的實例更鲁,然后add到TestSuite中霎箍,再返回一個TestSuite實例。

TextTestRunner:是來執(zhí)行測試用例的澡为,其中的run(test)會執(zhí)行TestSuite/TestCase中的run(result)方法漂坏。測試的結(jié)果會保存到TextTestResult實例中,包括運行了多少測試用例媒至,成功了多少顶别,失敗了多少等信息。

image.png

整個流程:首先是要寫好TestCase拒啰,然后由TestLoader加載TestCase到TestSuite驯绎,然后由TextTestRunner來運行TestSuite,運行的結(jié)果保存在TextTestResult中谋旦,整個過程集成在unittest.main模塊中剩失。

步驟:

導(dǎo)入unittest模塊

當(dāng)前測試類繼承unittest.TestCase,相當(dāng)于當(dāng)前利用unittest創(chuàng)建了一個test case册着,這個test case是能夠被unittest直接識別赴叹。

寫setUP(),主要是打開瀏覽器和打開站點

寫一個test_search()用例寫搜索的代碼

寫tearDown(),主要是瀏覽器退出操作

16.2. unittest的簡單介紹及使用

一個完整的測試腳本包含:

import unittest

定義一個繼承自unittest.TestCase的測試用例類,相當(dāng)于當(dāng)前利用unittest創(chuàng)建了一個test case,這個test case是能夠被unittest直接識別指蚜。

定義setUp和tearDown,在每個測試用例前后做一些輔助工作涨椒。

定義測試用例摊鸡,名字以test開頭。

一個測試用例應(yīng)該只測試一個方面蚕冬,測試目的和測試內(nèi)容應(yīng)很明確免猾。主要是調(diào)用assertEqual、assertRaises等斷言方法判斷程序執(zhí)行結(jié)果和預(yù)期值是否相符囤热。

調(diào)用unittest.main()啟動測試

如果測試未通過猎提,會輸出相應(yīng)的錯誤提示。如果測試全部通過則不顯示任何東西旁蔼,也可以添加-v參數(shù)顯示詳細(xì)信息锨苏。

# -*- coding: utf-8 -*-importunittestclassPythonunitTest(unittest.TestCase):defsetUp(self):print("---測試初始化工作---")deftestF(self):i=1+1print(i)deftearDown(self):print("---測試掃尾工作----")if__name__=="__main__":unittest.main()

16.3.斷言

image.png

# -*- coding: utf-8 -*-import unittestclassPythonunitTest(unittest.TestCase):defsetUp(self):print("---測試初始化工作---")deftestF(self):self.assertEqual(5+5,10);self.assertTrue(1==1)self.assertFalse(1==2)deftearDown(self):print("---測試掃尾工作----")if__name__=="__main__":unittest.main()

16.4.TestSuite

TestSuite:

而多個測試用例TestCase集合在一起疙教,就是TestSuite,而且TestSuite也可以嵌套TestSuite伞租。

TestLoader:

用來加載TestCase到TestSuite中的贞谓,其中有幾個loadTestsFrom__()方法,就是從各個地方尋找TestCase葵诈,創(chuàng)建它們的實例裸弦,然后add到TestSuite中,再返回一個TestSuite實例作喘。

TextTestRunner:

是來執(zhí)行測試用例的理疙,其中的run(test)會執(zhí)行TestSuite/TestCase中的run(result)方法。

import unittest

class Test1(unittest.TestCase):

def setUp(self):

pass

def tearDown(self):

pass

def test_one(self):

print("test1中第一個測試案例-----")

deftest_two(self):print("test1中第二個測試案例----")

class Test2(unittest.TestCase):

def setUp(self):

pass

def tearDown(self):

pass

def test_one(self):

print("test2中第一個測試案例-----")

def test_two(self):

print("test2中第二個測試案例-----")

16.5.新建一個py文件

ifname== 'main':

suite = unittest.TestSuite()

# tests = [Test1("test_one"), Test1("test_two"), Test2("test_one")]

# suite.addTests(tests)

suite.addTest(Test1('test_one'))

runner = unittest.TextTestRunner(verbosity=2)

runner.run(suite)

如果想全部加載到testSuite中

suite.addTest(unittest.TestLoader().loadTestsFromTestCase(PythonTest1))

suite.addTest(unittest.TestLoader().loadTestsFromTestCase(PythonTest2))

16.6.

1.unittest是Python自帶的單元測試框架泞坦,我們可以用其來作為我們自動化測試框架的用例組織執(zhí)行框架窖贤。

2.unittest的流程:寫好TestCase,然后由TestLoader加載TestCase到TestSuite暇矫,然后由 TextTestRunner來運行TestSuite主之,運行的結(jié)果保存在TextTestResult中,我們通過命令行或者 unittest.main()執(zhí)行時李根,main會調(diào)用TextTestRunner中的run來執(zhí)行槽奕,或者我們可以直接通過 TextTestRunner來執(zhí)行用例。

3.一個class繼承unittest.TestCase即是一個TestCase房轿,其中以 test 開頭的方法在load時被加載為一個真正的TestCase粤攒。

4.verbosity參數(shù)可以控制執(zhí)行結(jié)果的輸出,0 是簡單報告囱持、1 是一般報告夯接、2 是詳細(xì)報告。

5.可以通過addTest和addTests向suite中添加case或suite纷妆,可以用TestLoader的loadTestsFrom__()方法盔几。

6.用 setUp()、tearDown()掩幢、setUpClass()以及 tearDownClass()可以在用例執(zhí)行前布置環(huán)境逊拍,以及在用例執(zhí)行后清理環(huán)境

7.我們可以通過skip,skipIf际邻,skipUnless裝飾器跳過某個case芯丧,或者用TestCase.skipTest方法。

8.參數(shù)中加stream世曾,可以將報告輸出到文件:可以用TextTestRunner輸出txt報告缨恒,以及可以用HTMLTestRunner輸出html報告。

十七、HTMLTestRunner

對于unittest框架骗露,運行后岭佳,測試結(jié)果不便于查看,同時多個case存在的時候椒袍,可能會導(dǎo)致case result記錄不正確的情況驼唱。

為此,引入了HTMLTestRunner.py,它是Python標(biāo)準(zhǔn)庫unittest模塊的一個擴(kuò)展驹暑。它可以生成直觀的HTML測試報告玫恳。

17.1.將HTMLTestRunner.py拷貝到當(dāng)前項目下

17.2.新建一個py類

ifname== 'main':

suite = unittest.TestSuite()

suite.addTests(unittest.TestLoader().loadTestsFromTestCase(Test1))

#? 定義生成測試報告的名稱filename1=r""+str(time.strftime('%Y%m%d%H%M%S'))+".html"fp=open(filename1,'wb')# 定義測試報告的路徑,標(biāo)題优俘,描述等內(nèi)容runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'自動化測試報告',description=u'自動化測試報告')runner.run(suite)

17.3.執(zhí)行方法京办,生成測試報告

17.4.使用瀏覽器打開

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市帆焕,隨后出現(xiàn)的幾起案子惭婿,更是在濱河造成了極大的恐慌,老刑警劉巖叶雹,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件财饥,死亡現(xiàn)場離奇詭異,居然都是意外死亡折晦,警方通過查閱死者的電腦和手機(jī)钥星,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來满着,“玉大人谦炒,你說我怎么就攤上這事》缋” “怎么了宁改?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長魂莫。 經(jīng)常有香客問我还蹲,道長,這世上最難降的妖魔是什么耙考? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任秽誊,我火速辦了婚禮,結(jié)果婚禮上琳骡,老公的妹妹穿的比我還像新娘。我一直安慰自己讼溺,他們只是感情好楣号,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般炫狱。 火紅的嫁衣襯著肌膚如雪藻懒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天视译,我揣著相機(jī)與錄音嬉荆,去河邊找鬼。 笑死酷含,一個胖子當(dāng)著我的面吹牛鄙早,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椅亚,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼限番,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了呀舔?” 一聲冷哼從身側(cè)響起弥虐,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎媚赖,沒想到半個月后霜瘪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡惧磺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年颖对,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豺妓。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡惜互,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琳拭,到底是詐尸還是另有隱情训堆,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布白嘁,位于F島的核電站坑鱼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏絮缅。R本人自食惡果不足惜鲁沥,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耕魄。 院中可真熱鬧画恰,春花似錦、人聲如沸吸奴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至考润,卻和暖如春狭园,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背糊治。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工唱矛, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人井辜。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓绎谦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抑胎。 傳聞我的和親對象是個殘疾皇子燥滑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 6.1.3 標(biāo)識符 什么是標(biāo)識符? 開發(fā)人員在程序中自定義的一些符號和名稱 標(biāo)識符是自己定義的,如變量名 阿逃、函數(shù)名...
    __65a0閱讀 747評論 0 0
  • python總結(jié) 6.1.3 標(biāo)識符 什么是標(biāo)識符铭拧? 開發(fā)人員在程序中自定義的一些符號和名稱 標(biāo)識符是自己定義的,...
    G_eebd閱讀 783評論 0 0
  • 一、Python介紹Python 是一個高層次的結(jié)合了解釋性恃锉、編譯性搀菩、互動性和面向?qū)ο蟮哪_本語言。Python 的...
    ad458edb873e閱讀 335評論 0 0
  • 一破托、Python介紹 Python 是一個高層次的結(jié)合了解釋性肪跋、編譯性、互動性和面向?qū)ο蟮哪_本語言土砂。Python ...
    Anwfly閱讀 915評論 0 5
  • 前言 參考資料: 筆者Python學(xué)習(xí)主要以《Python編程:從入門到實戰(zhàn)》這本書為主州既,筆記的思路參考書里的脈絡(luò)...
    程序員迪迪閱讀 425評論 0 1