2

考虑以下代码:

def my_fun(an_iterable):
  for val in an_iterable:
    do_work(val)
    if some_cond(val):
       do_some_other_work(an_iterable)
       break

如果an_iterablelist/ tupledo_some_other_work将再次获得整个列表。但如果an_iterable是 aiterator或 a generator,它将只接收列表中的其余项目。如何区分两种情况?我只想do_some_other_work收到其余的物品。

4

2 回答 2

3

没有通用的方法来判断您是否可以反复迭代一个对象。尤其是类似文件的对象,可能会搞砸检查。幸运的是,你不需要检查这个。如果您只想确保do_some_other_work只获取其余项目,则可以显式请求迭代器:

def my_fun(iterable):
    iterable = iter(iterable)
    # Do whatever.
于 2013-07-17T18:27:43.343 回答
-1

考虑以下代码段:

import types

def which(obj):
    if isinstance(obj, types.GeneratorType):
        print 'Generator'
    elif hasattr(obj, 'next') and (iter(obj) == obj):
        print 'Iterator'
    elif hasattr(obj, '__iter__'):
        print 'Iterable'
    else:
        print 'Object'

def my_gen(length):
    for i in xrange(length):
        yield i

# Reports 'Generator'
which(my_gen(10))
# Reports 'Iterable'
which(iter(xrange(10)))
# Reports 'Object'
which([i for i in xrange(10)])

with open('foo.txt', 'w+') as fout:
    for _ in xrange(10):
        fout.write('hello\n')

# Reports 'Iterable'
with open('foo.txt') as fin:
    which(fin)

这将它们标识为“生成器”、“可迭代”和“对象”

于 2013-07-17T18:23:08.107 回答