迭代器和迭代物件 生成器

2021-09-17 07:42:52 字數 2473 閱讀 1371

iterator:迭代器物件,必須要實現 next 魔法函式

iterable:可迭代物件,繼承 iterator,必須要實現 iter 魔法函式

迭代器 (iterator) 與可迭代物件 (iterable) 的區別:

生成器生成器:函式中只要有 yield,這個函式就會變成生成器。每次執行到 yield 的時候,函式會暫停,並且儲存當前的執行狀態,返回返回當前的數值,並在下一次執行 next 方法的時候,又從當前位置繼續往下走。

def gen():

yield 1

# 返回乙個物件,這個物件的值是1

def ret():

return 1

# 返回乙個數字1

g = gen()

r = ret()

print(g,r)

print(next(g))

1

1可以看到return是直接返回數值 1,yield 是返回的乙個生成器物件,這個物件的值是 1,使用 next(g) 或者 for x in g:print x 都是可以獲取到他的內容的,這個物件是在 python 編譯位元組碼的時候就產生。

def gen():

yield 1

yield 11

yield 111

yield 1111

yield 11111

yield 111111

# 返回乙個物件,這個物件內的值是1和11,111...

def ret():

return 1

return 3

# 第二個return是無效的

g = gen()

r = ret()

print(g,r)

print(next(g))

for x in g:

print(x)

返回結果:11

11111

1111

11111

111111

就像迭代器的特性一樣,獲取過一遍的值是沒法再獲取一次的,並且不是那種一次把所有的結果求出放在記憶體或者說不是一次性讀取所有的內容放在記憶體中。

梳理特性:

使用 yield 的函式都是生成器函式

可以使用 for 迴圈獲取值,也可以使用 next 獲取生成器函式的值

應用:

讀取檔案,使用 open(『***』).read(2019)// 開啟乙個檔案,每次讀取 2019 個偏移量。檔案 a.txt 是一行文字,但是特別長,這一行文字根據|符號分開,如何讀取?

寫入檔案**:

# -*- coding:utf-8 -*-

import random

import threading

import string

import time

t1 = time.time()

def write(x):

with open('a.txt','a+')as a:

a.write(x + '||')

def run():

for x in range(10000000):

strs = str(random.randint(1000,2000)) +random.choice(string.ascii_letters)*10

write(strs)

for x in range(10):

t = threading.thread(target=run)

t.start()

t2 = time.time()

print(t2 - t1)

讀取檔案**:

# -*- coding:utf-8 -*-

def readbooks(f, newline):

# f為傳入的檔名,newline為分隔符

buf = ""

# 快取,處理已經讀出來的資料量

while 1:

while newline in buf:

# 快取中的資料是否存在分隔符

pos = buf.index(newline)

# 如果存在就找到字元的位置,比如0或者1或者2

yield buf[:pos]

# 暫停函式,返回快取中的從頭到字元的位置

buf = buf[pos + len(newline):]

# 快取變成了,字元的位置到末尾

chunk = f.read(2010 * 10)

# 讀取2010*10的字元

if not chunk:

# 已經讀取到了檔案結尾

yield buf

break

buf += chunk

# 加到快取

with open('a.txt','r')as f:

for line in readbooks(f,'||'):

print(line)

可迭代物件,生成器,迭代器

classa def init self self.count 10def iter self print 執行 iter return self def next self print 執行 next if self.count 0 self.count 1return self.count el...

迭代器 可迭代物件 生成器

先上本文主題 迭代器一定是可迭代物件,可迭代物件不一定是迭代器 可迭代物件要滿足什麼條件才能使用 for 正確遍歷 生成器一定是迭代器.是否為迭代器 isinstance t,iterator 是否為可迭代物件 isinstance t,iterable 實現了 iter 魔法方法,就是可迭代物件....

4 3(迭代器,迭代器物件,生成器,列舉物件)

器 包含多個值的容器。迭代 迴圈反饋 一次從容器中取出乙個值 迭代器 從裝有多個值的容器中一次取出乙個值給外界。迴圈反饋的容器,不同於索引取值,但也可以從容器物件從前往後逐個返回內部的值。迭代是乙個重複的過程,每次重複就為一次迭代,每次迭代的結果都是下一次迭代的初始值。優點 不能依賴索引,完成取值。...