python初識函式(6)
引言
今天來講點迭代器的內容,我們一開始接觸到的for迴圈底層就是用了迭代器。
# help() 檢視註釋資訊 help(len) # id() 返回一串相當於記憶體地址的數字 print(id('king')) # 2524633022904 # int() 型別轉換、進位制轉換 print(int('123')) # 123 print(int(0x1564654)) # 22431316 # isinstance() 判斷資料型別 print(type('king') is str) # True print(isinstance('king', str)) # True # pow() 冪指數 print(pow(8,3)) # 512 # round() 四捨五入 print(round(11.59, 1)) # 11.6 # sum()求和 print(sum([11, 55, 99, 44])) # 209
可迭代物件
迭代就是更新換代,每次迭代的過程都需要依賴上一次的結果,遊戲的更新就是版本的迭代。可迭代物件必須要內建有雙下iter方法。目前所學的知識中,字串、列表、字典、元組、集合、檔案物件是可迭代物件。
l = [1, 2, 3, 4]
l.__iter__() # 點之後有__iter__()這個內建方法才是可迭代物件
迭代器物件
可迭代物件呼叫iter方法之後生成的結果就是迭代器物件,迭代器物件含有iter方法和next方法。迭代器物件能夠極大的節省儲存空間,想用的時候就能取出很多資料。迭代器物件取值是用next方法取值的。雙下iter和雙下next方法可以簡寫為iter()和next()。檔案物件不呼叫iter()方法就含有iter和next方法,所以它本身就是迭代器物件。迭代器物件呼叫了iter方法之後得到還是它本身。
ls = [11, 22, 33, 55]
a = ls.__iter__()
print(a.__next__()) # 11
print(a.__next__()) # 22
print(a.__next__()) # 33
print(a.__next__()) # 55
for迴圈內部原理
for迴圈底層就是用到了迭代器物件,首先將in後面的可迭代物件用iter()變成迭代器物件,然後對迭代器物件一次呼叫next()方法來迭代取值,迭代器物件中的值取完會報錯,底層處理報錯然後退出迴圈。有了迭代器才有了for迴圈。
l1 = [11, 22, 33, 44, 55] res = l1.__iter__() while True: print(res.__next__())
異常處理
異常就是程式碼執行過程中報錯了,異常的外號就是bug,我們在以後程式設計中要儘量避免產生異常。異常分為語法異常和邏輯異常,語法異常是不被允許的,語法異常表示你學的不好。邏輯異常表示你的邏輯思考在某處出現了錯誤,只要找到錯誤並改正即可。
File "G:/python_work/pythonProject2/迭代器物件.py", line 9, in <module>
print(king)
NameError: name 'king' is not defined
'''
line關鍵字所在那一行是用來提醒你程式碼在哪一行出現了錯誤,可以點選前面的路徑直接跳轉到相應位置。下面的NameError是錯誤的型別,這個型別意思是名字錯誤。錯誤型別有很多種類。錯誤型別後面的一串字串的意思是錯誤的原因
'''
異常處理實操
異常處理操作是為了防止程式碼出現錯誤讓程式停止執行。但要記住異常處理使用的要求,第一點被檢測的程式碼越少越好,第二點能儘量少用就儘量少用。異常處理髮現第一個異常就不會執行下面的異常。
try:
print(king)
except NameError as e:
print('名字錯誤')
print(e)
'''
try
可能會出錯的程式碼
except 錯誤的型別 as e:
針對性的處理措施
e 得到的就是錯誤的原因
有時候不知道錯誤的型別可以用萬能異常Exception,記住這個萬能異常可以處理常見的報錯,一些稀奇的可能處理不了。
'''
# 結合else和finally一起是用
try:
可能會出錯的程式碼
except:
統一的處理措施
else:
可能會出錯的程式碼沒有出錯 最後走else子程式碼
finally:
無論try檢測的程式碼是否有異常 最後都會執行finally子程式碼
# 斷言
name = 'jason'
assert isinstance(name, str) # 如果結果是True正常執行,False就報錯 AssertionError
# 主動報錯
raise NameError('不爽 就要作!!!') # 主動報明確的錯誤型別。
for迴圈的本質
學完了迭代器,我們可以開始講講最終版的for迴圈本質了
ls = [11, 22, 33, 44]
res = ls.__iter__()
while True:
try:
print(res.__next__())
except StopIteration:
break # 觸發異常主動退出迴圈
總結
今天的學習讓我們知道了迭代取值這種新的取值方法,迭代取值和索引取值的區別在於索引取值可以繁複獲取相同的元素並且沒有固定的方向,迭代取值取值順序永遠都是從左往右並無法重複獲取。迭代取值相容所有的容器型別,索引取值只支援有序的容器型別。