Python 生成器和迭代器

2021-09-24 17:27:47 字數 1995 閱讀 2054

# 列表生成式,值一下子,全部計算出來:

l = [ x*2 for x in range(5)]

l # 輸出: [0, 2, 4, 6, 8]

# 建立生成器, 列表元素是推算出來的:

g = ( x*2 for x in range(5))

g # 輸出: at 0x1077d9db0>

next(g) # 每執行一次 next(),輸出乙個元素, 等價於 g.__next__(), python 2.x : g.next()

# 建立生成器的第二種方式: 使用函式(yield 關鍵字)

# 斐波拉契數列(fibonacci)

def fib(times):

n = 0

a, b = 0, 1

while n < times:

print(b)

a, b = b, a+b

n += 1

return 'done'

fib(5)

# 生成器(ipython 中操作)

def fib():

print("=== start ===")

a, b = 0, 1

for i in range(5):

print("=== 1 ===")

yield b

print("=== 2 ===")

a, b = b, a+b

print("=== 3 ===")

print("=== stop ===")

a = fib()

a # 輸出: next(a) # 等價於 a.__next__()

# 輸出:

# === start ===

# === 1 ===

# 1

# 此時,fib()函式就是生成器,可以使用迴圈來迭代

for num in a:

print(num)

1.1 send 方法
# 示例:

# ipython3 中操作

def gen():

i = 0

while i<5:

temp = yield i

print(temp)

i+=1

a = gen()

a.__next__() # 輸出: 0

a.__next__() # 輸出: none

c = a.send("haha") # 輸出: haha

print(c) # 輸出: 2

# 說明: 程式執行到yield時,gen函式暫時停止,同時返回i的值;

# temp 接收send過來的值(haha);

# a.__next__() 等價 a.send(none)

# 若是第一次直接呼叫 a.send("haha"), 程式會報錯

2.1 可迭代物件

可以使用isinstance()判斷乙個物件是否是iterable物件;

擁有內建方法__iter__();

# 示例:

from collections import iterable

isinstance(, iterable) # true

2.2 迭代器
# 示例:

from collections import iterator

isinstance((x for x in range(10), iterator) # true

isinstance(, iterator) # false

2.3 iter()函式
# 示例:

from collections import iterator

isinstance(iter(), iterator) # true

Python迭代器和生成器

先說迭代器,對於string list dict tuple等這類容器物件,使用for迴圈遍歷是很方便的。在後台for語句對容器物件呼叫iter 函式,iter 是python的內建函式。iter 會返回乙個定義了next 方法的迭代器物件,它在容器中逐個訪問容器內元素,next 也是python的...

Python迭代器和生成器

迭代器是訪問集合元素的一種方法 是可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問 他有兩個基本的方法,iter 和next 字串,列表或遠足物件都可以用於建立迭代器 list1 1,2,3,4 it1 iter list1 建立迭代器物件 print next ...

python 迭代器和生成器

迭代器是訪問集合元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退,不過這也沒什麼,因為人們很少在迭代途中往後退。另外,迭代器的一大優點是不要求事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之後,元素可...