Python 在另一个for循环中使用for循环
我想用彩虹色打印一个文件。但是我有一个问题,下面是我的代码:Python 在另一个for循环中使用for循环,python,python-3.x,Python,Python 3.x,我想用彩虹色打印一个文件。但是我有一个问题,下面是我的代码: color = [91, 93, 92, 96, 94, 95] with open(sys.argv[1]) as f: for i in f.read(): for c in color: print('\033[{0}m{1}\033[{0};m' .format(c, i), end='', flush=True) 问题是,我想要这样的输出:Hello(红色的H,黄色的e
color = [91, 93, 92, 96, 94, 95]
with open(sys.argv[1]) as f:
for i in f.read():
for c in color:
print('\033[{0}m{1}\033[{0};m'
.format(c, i), end='', flush=True)
问题是,我想要这样的输出:Hello
(红色的H
,黄色的e
,等等),但我得到的输出是这样的:hhhhheeel…
(第一个H
红色,第二个H
黄色,等等)
我知道,因为第一个
for
将循环第二个for
。但是我如何解决这个问题呢?你不想循环每个字母的颜色,只需循环颜色,你可以使用itertools.cycle
循环颜色,只需调用next()
即可获得下一种颜色:
from itertools import cycle
color = cycle([91, 93, 92, 96, 94, 95])
with open(sys.argv[1]) as f:
for i in f.read():
print('\033[{0}m{1}\033[{0};m'
.format(next(color), i), end='', flush=True)
正如您所提到的,您不应该使用第二个for循环
您可以使用
color\u index
(初始值:0),并在每个循环中增加它(对颜色数进行模化),然后使用它:color[color\u index]
您必须以“压缩”的方式迭代它们,可能会重复第二个
color = [91, 93, 92, 96, 94, 95]
with open(sys.argv[1]) as f:
for i, c in itertools.izip(f.read(), itertools.cycle(color)):
print('\033[{0}m{1}\033[{0};m'
.format(c, i), end='', flush=True)
嗯,我得到了这个错误:
AttributeError:'module'对象在python 3中没有属性“izip”
,你不需要itertools。izip
只要zip
就可以了。它正在工作!你的答案和@achampion的答案有什么不同?不多,都使用cycle
创建无限循环颜色列表,但这使用zip()
将字母和颜色连接起来,而不是直接在循环生成器上调用next()
zip()
下一步()是否需要调用,但开销稍大一些,因为它会创建一个元组,您可以在for循环中解包。请明确,开销很小,使用这两种解决方案都不会有问题,zip()
在尝试同时处理两个列表时是惯用的。它会变成[1,2,3]进入无限列表[1,2,3,1,2,3,1,2,3,…]但没有创建列表的开销(参见生成器),我理解,它将创建一个生成器,这将[1,2,3]变成[1,2,3,1,1,2,3,1,2,3,…
。然后我们使用next()
调用它。正确的?