如果給定乙個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...