iterators

  • 當你建立了一個 list,你可以一個個去讀取它的內容,這就叫做一個 iterator,如下面這個片段,mylist 是一個 iterator
1
2
3
mylist = [1, 2, 3]
for i in mylist:
print(i)

執行結果:

1
2
3
  • 所有可以讓你用 for...in... 去一個個讀取內容的東西都可以叫做 iterable, 包括 lists, strings, files
  • 這些 iterables 可以隨意讀取、容易使用,但是他們會被存在 memory 裡,如果值太多就會佔太多 memory

generator

  • generator 也是 iterator 的一種,但只能 iterate 它們一次,因為 generator 並沒有把所有的值存在 memory 裡,它們只在需要的時候才生成
1
2
3
mygenerator = (x*x for x in range(3))
for i in mygenerator:
print(i)

執行結果:

0
1
4
  • generator 用 () 產生,iterator 用 [] 產生
  • 但我們不能二次使用 for i in mygenerator 因為它們算了 0 之後直接丟掉,再去算 1,最後算 4

yield

yield 就像 return 的用法,只是它回傳一個 generator

1
2
3
4
5
6
7
8
def createGenerator():
mylist = range(3)
for i in mylist:
yield i*i
mygenerator = createGenerator() # create a generator
print(mygenerator) # mygenerator is an object!
# <generator object createGenerator at 0xb7555c34>
1
2
for i in mygenerator:
print(i)

執行結果:

0
1
4
  • 當的函數要回傳一個非常大的集合,且你希望只讀一次的話,那 yield 就非常的方便了

To master yield, you must understand that when you call the function, the code you have written in the function body does not run. The function only returns the generator object, this is a bit tricky :-)

1
2
3
4
5
6
7
def count(n):
print ("counting" )
while n > 0:
print ('before yield')
yield n
n -= 1
print ('after yield' )