我最近才开始研究python(实际上是有趣的语言),而且,就像我在学习一种新语言(除了BrainFuck一样,这太难了)时一样,我编写了一个FizzBu​​zz程序。

我注意到这里没有错误检查,所以我的程序会出现输入错误的问题,但是请不要理会,因为我还没到那一步。

代码:

def getString(num, fizz, buzz):
    if num % (fizz * buzz) == 0:
        return "FizzBuzz"
    elif num % fizz == 0:
        return "Fizz"
    elif num % buzz == 0:
        return "Buzz"
    else:
        return num

def fizzbuzz(maxNum, fizz, buzz):
    num = 1;
    while num <= maxNum:
        print(getString(num, fizz, buzz))
        num += 1

fizz = int(input("Enter the number to Fizz: "))
buzz = int(input("Enter the number to Buzz: "))
maxNum = int(input("Enter the maximum number: "))
fizzbuzz(maxNum, fizz, buzz)


该代码将以fizzbuzzmaxNum作为输入,并将输出代码正在执行的所有嘶嘶声和嗡嗡声。

问题:


是否遵循Python约定?


评论

请注意,您的逻辑实际上是错误的。 getString(4,2,4)==“ Fizz”,当它实际上等于“ FizzBu​​zz”时。当嘶嘶声和嗡嗡声不是互质时,会发生此错误。

Brainfuck中的FizzBu​​zz太难了吗?疯狂。

有关Code Golf的相关答案。

使事情与pylint的标准保持一致永远不会有伤害。也可能是pep8。

注意:通过使用if num%fizz == 0和num%buzz == 0可以避免@BillLynch描述的错误:

#1 楼


根据PEP 8的建议,getStringmaxNum应该分别是get_stringmax_num

getString有时返回数字,有时返回字符串。这违反了由功能名称设置的期望。另外,不确定返回值类型的函数更难使用。

num = 1;←请在Python中没有分号。
fizzbuzz循环习惯上写为for num in range(1, maxNum + 1): …



评论


\ $ \ begingroup \ $
哇,我没注意到分号,但它在那里运行良好。有什么理由吗?
\ $ \ endgroup \ $
–TheCoffeeCup
15年12月15日在1:05

\ $ \ begingroup \ $
Python倾向于使用正确的代码布局来分隔语句。不建议将多个语句放在同一行上,并用分号分隔。换行符足以结束一条语句(除非前面加上反斜杠;或者在不匹配的语句内(,{或[;或在三引号中的字符串内)。)因此,无需在代码中加上过多的标点符号。
\ $ \ endgroup \ $
– 200_success
2015年12月15日,1:10

\ $ \ begingroup \ $
@TheCoffeeCup如果仍然不清楚。 Python可以使用分号来表示换行符,但是您不需要这样做(除非您试图将多条语句放在一行上,无论如何还是不建议这样做)。
\ $ \ endgroup \ $
–SuperBiasedMan
15年12月17日在11:31

\ $ \ begingroup \ $
xrange会更惯用吗?
\ $ \ endgroup \ $
–小鸡
2015年12月21日在17:32

\ $ \ begingroup \ $
@chicks这个问题被标记为python-3.x。没有xrange()。即使是Python 2,如果范围很小并且性能不是很关键,我也只会使用range()来实现兼容性。
\ $ \ endgroup \ $
– 200_success
15/12/22在5:02

#2 楼

除了其他答案以外,这里还有一种通用方法,可避免在顶层上放置过多代码:

def main():
    fizz = int(input("Enter the number to Fizz: "))
    buzz = int(input("Enter the number to Buzz: "))
    maxNum = int(input("Enter the maximum number: "))
    fizzbuzz(maxNum, fizz, buzz)

if __name__ == '__main__':
    main()


此模式允许您从命令行调用脚本,它还可以用作模块,以便您重新使用fizzbuzz()函数。

尽管它是一个相当简单的函数,但请注意使用docstrings来记录函数和可能的模块。

#3 楼

除了以前的答案:

检查if not num % fizz*buzzif num % fizz*buzz == 0更具Pythonic性

如果在elif内有return语句,则无需使用if,所以我会像这样重写您的get_string函数:

def get_string(num, fizz, buzz)
    if not num % fizz*buzz:
        return "FizzBuzz"
    if not num % fizz:
        return "Fizz"
    if not num % buzz:
        return "Buzz"
    return str(n)


评论


\ $ \ begingroup \ $
总的来说,我同意不使用某物总比不使用某物!= 0或不使用某物不无...与模运算符结合使用时,我会更加怀疑。如果不是num,则读取,然后使用not num的模。
\ $ \ endgroup \ $
– Holroy
15年12月16日在21:33

\ $ \ begingroup \ $
括号有助于澄清这一点吗?
\ $ \ endgroup \ $
–StorymasterQ
2015年12月18日,0:54

#4 楼


我注意到没有错误检查,所以我的程序会出现输入错误的问题


缺少错误检查,例如,通常认可使用duck类型并在python中首选。当然,在某些情况下可以使用输入检查,但是通常首选使用鸭式输入法。 ,int。它们都具有值,方法和标识。此外,类型检查通常只会妨碍用户。假设我使用类似于整数的类,该类与活动记录相关联,或者具有其他功能,可以更好地在我的应用程序中使用;类型检查只是进入的障碍,也许我不在乎。我可以在应用程序的任何地方都使用整数类代替整数,而无需进行类型检查;您的代码可能/将乐观地使用任何给定的对象运行并且也可以正常工作。
仅仅因为说一个输入对象不能标识为整数而退出的功能就是令人讨厌的事情。

当然,也可以利用其他微妙和聪明的优势。调用者可以通过多种方式巧妙地与您的函数集成,将具有模拟的整数兼容对象传递给您,该对象具有有价值的性能/分析跟踪和/或适当的单元测试可能需要的其他条件,或者仅知道某些数学运算的对象应用,它应该更新进度条。不管有什么奇怪的情况,Python经常会有一个“ in”。 “大家都同意的成年人”教条不会使运行时的任何部分免受好(或坏)主意的影响,让分析工程师无害地跟踪核心组件,并让性能工程师用自举代替现场代码和包装直到可以重新构造的包装器。

如果您要进行类型检查,那么我最多建议捕获不兼容的类型会引起的运算错误,并引发类型错误或特定于模块的异常,该异常可能会扩展str,当输入产生了明显的故障情况。

扩展特定于模块的异常的价值在于,它使任何调用者都可以肯定地仅从模块中捕获错误,而不会放弃有价值的语义或消息。