1. 程式人生 > 其它 >可迭代物件、迭代器物件、for迴圈內部本質和異常捕獲

可迭代物件、迭代器物件、for迴圈內部本質和異常捕獲

可迭代物件、迭代器物件、for迴圈內部本質和異常捕獲

  • 可迭代物件
  • 迭代器物件
  • for迴圈的本質
  • 異常捕獲

可迭代物件

# 迭代
	迭代即更新換代 每次的更新都必須依賴於上一次的結果
    
'''迭代其實給我們提供了一種不依賴索引取值的方式'''

# 可迭代物件
	內建有__iter__方法的都稱之為可迭代物件	
    	內建的意思是可以通過點的方式直接檢視到的
    """
    針對雙下滑線開頭 雙下滑線結尾的方法 最為專業標準的讀法為
    	雙下方法名
    	
    面向物件的時候為了與隱藏變數區分開
    """
 
# n = 1
# while True:
#     n+=1
#     print(n)

# l = [11,22,33,44,55,66]
# n = 0
# while n < len(l):
#     print(l[n])
#     n += 1

i = 12  # 沒有
f = 11.11  # 沒有
s = 'jason'  # 有
l = [111,22,33,4]  # 有
d = {'username':'jason','pwd':123}  # 有
t = (11,22,33)  # 有
se = {11,22,33}  # 有
b = True  # 沒有
# file = open(r'a.txt','w',encoding='utf8')
"""
含有__iter__的有
    字串 列表 字典 元組 集合 檔案物件
上述通常為可迭代物件
"""
print(d)
print(d.__iter__())  # 等價於呼叫了一個內建方法 d.get()
print(iter(d))
print(d.__len__())
print(len(d))
"""
可迭代物件呼叫__iter__方法會變成迭代器物件(老母豬)

__iter__方法在呼叫的時候還有一個簡便的寫法iter()
    一般情況下所有的雙下方法都會有一個與之對應的簡化版本 方法名()
"""

迭代器物件

"""
迭代器物件
    即含有__iter__方法 又含有__next__方法
如何生成迭代器物件
    讓可迭代物件執行__iter__方法

檔案物件本身即是可迭代物件又是迭代器物件
迭代器物件無論執行多少次__iter__方法 還是迭代器物件(本身)

迭代器給我們提供了不依賴於索引取值的方式
"""
i = 12  # 沒有
f = 11.11  # 沒有
s = 'jason'  # 有
l = [111,222,333,444]  # 有
d = {'username':'jason','pwd':123}  # 有
t = (11,22,33)  # 有
se = {11,22,33}  # 有
b = True  # 沒有
file = open(r'a.txt','w',encoding='utf8')

# res = s.__iter__()  # 轉成迭代器物件
# print(res.__next__())  # 迭代器物件執行__next__方法其實就是在迭代取值(for迴圈)
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())


# res = d.__iter__()  # 轉成迭代器物件
# print(res.__next__())  # 迭代器物件執行__next__方法其實就是在迭代取值(for迴圈)
# print(res.__next__())
# print(res.__next__())  # 取完元素之後再取會"報錯"

# 易錯
# print(d.__iter__().__next__())  # username
# print(d.__iter__().__next__())  # username
# print(d.__iter__().__next__())  # username
# print(d.__iter__().__next__())  # username
# print(d.__iter__().__next__())  # username
# print(d.__iter__().__next__())  # username

for迴圈的本質

l1 = [1,2,3,4,5,6,7,8,9,11,22,33,44,55]
# 迴圈打印出列表中每個元素 但是不能使用for迴圈  __next__()  next()
# 1.先將列表轉為迭代器物件
# res = l1.__iter__()
# # 2.迴圈執行__next__取值
# while True:
#     print(res.__next__())

# for i in l1:
#     print(i)
"""
for迴圈內部原理
    1.將關鍵字in後面的資料先呼叫__iter__方法轉為迭代器物件
    2.迴圈執行__next__方法
    3.取完之後__next__會報錯 但是for迴圈會自動捕獲該錯誤並處理

res = 資料.__iter__()
while True:
    檢測程式碼是否會報錯
    res.__next__()
    如果報錯了則自動處理掉並結束while迴圈
"""

異常捕獲

# 什麼是異常
	程式碼執行出錯會導致異常 異常發生後如果沒有解決方案則會到底整個程式結束
 
# 異常三個重要組成部分
	1.traceback
    	翻到最下面從下往上的第一個藍色字型滑鼠左鍵點選即可跳轉到錯誤的程式碼所在的行
    2.XXXError
    	錯誤的型別
    3.錯誤型別冒號後面的內容
    	錯誤的詳細原因(很重要 仔細看完之後可能就會找到解決的方法)

# 錯誤的種類   
    1.語法錯誤
    	不被允許的 出現了應該立刻修改!!!
    2.邏輯錯誤
    	可以被允許的 出現了之後儘快修改即可
   		'''修改邏輯錯誤的過程其實就是在從頭到尾理清思路的過程'''
        
# print(idna)  # NameError
# l = [11,22,33]
# print(l[100])  # IndexError
# d = {'username':'jason'}
# print(d['xxx'])  # KeyError
# int('abc')  # ValueError

"""
基本語法結構
    try:
        有可能會出錯的程式碼
    except 錯誤型別 as e:
        出錯之後對應的處理機制(e是錯誤的詳細資訊)
    except 錯誤型別 as e:
        出錯之後對應的處理機制(e是錯誤的詳細資訊)
    except 錯誤型別 as e:
        出錯之後對應的處理機制(e是錯誤的詳細資訊)
"""
# try:
#     int('abc')
# except NameError as e:
#     print('變數名name不存在',e)
# except ValueError:
#     print('值不是純數字')

# 萬能異常
try:
    # int('abc')
    print(name)
    # l = [11]
    # l[100]
except Exception:
    print('你來啥都行 無所謂')

"""
異常捕獲句式和萬能異常
    1.有可能會出現錯誤的程式碼才需要被監測
    2.被監測的程式碼一定要越少越好
    3.異常捕獲使用頻率越低越好
"""