说我有一个清单
data = []
data.append("A")
data.append("B")
data.append("C")
data.append("D")
Run Code Online (Sandbox Code Playgroud)
如何将此转换为生成器类型?任何有关示例代码的帮助都非常感谢...
找到一个URL http://eli.thegreenplace.net/2012/04/05/implementing-a-generatoryield-in-a-python-c-extension/
这是我想做的吗?
Dav*_*vid 21
>>> (n for n in [1, 2, 3, 5])
<generator object <genexpr> at 0x02A52940>
Run Code Online (Sandbox Code Playgroud)
适用于Python 2.7.4+
>>> a2g = lambda x : (n for n in x)
>>> a2g([1, 2, 3, 4, 5])
<generator object <genexpr> at 0x02A57CD8>
Run Code Online (Sandbox Code Playgroud)
编辑:
lambda发电机工厂模式的另一个细微变化
>>> a2g = lambda *args: (n for n in args)
>>> for i in a2g(1, 2, 3, 4, 5): print i
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
Hei*_*ann 19
你确定,你想创建一个发电机吗?生成器是返回迭代器类型的函数,例如通过使用yield关键字(参见term-generator)构造.如果你真的想要这个,steven-rumbalski的回答正是你要找的:
data_gen = (y for y in data)
Run Code Online (Sandbox Code Playgroud)
大多数情况下,您需要直接创建迭代器对象,例如使用该next()方法.在这种情况下,答案隐含在以上mgilson的评论中:
data_iter = iter(data)
Run Code Online (Sandbox Code Playgroud)
相当于data_iter = data.__iter__(),参见 功能#iter.
字面上的等价物是:
def data_generator():
yield 'A'
yield 'B'
yield 'C'
yield 'D'
Run Code Online (Sandbox Code Playgroud)
调用生成器函数会返回生成器迭代器.将generator-iterator传递给列表构造函数会给出:
>>> list(data_generator())
['A', 'B', 'C', 'D']
Run Code Online (Sandbox Code Playgroud)
也可以使用生成器表达式创建此生成器迭代器:
data_iter = (c for c in 'ABCD')
Run Code Online (Sandbox Code Playgroud)
注意: 您在列表中填写了四个附加语句.这通常不是你怎么写的.
而是做:
data = ['A', 'B', 'C', 'D']
Run Code Online (Sandbox Code Playgroud)
import itertools
iter_data = itertools.chain(data)
Run Code Online (Sandbox Code Playgroud)
像这样:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21193 次 |
| 最近记录: |