hug*_*omg 104 python iterator generator infinite-loop
是否存在可以产生无限元素的直接生成器表达式?
这是一个纯粹的理论问题.这里不需要"实用"的答案:)
例如,很容易制作一个有限的发电机:
my_gen = (0 for i in xrange(42))
Run Code Online (Sandbox Code Playgroud)
但是,要创建一个无限的,我需要使用伪造的函数"污染"我的命名空间:
def _my_gen():
while True:
yield 0
my_gen = _my_gen()
Run Code Online (Sandbox Code Playgroud)
在单独的文件中执行操作并在import
以后执行操作不计算在内.
我也知道这就是itertools.repeat
这个.我很好奇是否有一个没有它的单线解决方案.
Kat*_*iel 184
itertools
提供三个无限生成器:
count(start=0, step=1)
:0,1,2,3,4 ......
cycle(p)
:p [0],p [1],...,p [-1],p [0],...
repeat(x, times=?)
:x,x,x,x,...
我不知道标准库中的任何其他人.
既然你要求一个单行:
__import__("itertools").count()
Run Code Online (Sandbox Code Playgroud)
nco*_*lan 123
for x in iter(int, 1): pass
Run Code Online (Sandbox Code Playgroud)
iter
=零参数可调用+哨兵值int()
总是回来 0
因此,iter(int, 1)
是一个无限的迭代器.这个特定的主题显然有很多变化(特别是一旦你添加lambda
到混合中).特别注意的一个变体是iter(f, object())
,使用新创建的对象作为sentinel值几乎保证无限迭代器,而不管用作第一个参数的可调用对象.
use*_*419 16
你可以遍历一个可调用的函数,返回一个总是与iter()的哨兵不同的常量
g1=iter(lambda:0,1)
Run Code Online (Sandbox Code Playgroud)
您的操作系统可能会提供可用作无限生成器的内容.例如在linux上
for i in (0 for x in open('/dev/urandom')):
print i
Run Code Online (Sandbox Code Playgroud)
显然这不如效率高
for i in __import__('itertools').repeat(0)
print i
Run Code Online (Sandbox Code Playgroud)
非常丑陋和疯狂(然而非常有趣),但是您可以使用一些技巧从表达式构建自己的迭代器(无需“污染”您的命名空间):
{ print("Hello world") for _ in
(lambda o: setattr(o, '__iter__', lambda x:x)
or setattr(o, '__next__', lambda x:True)
or o)
(type("EvilIterator", (object,), {}))() }
Run Code Online (Sandbox Code Playgroud)
小智 5
没有在内部不使用另一个定义为类/函数/生成器的无限迭代器(不是--expression,函数yield
).生成器表达式始终从anoter iterable中抽取,除了过滤和映射其项之外什么也不做.您无法从有限的项目去只有那些无限map
和filter
,你需要while
(或for
不终止,这正是我们不能只使用for
和有限的迭代器).
琐事:PEP 3142在表面上是相似的,但经过仔细检查,它似乎仍然需要for
条款(所以不(0 while True)
适合你),即只提供一个快捷方式itertools.takewhile
.
归档时间: |
|
查看次数: |
48646 次 |
最近记录: |