python进阶之学习笔记_干货 | Python进阶系列之学习笔记(四)
目錄
Python條件判斷
Python循環語句
Python循環控制
迭代器與生成器
異常
一、Python 條件判斷
如果某些條件滿足,才能做某件事情;條件不滿足時,則不能做,這就是所謂的判斷。
不僅生活中有,在軟件開發中"判斷"功能也經常會用到
(1)if 語句發
介紹
if 翻譯成中文是 如果 的意思。if 后面寫判斷的條件。使用格式如下
使用格式
if 要判斷的條件:
條件成立時,要做的事情
如果 if 判斷的條件是正確的,那么就執行 if 下面縮進段內的代碼。否則不執行
# 舉個栗子age = 30 # 代表年齡30歲print("------if判斷開始------")if age >= 18: # 判斷條件print("我已經成年了") # 條件成立則執行print("------if判斷結束------")
age = 30 # 代表年齡30歲
print("------if判斷開始------")
if age >= 18: # 判斷條件
print("我已經成年了") # 條件成立則執行
print("------if判斷結束------")
實際操作:
執行過程:
(2)比較運算符:
剛剛在和大家講解 if 的使用方式時,不知道觀察仔細的各位有沒有發現 if 后面的條件判斷的寫法,除了這個大于號,還有什么寫法呢?
實際操作:
a = 3b = 3print(a == b) # 檢查兩個值print(a != b) # != ,a 是否不等于 bprint(a > b) # > ,a 是否大于 bprint(a < b) # < ,a 是否小于 bprint(a >= b) # >= ,a 是否大于等于 bprint(a <= b) # <= ,a 是否小于等于 b
b = 3
print(a == b) # 檢查兩個值
print(a != b) # != ,a 是否不等于 b
print(a > b) # > ,a 是否大于 b
print(a < b) # < ,a 是否小于 b
print(a >= b) # >= ,a 是否大于等于 b
print(a <= b) # <= ,a 是否小于等于 b
(3)邏輯運算符:
剛才上個知識點和大家講的是比較的運算符,那么咱們再來看看邏輯運算符
實際操作:
a = 10b = 20c = 30d = 10print(a < b and a > b) # and 當兩側的表達式都正確的時候,返回True,否則返回 False。print(a < b or b > a) # or 當兩側的表達式,只要有一個是正確時就返回True。print(not b > a) # b > a 結果是正確的。但是 not 會返回 False。# 如果結果是錯誤的,則返回 True。
b = 20
c = 30
d = 10
print(a < b and a > b) # and 當兩側的表達式都正確的時候,返回True,否則返回 False。
print(a < b or b > a) # or 當兩側的表達式,只要有一個是正確時就返回True。
print(not b > a) # b > a 結果是正確的。但是 not 會返回 False。
# 如果結果是錯誤的,則返回 True。
(4)if-else 語句
想一想:在使用 if 的時候,它只能做到滿足條件時要做的事情。那萬一需要在不滿足條件的時候,做某些事,該怎么辦呢?
答:使用 if-else
其使用格式如下:
if 條件:
滿足條件時要做的事情1
滿足條件時要做的事情2
滿足條件時要做的事情3
...(省略)...
else:
不滿足條件時要做的事情1
不滿足條件時要做的事情2
不滿足條件時要做的事情3
...(省略)...
# 舉個栗子chePiao = 1 # 用1代表有車票,0代表沒有車票if chePiao == 1: # 判斷條件print("還好買到車票了")print("終于可以回家陪伴父母了,珍惜~~~")else: # 條件不成立則執行 elseprint("沒有車票,不能上車")print("我要再想想其它的辦法")
chePiao = 1 # 用1代表有車票,0代表沒有車票
if chePiao == 1: # 判斷條件
print("還好買到車票了")
print("終于可以回家陪伴父母了,珍惜~~~")
else: # 條件不成立則執行 else
print("沒有車票,不能上車")
print("我要再想想其它的辦法")
實際操作:
執行過程:
(5)if-eilf-else 語句
if 能完成當條件成立時做的事情
if-else 能完成當條件成立時做事情 1 ,否則做事情 2
如果有這樣一種情況:當 條件一 滿足時做事情 1 ;當 條件一 不滿足、條件二 滿足時做事情2;當 條件二 不滿足、條件三 滿足時做事情3,那該怎么實現呢?
答:使用 eilf
其使用格式如下:
if 條件一成立:
執行事情1
elif 條件二成立:
執行事情2
elif 條件三:
執行事情3
# 舉個栗子score = 77 # 代表分數if score>=90 and score<=100:print('本次考試,等級為A')elif score>=80 and score<90:print('本次考試,等級為B')elif score>=70 and score<80:print('本次考試,等級為C')elif score>=60 and score<70:print('本次考試,等級為D')elif score>=0 and score<60:print('本次考試,等級為E')
score = 77 # 代表分數
if score>=90 and score<=100:
print('本次考試,等級為A')
elif score>=80 and score<90:
print('本次考試,等級為B')
elif score>=70 and score<80:
print('本次考試,等級為C')
elif score>=60 and score<70:
print('本次考試,等級為D')
elif score>=0 and score<60:
print('本次考試,等級為E')
實際操作:
執行過程:
二、Python 循環語句
在Python中 for 循環可以遍歷任何序列的項目,如一個列表或者一個字符串等。
(1)for 循環
for 循環,重點在于循環。可以理解為在某種情況下反復的做一些事情。比如咱們生活中的電子表,分別有時針分針和秒針,秒針從 0 開始,每一秒則遞增1,60秒時,分鐘遞增1,就這樣一直反復,這就可以理解為循環。
其使用格式如下:
for 臨時變量 in 列表或者字符串等可迭代對象:
循環滿足條件時執行的代碼
# 舉個栗子name = '天下第一帥'for x in name:print(x)
name = '天下第一帥'
for x in name:
print(x)
實際操作:
執行過程:
(2)while 循環
Python 編程中 while 語句也是循環語句種的一種,主要用于循環執行程序,即在某條件下,循環執行某段程序,以處理需要重復處理的相同任務。
其使用格式為:
while 判斷條件:
執行語句……
# 舉個栗子count = 1 # 表示為次數while (count < 9): print( 'count 運行次數:', count) count = count + 1print("while 循環條件不滿足 count 等于 9,退出 while 循環")
count = 1 # 表示為次數
while (count < 9):
print( 'count 運行次數:', count)
count = count + 1
print("while 循環條件不滿足 count 等于 9,退出 while 循環")
實際操作:
(3)while 死循環
有一種循環叫死循環,一經觸發,就運行個天荒地老、海枯石爛。
這是為什么捏?
因為 while 后面的條件一直成立。什么情況下會一直成立呢?
# 舉個栗子count = 0while True: # 判斷條件一直為真,那么就會一直進行循環print("count:",count)count += 1 # count = count + 1
count = 0
while True: # 判斷條件一直為真,那么就會一直進行循環
print("count:",count)
count += 1 # count = count + 1
實際操作:
三、Python 循環控制
(1)break 結束循環
break 翻譯成中文有:打破、折斷、弄壞等意思。在 Python 中 break 的作用是退出相關的所有的循環,結束所有循環。
# 舉個栗子count = 0while True:print('正在執行第'+str(count)+'循環')count += 1if count == 10:print('檢測到 count 等于 10 將執行 break 退出循環')breakprint('退出循環成功')
count = 0
while True:
print('正在執行第'+str(count)+'循環')
count += 1
if count == 10:
print('檢測到 count 等于 10 將執行 break 退出循環')
break
print('退出循環成功')
實際操作:
大家只需要記住 break 的作用是結束循環,就可以啦。
(2)continue 退出當前循環
Continue 退出是當前的循環,進入下一次循環.表示跳過當前這次循環,進行下一次循環
# 舉個栗子count = 0while count < 15:count += 1if count == 10:print('檢測到 count 等于 10 將執行 continue 跳過當前循環')continueprint('正在執行第'+str(count)+'循環')
count = 0
while count < 15:
count += 1
if count == 10:
print('檢測到 count 等于 10 將執行 continue 跳過當前循環')
continue
print('正在執行第'+str(count)+'循環')
實際操作:
continue 的作用是,跳出當前這一次循環。
四、迭代器與生成器
在了解 Python 的數據結構時,容器(container)、可迭代對象(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推導式(list,set,dict comprehension)眾多概念參雜在一起,難免讓初學者一頭霧水
容器比較容易理解,因為你就可以把它看作是一個盒子、一棟房子、一個柜子,里面可以塞任何東西。從技術角度來說,當它可以用來詢問某個元素是否包含在其中時,那么這個對象就可以認為是一個容器,比如 list,set,tuple 都是容器對象
(1)可迭代對象
可以被 for 循環的語句統稱為可迭代對象
如: list , set , dict , tuple,str
# 舉個栗子list1 = [1,2,3,4]dict1 = {"a":1,"b":2,"c":3}tuple1 = (1,2,3,4)for i in list1print(i)
list1 = [1,2,3,4]
dict1 = {"a":1,"b":2,"c":3}
tuple1 = (1,2,3,4)
for i in list1
print(i)
實際操作:
(2)不可迭代對象
無法使用 for 循環進行迭代的數據,稱為不可迭代對象.
# 舉個栗子age = 17for i in age:print(i)
age = 17
for i in age:
print(i)
實際操作:
(3)迭代器
定義
迭代器內含 iter() 方法?和?next() 方法.對于?字符串,列表,字典,元組?等這類容器對象,在使用?for?循環時,會對這些容器調用 iter() 方法 , iter() 方法是?python?內置的函數,iter()函數會返回一個定義了?next()?方法的迭代器對象.它在容器中逐漸訪問容器內的元素 , next() 也是python 的內置函數,在沒有后續函數時 , next() 函數會拋出一個 StopIteration 異常
使用
# 舉個栗子name = '我最帥,不接受反駁'name = iter(name)
name = '我最帥,不接受反駁'
name = iter(name)
實際操作:
(4)生成器
定義
生成器是創建迭代器的一個工具,寫起來就像一個正常的函數一樣,只是在需要有返回數據的時候使用?yield?語句,每次?next() 方法被調用時,生成器會返回它脫離的位置(返回它脫離的位置和所有的數據值)
也就是說,使用了 yield 關鍵字的函數不再是函數,而是生成器。
創建生成器的方法1
# 舉個栗子# a = [item*2 for item in range(5)] 這個是列表推導式# a = (item*2 for item in range(5)) 這個是生成器# 不同的地方在于 列表推導式使用中括號,生成器使用圓括號. 舉個栗子
# a = [item*2 for item in range(5)] 這個是列表推導式
# a = (item*2 for item in range(5)) 這個是生成器
# 不同的地方在于 列表推導式使用中括號,生成器使用圓括號.
實際操作:
創建 列表 a 和 生成器a 的區別僅在于最外層的 [ ] 和 ( ) ,列表a 是?個列表,? 生成器a,是?個?成器。我們可以直接打印出列表a的每?個元素,?對于?成器a,我們可以按照迭代器的使??法來使?,即可以通過next()函數、for循環、list()等?法使?。
創建生成器方法2
generator?常強?。如果推算的算法?較復雜,?類似列表?成式的 for 循環?法實現的時候,還可以?函數來實現。
我們仍然?上?節提到的斐波那契數列來舉例,回想我們在上?節?迭代器的實現?式:
def fibonacci(n):# 定義斐波那契數列的前2個值a = 0b = 1# 定義當前的位置current_index = 0print("------------1111-----------")while current_index < n:# 定義要返回的值result = a# ?成新的 a、b值a,b =b,a+b# 讓當前值+1current_index += 1print("-----------2222----------")yield resultprint("-----------3333------------")# ?成器,?成斐波那契數列fib = fibonacci(5)value = next(fib)print(value)value = next(fib)print(value)
# 定義斐波那契數列的前2個值
a = 0
b = 1
# 定義當前的位置
current_index = 0
print("------------1111-----------")
while current_index < n:
# 定義要返回的值
result = a
# ?成新的 a、b值
a,b =b,a+b
# 讓當前值+1
current_index += 1
print("-----------2222----------")
yield result
print("-----------3333------------")
# ?成器,?成斐波那契數列
fib = fibonacci(5)
value = next(fib)
print(value)
value = next(fib)
print(value)
操作結果:
使?了yield關鍵字的函數不再是函數,?是?成器。(使?了yield的函數就是?成器)
yield關鍵字有兩點作?:
1.保存當前運?狀態(斷點),然后暫停執?,即將?成器(函數)掛起
2.將yield關鍵字后?表達式的值作為返回值返回,此時可以理解為起到了return的作?
特點
生成器可以做到迭代器能做的所有事情,而且因為自動創建了?iter()?和?next()?方法,生成器會顯得比較簡潔一些,而且生成器相對更高效.使用生成器表達式取代列表解析可以同時節省內存.除了創建和保存程序狀態的自動方法,當生成器終止時,還會自動拋出 StopIteration 異常。
五、異常
(1)異常介紹
在介紹異常之前,咱們先看個例子:
# 舉個小栗子print(name) # 很簡單的輸出 name 變量數據
print(name) # 很簡單的輸出 name 變量數據
實際操作:
說明:
當我們在打印輸出一個未被定義的變量時,Python 解釋器就會為我們拋出一個 NameError 類型的錯誤,錯誤信息的描述是 : name 'name' is not defined ?顯示 名字 'name?' 沒有被定義
異常
還有很多類型的異常錯誤,當程序拋出異常錯誤之后,程序就無法繼續向下執行了.反而出現了一些錯誤的提示,這就是所謂的"異常"
(2)捕獲異常
那么咱們有什么方法,可以將這個異常進行捕獲嗎?
可以使用 try ... except ...
try ... except ...捕獲異常:
看個栗子:
# 先舉個栗子
try:print('-----test--1---')print(name)print('-----test--2---')except NameError:print('使用 try...except...成功捕獲到異常')
print('-----test--1---')
print(name)
print('-----test--2---')
except NameError:
print('使用 try...except...成功捕獲到異常')
實際操作:
說明:
此程序看不到任何錯誤提示(沒有標紅),因為用 except 捕獲到了 NameError 異常,并添加了處理的方法(except 縮進段內的語句就是處理方法)
小總結
except ...捕獲多個異常:
看個栗子:
try:print('-----test--1---')open('123.txt','r') # 以 r 只讀方式,打開文件 123.txtprint('-----test--2---')except NameError:print ('使用 try ... except ... 捕獲到 NameError 類型錯誤')
print('-----test--1---')
open('123.txt','r') # 以 r 只讀方式,打開文件 123.txt
print('-----test--2---')
except NameError:
print ('使用 try ... except ... 捕獲到 NameError 類型錯誤')
實際操作:
原因:
except 捕獲的錯誤類型是 NameError,而此時程序產生的異常為 FileNotFoundError,所以 except 沒有生效.
修改代碼:
try:print('-----test--1---')open('123.txt','r') # 以 r 只讀方式,打開文件 123.txtprint('-----test--2---')except FileNotFoundError:print ('使用 try ... except ... 捕獲到 FileNotFoundError 類型錯誤')
print('-----test--1---')
open('123.txt','r') # 以 r 只讀方式,打開文件 123.txt
print('-----test--2---')
except FileNotFoundError:
print ('使用 try ... except ... 捕獲到 FileNotFoundError 類型錯誤')
這樣 except 就可以成功捕獲到 FileNotFoundError 類型的錯誤信息了.
那么其實,實際開發過程中,捕獲多個異常的方式如下:
try:print('-----test--1---')open('123.txt','r') # 如果123.txt文件不存在,那么會產生 IOError 異常print('-----test--2---')print(num)# 如果num變量沒有定義,那么會產生 NameError 異常except (IOError,NameError):#如果想通過一次except捕獲到多個異常可以用一個元組的方式print('捕獲到 IOError 或者 NameError 錯誤')
print('-----test--1---')
open('123.txt','r') # 如果123.txt文件不存在,那么會產生 IOError 異常
print('-----test--2---')
print(num)# 如果num變量沒有定義,那么會產生 NameError 異常
except (IOError,NameError):
#如果想通過一次except捕獲到多個異常可以用一個元組的方式
print('捕獲到 IOError 或者 NameError 錯誤')
實際操作:
注意:
當捕獲多個異常時,可以把要捕獲的異常的名字,放到 except 后,并使用元組的方式進行存儲
獲取異常的信息描述
來通過圖片的方式,為大家進行詳解
捕獲所有異常
有些情況下,我們開發人員也不知道程序的運行會出現什么類型的錯誤,總不能每個類型錯誤都寫一次吧?
當然不會了,Python 在捕獲異常時,可以針對性寫異常錯誤類型,也可以不寫.
try: print(name) except: print('捕獲到程序出現異常')# 結果:捕獲到程序出現異常
print(name)
except:
print('捕獲到程序出現異常')
# 結果:捕獲到程序出現異常
except 后面什么都不寫的情況下,可以捕獲全部異常類型的錯誤.但是眼尖的同學能發現,雖然捕獲異常了,但是卻沒有了異常的信息描述.那么怎么辦呢?
try:print(name)except Exception as result:print('捕獲到程序出現異常:',result)
print(name)
except Exception as result:
print('捕獲到程序出現異常:',result)
實際操作:
這次 except 后面寫的是 Exception ,但是我沒有寫 NameError ,程序卻成功捕捉到了異常。因為 Exception 是常規錯誤的基類.所以一些常規的錯誤可以進行捕獲.
else 無異常則執行
咱們應該對 else 并不陌生,在 if 中,它的作用是當條件不滿足時執行的實行;同樣在try...except...中也是如此,即如果沒有捕獲到異常,那么就執行 else 中的事情
try: num = 100 print(num)except NameError as errorMsg: print('產生錯誤了:%s'%errorMsg) else: print('沒有捕獲到異常,真高興')
num = 100
print(num)
except NameError as errorMsg:
print('產生錯誤了:%s'%errorMsg)
else:
print('沒有捕獲到異常,真高興')
實際操作:
try ... finally ...
try...finally... 語句用來表達這樣的情況:
在程序中,如果一個段代碼必須要執行,即無論異常是否產生都要執行,那么此時就需要使用 finally。 比如文件關閉,釋放鎖,把數據庫連接返還給連接池等.
無論有沒有異常,最后都會執行 finally?下面的語句
# 舉個栗子try: num = 100 print(num)except NameError as errorMsg: print('產生錯誤了:%s'%errorMsg) else: print('沒有捕獲到異常,真開心')finally: # 可以和 else 一起使用. print('哎,對,就是開心~')
try:
num = 100
print(num)
except NameError as errorMsg:
print('產生錯誤了:%s'%errorMsg)
else:
print('沒有捕獲到異常,真開心')
finally: # 可以和 else 一起使用.
print('哎,對,就是開心~')
實際操作:
(3)異常的傳遞
異常的傳遞 函數嵌套,怎么理解呢,咱們向下看.
函數嵌套
如果一個函數發生異常,沒有進行捕獲,那么異常會傳遞給調用的函數.
# 舉個例子def func1():print("---正在執行 func1 ---開始")print(num)print("---正在執行 func1 ---結束")def func2():try:print("---正在執行 func2 ---開始")func1()print("---正在執行 func2 ---結束")except:print("---func2 捕捉到異常---")print("---無論func1 是否有異常,都執行這行代碼---")func2()
def func1():
print("---正在執行 func1 ---開始")
print(num)
print("---正在執行 func1 ---結束")
def func2():
try:
print("---正在執行 func2 ---開始")
func1()
print("---正在執行 func2 ---結束")
except:
print("---func2 捕捉到異常---")
print("---無論func1 是否有異常,都執行這行代碼---")
func2()
大家猜猜,這兩個函數的執行流程是什么?
實際操作:
這就是在函數嵌套中,如果出現異常,異常會逐層向上傳遞,異常出現后,異常下面的代碼不會執行,直到 except 捕獲異常為止.
(4)拋出自定義異常
你可以用 raise 語句來引發一個異常。異常/錯誤對象必須有一個名字(自定義的類名),且它們應是 Error 或 Exception 類的子類 。
下面是一個引發異常的例子:
class ShortInputException(Exception):'''自定義的異常類'''def __init__(self, length, atleast):#super().__init__()self.length = lengthself.atleast = atleastdef main():try:s = input('請輸入 --> ') # 根據輸入的字符串的長度進行判斷if len(s) < 3:# raise引發一個你定義的異常raise ShortInputException(len(s), 3)except ShortInputException as result:#x這個變量被綁定到了錯誤的實例print('ShortInputException: 輸入的長度是 %d,長度至少應是 %d'% (result.length, result.atleast))else:print('沒有異常發生.')main()
'''自定義的異常類'''
def __init__(self, length, atleast):
#super().__init__()
self.length = length
self.atleast = atleast
def main():
try:
s = input('請輸入 --> ') # 根據輸入的字符串的長度進行判斷
if len(s) < 3:
# raise引發一個你定義的異常
raise ShortInputException(len(s), 3)
except ShortInputException as result:#x這個變量被綁定到了錯誤的實例
print('ShortInputException: 輸入的長度是 %d,長度至少應是 %d'% (result.length, result.atleast))
else:
print('沒有異常發生.')
main()
運行結果:
注意:
以上程序中,關于代碼#super().__init__()的說明。
這一行代碼,可以調用也可以不調用,建議調用,因為 __init__ 方法往往是用來對創建完的對象進行初始化工作,如果在子類中重寫了父類的 __init__ 方法,即意味著父類中的很多初始化工作沒有做,這樣就不保證程序的穩定了,所以在以后的開發中,如果重寫了父類的__init__ 方法,最好是先調用父類的這個方法,然后再添加自己的功能
總結
以上是生活随笔為你收集整理的python进阶之学习笔记_干货 | Python进阶系列之学习笔记(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配置yml_dctc:生成docker-
- 下一篇: 储蓄卡和信用卡的区别