我如何在生成器中格式化字符串?

How do i format strings in a generator?

我想格式化生成器中的一些值。当我尝试这样做时,出现错误:

TypeError: unsupported format string passed to generator.__format__

我尝试了不同类型的字符串格式,但没有任何效果。

这是我的代码:

def gen_secs():
    for i in range (60):
        yield i

def gen_minutes():
    for i in range (60):
        yield i

def gen_hours():
    for i in range (24):
        yield i

def gen_time(hours,minutes,seconds):
    yield (f'{hours:02}:{minutes:02}:{seconds:02}')

seconds = gen_secs()
minutes = gen_minutes()
hours = gen_hours()

gt = gen_time(hours,minutes,seconds)
while True:
    print(next(gt))

我想找回一天中所有不同的时间组合。

00:00:00
00:00:01
00:00:02
00:00:03
00:00:04
00:00:05
00:00:06 

等等...

你这里有一些问题。

  1. 一个是你的主生成器gen_time最多产生一次,排除所有其他问题,你只会得到一次。

  2. 您将生成器对象作为参数传递给您的 gen_time。然后你在生成器对象本身而不是它们的元素上格式化字符串,因此你的错误。

  3. 你在生成器上使用了一个 while True 循环,它会抛出一个 StopIteration 并中断你的程序。我不确定那是你想要的。


为了解决这个问题,考虑到计数点 (1),您需要某种循环将 yield 包裹在主生成器中。因此,您可以更改主生成器 gen_time 以在其他生成器上循环。像这样:

def gen_time():
    for hours in gen_hours():
        for minutes in gen_minutes():
            for seconds in gen_secs():
                yield (f'{hours:02}:{minutes:02}:{seconds:02}')

您还可以使用 yield from 结构编写更紧凑的代码:

def gen_time():
    yield from (f'{hours:02}:{minutes:02}:{seconds:02}' for hours in gen_hours() for minutes in gen_minutes() for seconds in gen_secs())

现在考虑第 (3) 点,您可以将主要代码更改为:

for gt in gen_time():
    print(gt)