2013-04-16 34 views

回答

2
import itertools 
iter_data = itertools.chain(data) 

像這樣:

In [10]: data 
Out[10]: [1, 2, 3, 4, 5, 6, 7, 8, 9] 

In [11]: iter_data=itertools.chain(data) 

In [12]: iter_data 
Out[12]: <itertools.chain at 0x1ce8950> 

In [13]: iter_data.next() 
Out[13]: 1 
+5

FWIW,這和'iter_data = iter(data)'沒什麼區別......你實際上並沒有在這裏鏈接任何東西。 – mgilson

+1

不鏈接任何東西?一個人不能有一個單一的鏈接鏈? ;-) –

1
>>> d = ['A', 'B', 'C', 'D'] 
>>> 
>>> def gen(d): 
...  for i in d: 
...    yield i 
... 
>>> for i in gen(d): 
...  print i 
... 
A 
B 
C 
D 
>>> 
6

字面相當於是:

def data_generator(): 
    yield 'A' 
    yield 'B' 
    yield 'C' 
    yield 'D' 

調用生成函數返回一個生成器 - 迭代。路過發電機迭代器列表構造函數給出了:

data_iter = (c for c in 'ABCD') 

注:

>>> list(data_generator()) 
['A', 'B', 'C', 'D'] 

該生成器 - 迭代也可以使用一個生成器表達式來創建你充滿了你的列表中有四個附加聲明。這通常不是你如何寫它。

而是做:

data = ['A', 'B', 'C', 'D'] 
1

你的意思是這樣的嗎?

def gen(): 
    for x in "ABCD": 
     yield x 

In [9]: it=gen() 

In [10]: next(it) 
Out[10]: 'A' 

In [11]: next(it) 
Out[11]: 'B' 

In [12]: next(it) 
Out[12]: 'C' 

In [13]: next(it) 
Out[13]: 'D' 
13
>>> (n for n in [1,2,3,5]) 
<generator object <genexpr> at 0x02A52940> 

作品在Python 2.7.4+

>>> a2g = lambda x : (n for n in x) 
>>> a2g([1,2,3,4,5]) 
<generator object <genexpr> at 0x02A57CD8> 

編輯:拉姆達發電機工廠模式

>>> a2g = lambda *args: (n for n in args) 
>>> for i in a2g(1,2,3,4, 5): print i 

1 
2 
3 
4 
5 
0
(item for item in listNameHere).next() 

還有一個微小的變化0

如果我記得正確,這是做這件事的一般方法。

>>> a = [0,1,2,3,4] 
>>> x = (item for item in a) 
>>> x 
<generator object <genexpr> at 0x028B8440> 
>>> x.next() 
0 
>>> x.next() 
1 
>>> x.next() 
2 

等等等等

9

你確定,你要創建一個發電機?生成器是返回迭代器類型的函數,其構造通過使用yield關鍵字(參見term-generator)。 如果你真的想這樣,steven-rumbalski的回答恰恰是你在找什麼:

data_gen = (y for y in data) 

大多數時候,你會希望直接創建一個iterator對象,例如使用next()方法。在這種情況下,答案是在評論由隱以上mgilson

data_iter = iter(data) 

這相當於data_iter = data.__iter__(),比照。 functions#iter