2017年2月23日 星期四

python 生成器,迭代器 ;yield,return

生成器 與 迭代器, 有點難懂。看了很多次還不是很完全理解,可能是剛開始碰的例子不多,之後如果有更深體會再跟新記錄。

迭代器:  
my_list = [x*x for x in range(4)]
生成器:
my_generator = (x*x for x in range(4))
基本上是分小括號和中括號做區分。
不過如果寫在函數裡面就不用這樣分法
如果需要回傳值,return  是for 迭代器 。 yield則是for 生成器。
例子:

 def createGenerator() :
  mylist = ['a','b','c']
  em= []
  for i in range(len(mylist)) :
  empty= mylist[i]
  em.append(empty)
  return em
mygenerator = createGenerator() # create a generator
print(mygenerator) # mygenerator is an object!
回傳: ['a', 'b', 'c']

for url in createGenerator():
  pass
  print (url)
回傳:
a
b
c

 def createGenerator() :
  mylist = ['a','b','c']
  em= []
  for i in range(len(mylist)) :
  empty= mylist[i]
  em.append(empty)
  yield em
mygenerator = createGenerator() # create a generator
print(mygenerator) # mygenerator is an object!
回傳:  <generator object createGenerator at 0x05E08328>

for url in createGenerator():
  pass
  print (url)
回傳: ['a', 'b', 'c']

*  第一個例子是迭代器的結果,
用  url 進入函數 createGenerator(),由於函數裡的回傳值是return,所以吐回給url的訊息是迭代器的結果,
告訴我們依序進入mylist時得到的值。

若第一個例子直接跑函數:
createGenerator()
回傳: ['a', 'b', 'c']

*  第二個例子則是生成器的結果
碰到yield其實會終止,並跳出迴圈,下次進入時再從終止的位置繼續。
不過這個範例,我把它放到迴圈之外,所以看不出來,因為是要呈現生成器吐出的東西,
也就是說用生成器利用 for in 完成迭代器的出值方式。





這封郵件來自 Evernote。Evernote 是您專屬的工作空間,免費下載 Evernote

0 意見:

張貼留言

Contact

Get in touch with me


Adress/Street

12 Street West Victoria 1234 Australia

Phone number

+(12) 3456 789

Website

www.johnsmith.com