python day13 14 迭代器 生成器

2022-07-26 18:51:13 字數 3876 閱讀 4479

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 =

# ## 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直接退出,不繼續執行...