请考虑以下代码:
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_iterable
是list
/ tuple
,do_some_other_work
将再次获得整个列表。但是,如果an_iterable
是iterator
或generator
,则它只会接收列表中的其他项目。我如何区分两种情况?我希望do_some_other_work
仅接收其余的项目。
答案 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)
这将它们标识为“生成器”,“可迭代”,然后是“对象”