【问题标题】:Automate The Boring Stuff With Python - Collatz Sequence用 Python 自动化无聊的东西 - Collat​​z 序列
【发布时间】:2020-08-30 11:57:19
【问题描述】:

我对任何类型的编码都很陌生,目前使用的是 python 3.3。我已经成功地在 python 中准确地运行了 Collat​​z 序列:

while True: # The main game loop.
number = int(input('Enter number:\n'))  
def collatz(number):
    while number !=1:
        if number % 2==0: #even numbers
            number=number//2
            print(number)
        elif number % 2!=0: #odd numbers
            number=number*3+1
            print(number)
collatz(number)

但是,我不确定如何以及在何处添加 ValueError strong,因为当用户输入非整数时,如下所示:

except ValueError:
    print('Only integers accepted.')

我对 python 很陌生,所以如果有任何答案可以有一点解释,我会非常感激。谢谢

【问题讨论】:

  • 你的意思是异常处理?

标签: python collatz


【解决方案1】:

我假设您指的是Exception Handling,验证部分必须在开头完成。

    while True: # The main game loop.
        
        try:
            number = int(input('Enter number:\n'))
   
        except ValueError:
            print("Only integers accepted! Please try again ...")
        else:
            collatz(number)
#output:
#
#Enter number:
#abc
#Only integers accepted! Please try again ...
#Enter number:
#5
#16
#8
#4
#2
#1
#Enter number:

但程序会继续循环,需要终止条件。

【讨论】:

    【解决方案2】:
    def collatz():
    
        try:
            number = int(input("Enter number: "))
    
            while True:
                if number == 1 or number == 0:
                    break
    
                elif number % 2 == 0:
                    number = number // 2
                    print(number)
    
                elif number % 2 == 1:
                    number = 3 * number + 1
                    print(number)
    
        except:
            print("Enter in a valid number")
    
    
    collatz()
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

    试试这个:

    def collatz(number):
        if number % 2 == 0:
            print(number // 2)
            return number // 2
        else:
            print(3 * number + 1)
            return 3 * number + 1
    
    while True:
        try:
            number = int(input("Enter a Number or type 0 to exit: "))
            if number == 0:
                break
            while True:
                if number != 1:
                    number = collatz(number)
                else:
                    break
        except ValueError:
            print("Enter an integer number")
    

    【讨论】:

    • 我不推荐这种方法——try 部分应该尽可能窄。例如,如果在 collatz 函数中引发了 ValueError,则此错误消息将无关紧要。
    【解决方案4】:
    number = None
    
    while number != int():
        try:
            number = int(input("Enter number: "))
            break
        except:
            print("Enter a valid Number")
    
    def collatz(number):
        while number != 1:
            if number % 2 == 0:
                number = number // 2
                print(number)
            else:
                number = (3 * number + 1)
                print(number)
    
    collatz(number)
    

    【讨论】:

      【解决方案5】:

      把它放在最顶端。参数约束应始终尽快发生,这样您就不会浪费时间运行您将出错的代码。

      def progress(percentage):
          if percentage < 0 or percentage > 100:
              raise ValueError
          #  logic
      

      【讨论】:

      • 注意,这会在 collat​​z() 被调用后检查参数,并在适当时引发 ValueError。这仍然需要您捕获异常,假设您希望提示用户输入有效的输入,并且不会因为引发异常而导致程序崩溃。 stackoverflow.com/a/61789224/3570769 中提供的示例在调用 collat​​z() 之前检查参数,并循环返回以再次提示用户输入。
      • 您对为什么会出现参数约束的解释对于像我这样的新手非常有用,非常感谢!当我了解了 try 语句时,我选择了 Avishka 的回答,但我也很想了解百分比的东西是如何工作的。我还有很长的路要走
      • 同意参数约束的出现,这里percentage只是传入progress()函数的参数。在if 语句中,它检查百分比是否在范围内。如果不在范围内,则会引发 exceptionError: Value 错误并终止进程。
      猜你喜欢
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多