1. 程式人生 > 其它 >迭代器相關、for迴圈原理和異常處理

迭代器相關、for迴圈原理和異常處理

目錄

迭代器相關

可迭代物件

一、什麼是迭代?

迭代其實就是更新換代,每一次迭代的過程都是依據上一次的結果
eg:軟體的更新其實就是版本的迭代

# 單純的迴圈
import time
while True:
    time.sleep(1)
    print('qaq')
# 迭代
count = 0
while count < 8:
    print(count)
    count += 1
# 迭代取值
t1 = (12, 55, 88, 66, 74, 25, 31, 49)
count = 0
while count < len(t1):
    print(t1[count])
    count += 1

二、什麼是可迭代物件?

內建有__iter__方法的都可以稱之為可迭代物件

三、哪些資料是可迭代物件?

num = 8  # 沒有
f = 8.8  # 沒有
str1 = 'python'  # 有
l1 = [111, 222, 333, 444]  # 有
dic1 = {'name': 'johnson', 'age': 24}  # 有
s = {1, 2, 3, 4, 5, 6}  # 有
t = (1, 2, 3, 4, 5, 6)  # 有
b = False  # 沒有
str1.__iter__()
l1.__iter__()
dic1.__iter__()
s.__iter__()
t.__iter__()

迭代器物件

一、什麼是迭代器物件?

可迭代物件呼叫__iter__方法之後生成的結果就是迭代器物件

二、迭代器物件的特徵

同時含有__iter__方法和__next__方法

三、迭代器物件的作用

迭代器物件能夠極大的節省儲存空間

四、迭代器物件如何取值

呼叫__next__方法,如果取不到值則會直接報錯

五、迭代器物件補充說明

  • 一些雙下方法具有簡便寫法
"""
__方法名__  等價  方法名()
迭代器最常用的
__iter__    iter()
__next__    next()
"""
s = 'johnson'
print(s.__iter__())  # <str_iterator object at 0x000002B1D1AFA390>
print(iter(s))  # <str_iterator object at 0x000002B1D1AFA390>
print(s.__iter__().__next__())  # j
print(s.__len__())  # 7
print(len(s))  # 7

三、可迭代物件呼叫一次__iter__方法變為迭代器物件,繼續呼叫多次的結果還是迭代器物件本身

s = 'johnson'
res1 = s.__iter__()
res2 = s.__iter__().__iter__().__iter__()
print(res1, res2)  # <str_iterator object at 0x0000019C2BC2A390> <str_iterator object at 0x0000019C2BC2A320>

四、迭代取值的要求

s = 'johnson'
print(s.__iter__().__next__())  # j 每次先產生一個新的迭代器物件然後取值
print(s.__iter__().__next__())  # j 每次先產生一個新的迭代器物件然後取值

res = s.__iter__()  # 已經變為迭代器物件
print(res.__iter__().__next__())  # j 之後再呼叫多次仍是最初的的迭代器物件
print(res.__iter__().__next__())  # o 之後再呼叫多次仍是最初的的迭代器物件
print(res.__iter__().__next__())  # h 之後再呼叫多次仍是最初的的迭代器物件
print(res.__iter__().__next__())  # n 之後再呼叫多次仍是最初的的迭代器物件
print(res.__iter__().__next__())  # s 之後再呼叫多次仍是最初的的迭代器物件
print(res.__iter__().__next__())  # o 之後再呼叫多次仍是最初的的迭代器物件
print(res.__iter__().__next__())  # n 之後再呼叫多次仍是最初的的迭代器物件

for迴圈內部原理和本質

for迴圈內部原理

t1 = (111, 222, 333, 444, 555, 666, 777,)
'''需求:不依賴於for迴圈,完成對列表元素的取值'''
res = t1.__iter__()
count = 0
while count < len(t1):
    print(res.__next__())
    count += 1
"""
for迴圈底層原理
    for 變數名 in 可迭代物件:
        迴圈體程式碼
1.會將in後面的資料集呼叫__iter__()變成迭代器物件
2.針對產生的迭代器物件依次呼叫__next__()方法迭代取值
3.當值取完之後,自動處理報錯並退出迴圈
"""

for迴圈本質

# 利用while與異常處理,實現for迴圈的功能
data_info = {'name': 'boris', 'age': 55, 'nationality': 'UK'}
# 1.先轉換為迭代器物件
res = data_info.__iter__()
# 2.迭代取值
while True:
    try:
        print(res.__next__())
    except StopIteration as e:
        break

異常處理

一、什麼是異常?

程式碼執行出錯就是異常,異常會導致程式立刻停止。外號是bug,在程式設計過程中需要極力避免出現

二、異常資訊的組成部分

# input(>>>:)
#  File "D:/PyCharm 2021/week4/day16/04.異常處理.py", line 5
#     input(>>>:)
#            ^
# SyntaxError: invalid syntax
# 1.line關鍵字所在的一行
# 提示你程式碼異常的位置,點選前面的藍色字型可以定位到該位置
# 2.SyntaxError錯誤的型別
# 程式碼的報錯分為很多型別,SyntaxError只是常見的一種
# 3.invalid syntax
# 具體的報錯原因,也是我們解決報錯的依據

三、異常的分類

# 1.語法異常
# 儘量不要出現,如果出現了必須立刻改正
# eg:簡單的if分支和while迴圈語法報錯
# 2.邏輯異常
# 可以偶爾出現,如果出現了儘快修改即可
# eg:程式碼動態獲取到了一個列表型別的變數名呼叫了字典的內建方法(屬性)
l1 = [1, 2, 3, 4, 5, 6, 7]
l1.keys()  # AttributeError: 'list' object has no attribute 'keys'