如何将python生成器与多个if语句一起使用?

如何将python生成器与多个if语句一起使用?,python,generator,Python,Generator,说一些基本的话,比如: def fizzBuzz(n: int) -> List[str]: l =[] for i in range(1,n+1): if i%3==0 and i%5==0: l.append("FizzBuzz") elif i%3==0: l.append("Fizz")

说一些基本的话,比如:

def fizzBuzz(n: int) -> List[str]:
        l =[]
        for i in range(1,n+1):
            if i%3==0 and i%5==0:
                l.append("FizzBuzz")
            elif i%3==0:
                l.append("Fizz")
            elif i%5==0:
                l.append("Buzz")
            else:
                l.append(str(i))
        return l
其中输入:n=15。
输出:[ "1", "2", “嘶嘶声”, "4", “嗡嗡声”, “嘶嘶声”, "7", "8", “嘶嘶声”, “嗡嗡声”, "11", “嘶嘶声”, "13", "14", “嘶嘶作响” ]
我从以下内容开始:

["FizzBuzz" if x%3 ==0 and x%5==0 else str(x) for x in range(1, n+1)]

由于您需要一个生成器,下面是您的函数转换为一个,以及用法

请注意,
fizz\u buzz(n)
返回一个新的生成器,因此,如果需要多次迭代,则每次都必须生成一个新的生成器

n = 15


def fizz_buzz(n: int):
    for i in range(1, n + 1):
        if i % 3 == 0 and i % 5 == 0:
            yield "FizzBuzz"
        elif i % 3 == 0:
            yield "Fizz"
        elif i % 5 == 0:
            yield "Buzz"
        else:
            yield str(i)


a = fizz_buzz(n)
for f in a:
    print(f)
输出:


然而,您可能想要一个一行的列表,并且不知道它叫什么,并且假设它的名字是“生成器”

那么,

b = ["FizzBuzz" if i%3==0 and i%5==0 else "Fizz" if i%3==0 else "Buzz" if i%5==0 else str(i) for i in range(n)]
print(b)
而且,这也可以是一个单线性发生器

c = ("FizzBuzz" if i%3==0 and i%5==0 else "Fizz" if i%3==0 else "Buzz" if i%5==0 else str(i) for i in range(n))
for f in c:
    print(f)

由于您需要一个生成器,下面是您的函数转换为一个,以及用法

请注意,
fizz\u buzz(n)
返回一个新的生成器,因此,如果需要多次迭代,则每次都必须生成一个新的生成器

n = 15


def fizz_buzz(n: int):
    for i in range(1, n + 1):
        if i % 3 == 0 and i % 5 == 0:
            yield "FizzBuzz"
        elif i % 3 == 0:
            yield "Fizz"
        elif i % 5 == 0:
            yield "Buzz"
        else:
            yield str(i)


a = fizz_buzz(n)
for f in a:
    print(f)
输出:


然而,您可能想要一个一行的列表,并且不知道它叫什么,并且假设它的名字是“生成器”

那么,

b = ["FizzBuzz" if i%3==0 and i%5==0 else "Fizz" if i%3==0 else "Buzz" if i%5==0 else str(i) for i in range(n)]
print(b)
而且,这也可以是一个单线性发生器

c = ("FizzBuzz" if i%3==0 and i%5==0 else "Fizz" if i%3==0 else "Buzz" if i%5==0 else str(i) for i in range(n))
for f in c:
    print(f)

这回答了你的问题吗?更好的答案<代码>[(“嘶嘶声”*(不是我%3)+“嗡嗡声”*(不是我%5))或str(i)表示(1,n+1)范围内的i)]如果使用括号而不是括号,您将得到一个generator@venky__,有趣的是,我在没有实际打开链接的情况下编写了与上一个示例几乎相同的列表理解:D@LucasMoeskops,阅读代码示例后的文本;-)为了更好的可读性,我留了括号。这能回答你的问题吗?更好的答案<代码>[(“嘶嘶声”*(不是我%3)+“嗡嗡声”*(不是我%5))或str(i)表示(1,n+1)范围内的i)]如果使用括号而不是括号,您将得到一个generator@venky__,有趣的是,我在没有实际打开链接的情况下编写了与上一个示例几乎相同的列表理解:D@LucasMoeskops,阅读代码示例后的文本;-)请注意,
I%3==0和I%5==0
相当于
I%15==0
@cyrijouve,这是正确的,但不符合模块化、可读性和简单性的目的。这里的主要问题是“15是多少?”。如果数字不再是3和5,而是
m
n
?现在“FizzBuzz”将检查
n*m
,它将存储在一个额外的变量中,因为它需要一个名称。我建议:@cyrijouve我上次的意思是链接了错误的一个注意,
I%3==0和I%5==0
相当于
I%15==0
@cyrijouve正确,但超出了模块化、可读性和简单性的目的。这里的主要问题是“15是多少?”。如果数字不再是3和5,而是
m
n
?现在“FizzBuzz”将检查
n*m
,它将存储在一个额外的变量中,因为它需要一个名称。我建议:@cyrijouve我上次是说这个链接错了