假设我有一个可迭代的:
var = "ABCDEF"
我得到这样的迭代:
it = itertools.combinations(var,2)
是否有任何单个函数可以打印可迭代的所有值,例如
printall(it)
而不是使用for
循环?
这取决于你想要什么,如果你想打印出所有的值,你需要计算它们 - 一个可迭代的不保证在它们都被请求之前计算这些值,所以实现这一点的最简单方法是清单:
print(list(iterable))
这将以正常列表格式打印出项目,这可能是合适的。如果您希望每个项目都在新行上,最好的选择是,正如您所提到的,一个简单的 for 循环:
for item in iterable:
print(item)
如果您不需要特定格式的数据,而只需要可读性(例如,并非全部在一行上),您可能需要查看pprint
模块。
最后一个选项,我真的不觉得是最佳的,但为了完整性而提及,在 3.x 中是可能的,其中函数print()
非常灵活:
print(*iterable, sep="\n")
在这里,我们将可迭代对象解包为参数print()
,然后将分隔符设为换行符(与通常的空格相反)。
您可以使用该str.join
方法并将可迭代的每个元素加入新行。
print('\n'.join(it))
您可以使用 format 允许每个元素按照您的意愿进行格式化:
>>> print '\n'.join('{:>10}'.format(e) for e in iter([1,2,'1','2',{1:'1'}]))
1
2
1
2
{1: '1'}
每个元素不一定是字符串,但__repr__
如果不是字符串则必须有方法。
然后,您可以轻松编写所需的功能:
>>> def printall(it,w): print '\n'.join('{:>{w}}'.format(e,w=w) for e in it)
>>> printall([1,2,'3','4',{5:'6'}],10)
1
2
3
4
{5: '6'}
我正在使用一个列表,但任何可迭代的都可以。
您可以使用itertools 中的chain()函数为 var 数据创建迭代器,然后使用迭代器的 * 运算符解包
>>> from itertools import chain
>>> var = 'ABCDEF'
>>> print(*chain(var))
A B C D E F
>>> print(*chain(var), sep='\n')
A
B
C
D
E
F
如果您只需要遍历现有数据并再次打印出来,您可以使用星号运算符 *
>>> print(*var)
A B C D E F
>>> print(*var, sep='\n')
A
B
C
D
E
F
如果您坚持一个解决方案,它在没有循环的情况下进行迭代for
并适用于无限迭代器:
from more_itertools import consume
def printall(it):
consume(map(print, it))
而不是for
我们consume
这里的循环。
请注意,在这种情况下,迭代器在打印时被消耗。
当然,这也适用于无限迭代器:
from itertools import count
printall(count())
只是为了好玩。:)