python中迭代器 python中的迭代器

2021-10-21 04:25:27 字數 2726 閱讀 1065

如果給定乙個list或tuple,我們可以通過for迴圈來遍歷這個list或tuple,這種遍歷我們稱為迭代(iteration)。

>>> d =

>>> for key in d:

...     print(key)ac

b當我們使用for迴圈時,只要作用於乙個可迭代物件,for迴圈就可以正常執行,而我們不太關心該物件究竟是list還是其他資料型別。

那麼,如何判斷乙個物件是可迭代物件呢?方法是通過collections模組的iterable型別判斷:

>>> from collections import iterable

>>> isinstance('abc', iterable) # str是否可迭代

true

>>> isinstance([1,2,3], iterable) # list是否可迭代

true

>>> isinstance(123, iterable) # 整數是否可迭代

false

python內建的enumerate函式可以把乙個list變成索引-元素對,這樣就可以在for迴圈中同時迭代索引和元素本身:

>>> for i, value in enumerate(['a', 'b', 'c']):

... print(i, value)

0 a1 b

2 c可迭代物件有list tuple dict str set

# a = [x*x for x in range(10)]#列表生成式

# print(a)

def f(n):

return n**3

a=[f(x) for x in range(10) ]

print(a)

print(type(a))

列表生成式的型別為list

or迴圈後面還可以加上if判斷,這樣我們就可以篩選出僅偶數的平方:

>>> a = [x * x for x in range(1, 11) if x % 2 == 0]

print(a)

[4, 16, 36, 64, 100]

還可以使用兩層迴圈,可以生成全排列:

>>> a = [m + n for m in 'abc' for n in 'xyz']

print(a)

['ax', 'ay', 'az', 'bx', 'by', 'bz', 'cx', 'cy', 'cz']

通過列表生成式,我們可以直接建立乙個列表。但是,受到記憶體限制,列表容量肯定是有限的。而且,建立乙個很多元素的列表,不僅占用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。

所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不必建立完整的list,從而節省大量的空間。在python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。

# s = (x**2 for x in range(10))

# print(s)

# #print(s.__next__()) #內部方法

# print(next(s))#等價於s.__next__() in py2:s.next()

# print(next(s))#等價於s.__next__() in py2:s.next()

# print(next(s))#等價於s.__next__() in py2:s.next()

# for i in s:#生成器是乙個可迭代物件(iterable)

# print(i)#占用記憶體小,迭代時使用完了直接**

# #生成器一共有兩種建立方式:

# #1:(x*x for x in range(x))

# #2:yield()

def bar():

print('ok1')

count = yield 1

print(count)

yield 2

b = bar()

# next(b)

s = b.send(none)# next(b) 第一次send 前如果沒有next,只能傳乙個sned(none)

print(s)

b.send('fff')

》ok1

》1》fff

如果要獲得return值則需要使用except:

>>> g = fib(6)

>>> while true:

...     try:

...         x = next(g)

...         print('g:', x)

...     except stopiteration as e:

...         print('generator return value:', e.value)

...         break

g: 1

g: 1

g: 2

g: 3

g: 5

g: 8

generator return value: done

凡是可作用於for迴圈的物件都是iterable型別;

凡是可作用於next()函式的物件都是iterator型別,它們表示乙個惰性計算的序列;

集合資料型別如list、dict、str等是iterable但不是iterator,不過可以通過iter()函式獲得乙個iterator物件。

python的for迴圈本質上就是通過不斷呼叫next()函式實現的

python中迭代器的基本方法 Python迭代器

迭代器是可以迭代的物件。在本教程中,您將了解迭代器的工作原理,以及如何使用 iter 和 next 方法構建自己的迭代器。迭代器在python中無處不在。它們優雅地實現在迴圈,推導,生成器等中,但隱藏在明顯的視覺中。python中的迭代器只是乙個可以迭代的物件。乙個將一次返回資料的物件或乙個元素。從...

python 迭代器 python迭代器

迭代器 可以直接作用for迴圈的資料型別 我們已經知道,可以直接作用for迴圈的資料型別有以下幾種 一類是集合資料型別 如 list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function 可迭代物件定義 這些可以直接作用fo...

Python中的迭代器

可以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別,如list tuple dict set str等 一類是generator,包括生成器和帶yield的生成器函式。這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable python的for迴圈本質上就是通過不斷呼叫n...