Python學習之路 迭代器和生成器

2021-09-10 14:29:27 字數 4079 閱讀 6737

迭代器

能被for迴圈的資料型別

list # 列表

dict # 字典

str # 字元

set # 集合

tuple # 元組

f = open() # 檔案控制代碼

range()

enumerate # 列舉

檢視資料型別含有什麼方法  使用dir()

print(dir())
雙下方法:__方法名__()

print(dir()) 檢視方法

print('__add__' in dir()) #判斷雙下方法__add__是否在列表方法內

print([1].__add__([2])) # 等同於print([1]+[2])

print([1] + [2]) # 實際執行的方法是print([1].__add__([2]))

可迭代物件:

只要資料型別含有__iter__方法的的資料型別都是可迭代物件

只要都能被for迴圈的都是可迭代物件

迭代器當可迭代物件使用了__iter__方法後,它的返回值就是乙個迭代器

只要是迭代器 一定可迭代

print(dir())

print(dir(.__iter__()))

迭代器必須同時包含__iter__和__next__兩個方法

__next__()方法可以乙個乙個的獲取值 # for迴圈其實就是在使用迭代器

print(set(dir(.__iter__())) - set(dir()))

# 例子

l = [1, 2, 3]

print(l.__iter__().__next__()) # 將l 列表通過__iter__()轉為迭代器,接著通過__next__可以取乙個值

print(l.__iter__().__next__()) # 將l 列表通過__iter__()轉為迭代器,接著通過__next__可以取下乙個值

print(l.__iter__().__next__()) # 將l 列表通過__iter__()轉為迭代器,接著通過__next__可以取下乙個值

print(l.__iter__().__next__())  # 因列表已經沒有第四個值,直接報錯

# 模擬for迴圈

l = [1,2,3,4,5,6,7,8,9]

a = iter(l) # 將l 轉為為迭代器

print('__iter__'and '__next__' in dir(a))

while true:

print(a.__next__())

可迭代協議:只要含有__iter__方法的都是可迭代的

迭代器協議:內部含有__iter__和__next__方法的迭代器

迭代器的好處:

1、從容器型別中乙個乙個的取值,會把所有的值都取到;

2、節省記憶體空間 :不會一次性產生所有值,僅通過迴圈或__next__(),一次取乙個

print(range(100000000))

print(list(range(100000000)))

注意:迭代器很好,但是並不能解決所有的,比如我需要生成200w個不同的字串,於是引出生成器

生成器生成器的本質就是乙個迭代器

生成器函式

1、只要含有yield關鍵字的函式都是生成器函式,只能用在函式內且不能和return同時存在

2、且執行完yield後這個函式不會結束,可以用__next__接著取值 

3、呼叫函式的時候,函式體不執行,返回乙個生成器

4、呼叫next方法的是會取到乙個值,直到完全取完,再執行__next__()就會報錯

def get():

for i in range(200):

yield i

ret = get()

print(ret)

print('__iter__'and '__next__' in dir(ret))

while true:

print(ret.__next__())

#for i in ret:

# print(i)

生成器函式的取值方式:

1、__next__()

2、for

3、資料型別的強制轉換 list(ret) 占用記憶體

注意:因為yield關鍵字,返回值後函式並沒有結束,所以可以接著往下用__next__()取值,直到報錯

def generator():

print(1)

yield 'a'

print(2)

yield 'b'

print(3)

yield 'c'

g = generator()

ret = g.__next__()

print(ret)

ret = g.__next__()

print(ret)

ret = g.__next__()

print(ret)

ret = g.__next__() # 會報錯 因為只有3個yield

print(ret)

#for i in g:

# print(i)

注意:解決---我需要生成200w個不同的字串

def test():

for i in range(200):

yield '第%s個 hello'%i

g = test()

for i in g:

print(i)

問題的高階:僅需要前50個,接著取51個能否取到?

def test():

for i in range(200):

yield '第%s個 hello'%i

g = test()

count = 0

for i in g:

count += 1

print(i)

if count >50:

break

print(g.__next__())

注意:每對新的變數賦予一次生成器函式呼叫,不於之前的有任何關聯

def test():

for i in range(200):

yield '第%s個 hello'%i

g = test()

g1 = test()

count = 0

for i in g:

count += 1

print(i)

if count >50:

break

print(g.__next__())

print(g1.__next__())

例子:監聽檔案輸入

# 注意檔案裡輸入內容後,儲存一下,不然不會實時輸出

def genternor(filename):

with open(filename,encoding='utf-8') as f :

while true:

line = f.readline().strip()

if line:

print(line)

genternor('count')

問題高階:如發現輸入有python,實時輸出內容+『******』,或者僅輸出帶python的字串

達到監聽過濾的效果

def genternor(filename):

with open(filename,encoding='utf-8') as f :

while true:

line = f.readline().strip()

if line:

yield line

ret = genternor('count')

for i in ret:

if 'python' in i :

print('*****',i)

else:

print(i)

#僅列印帶python的字串

# for i in ret:

# if 'python' in i :

# print(i)

Python學習之路 迭代器

可直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別,如list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function.這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable.可以使用isinstan...

python學習之路2迭代器和os模組日期

可迭代物件 可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 用isinstance 來判斷是否為可迭代物件 判斷是否為可迭代物件 isinstance iterable 除了數字,字串,布林值,其他都可以for迴圈,字串也可以 from collections import ite...

Python學習之路 day 13 迭代器

一.迭代器介紹 1.什麼是迭代器 1.1.迭代器指的是迭代取值的工具 1.2.迭代是一重複的過程,每一次重複都是基於上一次的結果而來 單純的重複不是迭代 i 0 while true print i 迭代 重複 每次重複都是基於上一次的結果而進行 l a b c i 0while i len l p...