Python 生成器和收益表
假设我想创建一个函数,该函数采用iterable。该iterable可以包含任何级别的其他iterable。我想创建一个按顺序遍历这些函数的函数。例如:Python 生成器和收益表,python,generator,Python,Generator,假设我想创建一个函数,该函数采用iterable。该iterable可以包含任何级别的其他iterable。我想创建一个按顺序遍历这些函数的函数。例如: import collections def it(l): for i in l: if isinstance(i, collections.Iterable): it(i) else: print i it([ [1, 2, 3], [[4, [5, 6]], 7], 8, [9, 10]])
import collections
def it(l):
for i in l:
if isinstance(i, collections.Iterable):
it(i)
else:
print i
it([ [1, 2, 3], [[4, [5, 6]], 7], 8, [9, 10]])
这将产生以下输出(如预期的那样):
1.
2.
3.
4.
5.
6.
7.
8.
9
十,
不,我想用发电机来做这个。为什么下面的语句不能像我期望的那样工作(基本上用一个收益率代替print语句):
谢谢 因为当你递归时,你会返回一个新的生成器——但这个生成器永远不会产生任何结果,因为你没有对它进行迭代。相反,请执行以下操作:
def it(l):
for i in l:
if isinstance(i, collections.Iterable):
for item in it(i):
yield item
else:
yield i
或者,在python3.3中,您可以使用关键字。只是关于使用
集合的一个快速警告。在您的类型检查中,Iterable
:字符串将破坏您的代码。它们是可编辑的,但其内容是其他字符串(原始字符串的字符)。这将导致在第一个字符上出现无限递归,除非您进行额外的检入以避免它。您可能还希望使用特殊情况字典(因为它们是可编辑的,但迭代只生成它们的键)。
def it(l):
for i in l:
if isinstance(i, collections.Iterable):
for item in it(i):
yield item
else:
yield i