python-day13~14_迭代器_生成器
1,迭代器
# print(dir([])) #告訴我列表擁有的所有方法
# 只要是能被for迴圈的資料型別 就一定擁有__iter__方法
# print([].__iter__())
# 一個列表執行了__iter__()之後的返回值就是一個迭代器
# Iterable 可迭代的 -- > __iter__ #只要含有__iter__方法的都是可迭代的
# [].__iter__() 迭代器 -- > __next__ #通過next就可以從迭代器中一個一個的取值
# 只要含有__iter__方法的都是可迭代的 —— 可迭代協議
# 雙下方法
# print([1].__add__([2]))
# print([1]+[2])
# class A:
# # def __iter__(self):pass
# def __next__(self):pass
#
# a = A()
# print(isinstance(a,Iterator))
# print(isinstance(a,Iterable))
# 迭代器的概念
# 迭代器協議 —— 內部含有__next__和__iter__方法的就是迭代器
# 迭代器協議和可迭代協議
# 可以被for迴圈的都是可迭代的
# 可迭代的內部都有__iter__方法
# 只要是迭代器 一定可迭代
# 可迭代的.__iter__()方法就可以得到一個迭代器
# 迭代器中的__next__()方法可以一個一個的獲取值,遇到yield會停下,沒遇到yield會報錯
#for
#只有 是可迭代物件的時候 才能用for
#當我們遇到一個新的變數,不確定能不能for迴圈的時候,就判斷它是否可迭代
# for i in l:
# pass
#iterator = l.__iter__()
#iterator.__next__()
#迭代器的好處:
# 從容器型別中一個一個的取值,會把所有的值都取到。
# 節省記憶體空間
#迭代器並不會在記憶體中再佔用一大塊記憶體,
# 而是隨著迴圈 每次生成一個
# 每次next每次給我一個
2,生成器函式
#生成器函式
# def generator():
# print(1)
# return 'a'
#
# ret = generator()
# print(ret)
#只要含有yield關鍵字的函式都是生成器函式
# yield不能和return共用且需要寫在函式內
# 程式遇到yield會暫停,並返回yield後面的值。yield關鍵字後面如還有程式碼,則生成器仍駐留在記憶體中,可被接著呼叫
# def generator():
# print(1)
# yield 'a'
# #生成器函式 : 執行之後會得到一個生成器作為返回值
# ret = generator()
# print(ret)
# print(ret.__next__())
# def generator():
# print(1)
# yield 'a'
# print(2)
# yield 'b'
# yield 'c'
# g = generator()
# for i in g:
# print(i)
# ret = g.__next__()
# print(ret)
# ret = g.__next__()
# print(ret)
# ret = g.__next__()
# print(ret)
3,
# def generator():
# print(123)
# content = yield 1
# print('=======',content)
# print(456)
# arg = yield 2
# ''''''
# yield #如果生成器最後一個yield之後沒有返回值,但還有程式碼要跑,也需要用一個空yield來結束
# g1 = generator()
# g2 = generator()
# g1.__next__()
# g2.__next__()
# print('***',generator().__next__())
# print('***',generator().__next__())
# g = generator()
# ret = g.__next__()
# print('***',ret)
# ret = g.send('hello') #send的效果和next一樣
# print('***',ret)
#send 獲取下一個值的效果和next基本一致
#只是在獲取下一個值的時候,給上一yield的位置傳遞一個數據
#使用send的注意事項
# 第一次使用生成器的時候 是用next獲取下一個值
# 函式中的最後一個yield不能接受外部的值
4,預激生成器,預激生成器的裝飾器
5,生成器表示式
# egg_list=['雞蛋%s'%i for i in range(10)] #列表推導式
#生成器表示式
# g = (i for i in range(10))
# print(g) #生成器
# for i in g:
# print(i)
生成器Generator:
本質:迭代器,所以擁有__iter__方法和__next__方法
特點:惰性運算,開發者自定義
使用生成器的優點:
延遲計算,一次返回一個結果。也就是說,它不會一次生成所有的結果,這對於大資料量處理,將會非常有用
#列表解析 sum([i for i in range(100000000)])#記憶體佔用大,機器容易卡死 #生成器表示式 sum(i for i in range(100000000))#幾乎不佔記憶體
6,推導式
#[每一個元素或者是和元素相關的操作 for 元素 in 可迭代資料型別] #遍歷之後挨個處理
#[滿足條件的元素相關的操作 for 元素 in 可迭代資料型別 if 元素相關的條件] #篩選功能
# #30以內所有能被3整除的數
# ret = [i for i in range(30) if i%3 == 0] #完整的列表推導式
# g = (i for i in range(30) if i%3 == 0) #完整的生成器推導式
# print(ret)
#字典推導式
# 例一:將一個字典的key和value對調
# mcase = {'a': 10, 'b': 34}
# #{10:'a' , 34:'b'}
# mcase_frequency = {mcase[k]: k for k in mcase}
# print(mcase_frequency)
#集合推導式,自帶結果去重功能
# squared = {x**2 for x in [1, -1, 2]}
# print(squared)
作業:www.cnblogs.com/eva-j/articles/7213953.html