我今天早上才开始用Python编程,这(或多或少)是我的第一门编程语言。我之前做过一些编程,但是除了用几种语言编写的“ Hello World”外,实际上并没有做太多事情。我到处搜索了一些Python FizzBu​​zz解决方案,它们似乎都比我的复杂得多,因此,即使它可以正常工作,我也必须丢失一些东西。你们能指出我犯的任何错误或可以改进的地方吗?

count = 0
while (count < 101):
    if (count % 5) == 0 and (count % 3) == 0:
        print "FizzBuzz"
        count = count +1
    elif (count % 3) == 0:
        print "Fizz"
        count = count + 1
    elif (count % 5) == 0:
        print "Buzz"
        count = count +1
    else:
        print count
        count = count + 1


评论

如果您刚开始学习Python,则仅与您的问题略相关,但本页面包含一些非常有趣的技巧:reddit.com/r/Python/comments/19dir2/…。其中之一导致了Fizzbuzz问题的一种非常简洁(且相当模糊)的解决方案:['Fizz'*(not i%3)+'Buzz'*(not i%5)或i对于range(1, 100)]。

不错的解决方案!要按照大多数Fizzbuzz问题的要求,每行实际打印一项,而不仅仅是显示结果列表,这需要是:print'\ n'.join(['Fizz'*(not i%3)+'Buzz '*(不是i%5或str(i)在范围(1,101)中的i)。还要注意101-range(1,100)返回1到99.

#1 楼

丢掉无用的括号

此:

while (count < 101):


可以是:

while count < 101:


if s的增量

这样做不容易: >
count = 0
while count < 101:
    if count % 5 == 0 and count % 3 == 0:
        print "FizzBuzz"
    elif count % 3 == 0:
        print "Fizz"
    elif count % 5 == 0:
        print "Buzz"
    else:
        print count

    count = count + 1    # this will get executed every loop


我也将for重命名为count,因为它的计数不高,只是1到100之间的数字。

仅使用一个num


为什么要进行4种不同的打印,当打印的消息真正发生变化时?

for num in xrange(1,101):
    if num % 5 == 0 and num % 3 == 0:
        print "FizzBuzz"
    elif num % 3 == 0:
        print "Fizz"
    elif num % 5 == 0:
        print "Buzz"
    else:
        print num


灯泡!

print"FizzBuzz"相同。

让我们尝试一下:

for num in xrange(1,101):
    if num % 5 == 0 and num % 3 == 0:
        msg = "FizzBuzz"
    elif num % 3 == 0:
        msg = "Fizz"
    elif num % 5 == 0:
        msg = "Buzz"
    else:
        msg = str(num)
    print msg


复制并粘贴最后一个一段代码,看看它是做什么的。

Python是一种非常灵活且功能强大的语言,因此我敢肯定,对于该问题,可能还有其他一百零一种可能的解决方案:)

编辑:改进更多内容

这些行还有一些“很不正确”的内容:

for num in xrange(1,101):
    msg = ''
    if num % 3 == 0:
        msg += 'Fizz'
    if num % 5 == 0:       # no more elif
        msg += 'Buzz'
    if not msg:      # check if msg is an empty string
        msg += str(num)
    print msg


恕我直言,这样做会更好:

if not msg:
    msg += str(num)


那里!现在带有:

for num in xrange(1,101):
    msg = ''
    if num % 3 == 0:
        msg += 'Fizz'
    if num % 5 == 0:
        msg += 'Buzz'
    print msg or num


清楚地知道"Fizz" + "Buzz"是要打印的默认值。

评论


\ $ \ begingroup \ $
让我们只使用一张打印就能很好地工作,而无需将num转换为字符串。好像您已经在预期灯泡上需要转换!!还是保持味精字符串的纯粹性?
\ $ \ endgroup \ $
– tshepang
2012年6月6日18:04



\ $ \ begingroup \ $
@Tshepang:是的,我知道,但是有一个msg变量,一次是str,另一次是int会更奇怪。同样,拥有可能具有不同类型的变量也不是一个很好的实践。因此,我想说的是,这些好的做法将引导您迈向灯泡:) [编辑:是的,我想是第2条。]
\ $ \ endgroup \ $
– Rik Poggi
2012年6月6日18:11



\ $ \ begingroup \ $
在本文的一半左右,您将获得最佳的解决方案,然后开始使其变得更可爱,更易读。
\ $ \ endgroup \ $
–麦克·格雷厄姆(Mike Graham)
2014年6月11日下午0:24

\ $ \ begingroup \ $
@MikeGraham我不同意。我认为最新版本可读性强。老实说,我认为当n可以被3和5整除时,将Buzz附加到Fizz上是部分原因,它是按原样编写的。打印msg或num在“执行此操作否则要使用后备”方面非常Python化。如果是另一种语言,则可以显式设置msg的输出。
\ $ \ endgroup \ $
–乔丹·瑞特(Jordan Reiter)
2015年5月7日13:44

\ $ \ begingroup \ $
我们只需要同意不同意。如果要面试,我会立即跟进:“我改变了主意。我想要7而不是5,并且我想要Fizz而不是Fooz”。在循环解决方案中,您必须重写5行代码。在“明智的”解决方案中,您只需要重写两行代码。 “简单”的解决方案包括重复自己:检查某物是否被5整除两次,然后两次打印“ Fizz”(单独或作为另一个单词的一部分)。我们至少可以同意“让我们只使用一张印刷品”比多次调用印刷品更好吗?
\ $ \ endgroup \ $
–乔丹·瑞特(Jordan Reiter)
15年5月18日在16:16

#2 楼

您的代码看起来不错。当然可以。我唯一要说的是您要在所有if块中重复递增。您可以将其移出它们,然后您将获得相同的结果。

if (count % 5) == 0 and (count % 3) == 0:
    print "FizzBuzz"
elif (count % 3) == 0:
    print "Fizz"
elif (count % 5) == 0:
    print "Buzz"
else:
    print count
count = count + 1


如果您认识到这些值,也可以稍微压缩一下if条件0中的q被认为是False,非零是True。您正在测试它们是否等于0,因此可以将其写为

if not(count % 5) and not(count % 3):
    print "FizzBuzz"


但是,我不会像使用while循环那样执行循环使用一个for循环。这样一来,您甚至不需要在其中使用增量语句。

for count in range(0, 101):
    if not(count % 5) and not(count % 3):
        print "FizzBuzz"
    elif not(count % 3):
        print "Fizz"
    elif not(count % 5):
        print "Buzz"
    else:
        print count


评论


\ $ \ begingroup \ $
感谢您的帮助!我将不得不玩这个!
\ $ \ endgroup \ $
–bckwth
2012年3月6日14:53

\ $ \ begingroup \ $
我还要在这里包括一件事,可以检查数字是否为15的倍数而不是5和3的倍数,从而替换您的第一个条件。但是您所拥有的仍然很好,因为它们在逻辑上是等效的。
\ $ \ endgroup \ $
–杰夫·梅卡多(Jeff Mercado)
2012年3月6日14:56



\ $ \ begingroup \ $
一个简短的问题是题外话:除了减少代码行之外,是否还有一个原因让您更喜欢“ for”循环而不是“ while”循环?您觉得它更具可读性吗?大多数经验丰富的程序员会更喜欢您的方法吗?我只问这是因为对我来说似乎很难阅读,但这可能是因为它包含了我尚未介绍的概念。
\ $ \ endgroup \ $
–bckwth
2012年3月6日15:31

\ $ \ begingroup \ $
是的,确实是恕我直言的可读性。任何程序员都应该知道for循环是什么以及它的用途。给定一些变量,将针对给定集合中的每个值运行循环主体。 while循环不太清楚。给定某些条件,只要满足条件,循环主体就会运行。目前尚不清楚该条件是否会满足,因为它会受到许多因素的影响。它可能在体内的任何点发生变化。使用for循环,只有一种可能的方式可以更改“条件”,即到达主体的末端。
\ $ \ endgroup \ $
–杰夫·梅卡多(Jeff Mercado)
2012年3月6日在16:37