如何检查是否可以再次遍历iterable?

时间:2013-07-17 18:16:30

标签: python iterator iterable-unpacking

请考虑以下代码:

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_iterableiteratorgenerator,则它只会接收列表中的其他项目。我如何区分两种情况?我希望do_some_other_work仅接收其余的项目。

2 个答案:

答案 0 :(得分:3)

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

def my_fun(iterable):
    iterable = iter(iterable)
    # Do whatever.

答案 1 :(得分:-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)

这将它们标识为“生成器”,“可迭代”,然后是“对象”