迭代器

迭代器函數

''''
'''
'''
什麼是迭代器
    迭代:更新換代的過程,每次迭代必須基於上次迭代的結果
    迭代器:迭代取值的工具

能夠迭代取值的數據類型
    字符串
    列表
    元組
    集合
    字典
    
如何判斷是不是可迭代對象
    內置方法有.__iter__的數據就是可迭代數據
 







如何判斷迭代器對象?
    內置方法有.__iter__
              .__next__  兩種內置方法的稱爲迭代器對象 
文件屬於迭代器對象

迭代器對象無論執行多少次.__iter__ 最後仍是迭代器自己   

l = [1,2,3,4]
iter_f = l.__iter__()
print(iter_f is iter_f.__iter__().__iter__().__iter__().__iter__())  # True


內置方法.__iter__ 就是將可迭代對象轉換爲迭代器對象

l = [1,2,3,4] 
iter_l = l.__iter__()
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__())
# 迭代次數超過迭代器對象中元素個數時,會報錯StopIteration


異常處理
l = [1,2,3,4]
iter_l = l.__iter__()
while True:
    try:
        print(iter_l.__next__())
    except StopIteration:
        print('取值結束')
        break
        
迭代器取值的特色:
    只能日後依次取 不能返回再次取值

'''

for循環原理工具

'''
for 循環的本質
    for循環是將in後面的對象調用.__iter__ 轉換成迭代器對象
    調用__next__ 進行迭代取值
    內部有異常捕獲StopIteration  當__next__報錯這個錯時,直接結束循環

迭代取值的優缺點
    優勢:不依賴索引取值
         內存中只佔一個空間,內存不會溢出
         
    缺點:不能索引取值
         所有取完再取會報StopIteration
         
'''

生成器spa

'''
生成器:就是 用戶本身定義的迭代去,本質上就是迭代器
def func():
    print('hello')
    yield
在函數定義中出現yield就是表明生產器
可是函數名加括號 不會觸發函數體代碼的運行

'''


def func():
    print('cly')
    yield 1
    print('clysb')
    yield 1,2
    print('clydsb')
    yield 1,2,3,4,5

f = func()  # 生成器初始化,將函數變成迭代器
print(f.__next__())
print(f.__next__())
print(f.__next__())

'''
yield關鍵字後面跟的值,就是__next__須要返回的值
yield不能結束函數,但能暫定函數,須要再次__next__取值纔會繼續執行
yield後 返回多個值時,會將多個值以元組的形式返回

yield 與 return的相同點在於 都能返回值,返回多個值都是以元組的形式返回

yield 與 return的不一樣點在於 return能直接結束函數 , yield只是暫停函數
                            能從外部給yield傳值

def func():
    print('今天學了啥')
    while True:
        study = yield
        print(study)
f = func()
f.__next__()
f.send('迭代器')  # 內部共作了兩個步驟 給yield左邊的變量傳參,在執行f.__next__一次
# f.__next__()


'''

'''
生成器表達式:
    f = (i for i in range(10) if i != 4)
    這是一個生成器,並非元組生產器
生產器不會主動執行任何一行代碼,
必須經過.__next__觸發代碼執行
'''
def add(n,i):
    return n+i
def test():
    for i in range(4):
        yield i
g=test()

for n in [1,10]:
    g=(add(n,i) for i in g)
# 第一次for循環 add(1,i) for i in test()
# 第二次for循環 add(10,i) for i in (add(1,i) for i in test())
print(n)
res=list(g)
相關文章
相關標籤/搜索