1. 程式人生 > 其它 >可迭代物件,迭代器物件,for迴圈本質

可迭代物件,迭代器物件,for迴圈本質

常用內建函式

# 1.map()  對映
l = [1,2,3,4]
map(lambda x:x+1,l)  # 迴圈獲取列表中每個元素並傳遞給匿名函式儲存返回值

#得到的結果沒有辦法直接列印,必須要用list之類的方法轉化一下才行
l = [1,2,3,4]
data=map(lambda x:x+1,l)
print(data)
print(list(data))

# 2.zip()  拉鍊
l = [11, 22, 33, 44, 55, 66, 77]
name_list = ['jason', 'kevin', 'tony', 'jerry']
l1 = [1, 2, 3, 4, 5, 6, 7]
l2 = [8, 7, 6, 4, 3, 2, 1]

res = zip(l, name_list, l1, l2)
print(list(res))

# 3.max與min  max求最大值 min求最小值
# l = [11, 22, 33, 44, 55, 66, 77]
# print(max(l))
# print(min(l))

d = {
    'jason':3000,
    'Bevin':1000000,
    'Ascar':10000000000,
    'aerry':88888
}
# def index(key):
#     return d[key]
# print(max(d,key=lambda key:d[key]))  # for迴圈先取值 之後再比較大小
"""

"""
# print(min(d,key=lambda key:d[key]))  # jason

# 4.filter  過濾
l = [11, 22, 33, 44, 55]
res = filter(lambda x: x > 30, l)
print(list(res))  # [33, 44, 55]

# 5.reduce  歸總
from functools import reduce
d = [11, 22, 33, 44, 55, 66, 77, 88, 99]
res = reduce(lambda x, y: x + y, d)
res1 = reduce(lambda x, y: x + y, d, 100)  # 還可以額外新增元素值
print(res)

可迭代物件

字串 列表 字典 元組 集合 檔案物件,就是可以使用可迭代方法的物件

XX__ iter 等價於iter(XX)

特例就是:檔案屬於可迭代物件和迭代器物件

可迭代物件只會被第一次的iter()所影響,然後變成迭代器物件,後面不管多少次,都他本身

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

# 可迭代物件
	內建有__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__方法 又含有__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.異常捕獲使用頻率越低越好
"""

作業

l1 = [1,2,3,4,5,6,7,8,9,11,22,33,44,55]
res=l1.__iter__()
while True:
    try:
        print(res.__next__())
    except BaseException:
            break