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ù)在計算機內(nèi)部存儲的方式是不同的魏身,整數(shù)運算永遠(yuǎn)是精確的(除法難道也是精確的惊橱?是的!)箭昵,而浮點數(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丛晌。
只是在計算機程序中众雷,變量不僅可以是數(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 "末尾是否強制加空格 : ", 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ū)ο缶幊痰暮诵耐7蓿谑褂脤ο蟮倪^程中,為了將具有共同特征和行為的一組對象抽象定義蚊伞,提出了另外一個新的概念——類
類就相當(dāng)于制造飛機時的圖紙席赂,用它來進(jìn)行創(chuàng)建的飛機就相當(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)這種重用的方法之一是通過繼承機制酸纲。
通過繼承創(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 <<ArithmeticError ctrl+/快速注釋
# i=1/0
#第二個異常竟贯,類型轉(zhuǎn)換錯誤
# TypeError: must be str, not int
# age=int(input("請輸入年齡"))
# print("年齡是"+age)
#第三個異常:文件異常
# FileNotFoundError: [Errno 2] No such file or directory: 'aa.txt'
# file=open("aa.txt","r")
# file.write("哈哈")
# file.close()
#第四個異常 未定義異常
# NameError: name 'num' is not defined
# print(num)#編譯錯誤