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__方法
特點:惰性運算,開發者自定義
使用生成器的優點:
延遲計算,一次返回乙個結果。也就是說,它不會一次生成所有的結果,這對於大資料量處理,將會非常有用
#列表解析6,推導式sum([i for i in range(100000000)])#記憶體占用大,機器容易卡死
#生成器表示式
sum(i for i in range(100000000))#幾乎不佔記憶體
#[每乙個元素或者是和元素相關的操作 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 =
# ## mcase_frequency =
# print(mcase_frequency)
#集合推導式,自帶結果去重功能
# squared =
# print(squared)
作業:www.cnblogs.com/eva-j/articles/7213953.html
迭代器,生成器,可迭代
生成器有兩種 生成器表示式 x x for x in 1,2,3 yield表示式 def fib max n,a,b 0,0,1 while n max yield b a,b b,a b n n 1 return done 迭代器,有next 方法可以通過next 不斷地獲得下乙個元素的就是迭代...
生成器 迭代器
最近見天一直在看廖大的python教程,卻發現很多基礎看著很簡單,但卻不會應用,歸根結底還是因為理解不到位,故而又將教程學了一遍,並將自己的理解記錄一下,也方便後面查閱。由於沒有相關程式設計基礎,有些理解可能是錯的,敬請批評指正。想深入具體學習廖大部落格請移步廖雪峰的官方 有時候用迴圈生成列表太過繁...
迭代器,生成器
迭代器 生成器 生成器的第1種實現方式 列表生成式改為生成器 python中yield關鍵字 函式中如果有yield,那麼呼叫這個函式的返回值為生成器。當生成器g呼叫next方法,執行函式,知道遇到yield就停止 再執行next,從上一次停止的地方繼續執行 函式中遇return直接退出,不繼續執行...