1. iterator(迭代器)
舉例:我們對list使用for
for i in [1,2,3,4]:
print(i)12
34
對string物件使用for
for ch in 'python':
print(ch)py
thon
對字典物件使用for
for k in :
print(k)
yx
對檔案使用for
for line in open('a.text'):
print(line)
fisrt line
second line
這樣的可以用for迴圈來操作的物件稱為可迭代物件
內建函式 iter() 需要乙個可迭代的物件作為引數生成乙個迭代器:迭代器的作用就是除了具有for迴圈方法之外,還有函式自帶的next()方法 (python3內建函式調是__next__()方式,是屬於迭代器的屬性)。
>>> x = iter([1,2,3])
>>> x
>>> x.__next__()
1>>> x.__next__()
2>>> x.__next__()
3>>> x.__next__()
traceback (most recent call last):
file "", line 1, in stopiteration
也可以用類的定義來定義next()方法來呼叫
class iter:
def __init__(self,n):
self.i = 0
self.n = n
def __iter__(self):
return self
def next(self):
if self.i 2.generator(生成器)
什麼是生成器?一句話,生成器本質就是迭器。生成器是連續生成一堆結果的函式(不是單個值),有關鍵字yield帶領
def foo():
print('begin')
for i in range(4):
print('before yield',i)
yield i
print('after yield',i)
print('end')
>>> f = foo()
>>> f.__next__()
begin
before yield 0
0>>> f.__next__()
after yield 0
before yield 1
1>>> f.__next__()
after yield 1
before yield 2
2>>> f.__next__()
after yield 2
endtraceback (most recent call last):
file "", line 1, in stopiteration
>>>
yield 的作用是乙個開關一樣,你呼叫next()是,會生成值輸出,然後整個函式停在yield所在地,也就是後面的print()不執行。當下次呼叫yield時,從上一次暫停的地方開始,開始迴圈,再次到yield處。
3.生成器表示式(生成器版本的列表集合)
本質是列表,但是不返回列表,返回乙個列表生成器,也就是乙個關著的list。
>>> a = (x*x for x in range(5))
>>> a
at 0x000001ea3a449660>
>>> sum(a)
30>>>
4.itertools 這是標準庫裡面的模組,包含很多迭代器操作函式
chain(鍊子)-將兩個迭代器加在一起
>>> it1 = iter([1,2,3])
>>> it2 = iter([4,5,6])
>>> itertools.chain(it1,it2)
[1,2,3,4,5,6]
izip -迭代版本的zip
>>> for x,y in itertools.izip(['a','b','c'],[1,2,3]):
... print(x,y)
...a 1
b 2c 3
生成器和迭代器
可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...
迭代器和生成器
1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...
迭代器和生成器
迭代器 迭代 iterate 意味著重複多次,就像迴圈那樣。本書前面只使用for迴圈迭代過序列和字典,但實際上也可迭代其他物件 實現了方法iter的物件。方法iter返回乙個迭代器,它是包含next的物件,而呼叫這個方法時可不提供任何引數。當你呼叫方法next時,迭代器應返回其下乙個值。如果迭代器沒...