自动化无聊的东西Collat​​z项目

时间:2019-06-15 23:01:25

标签: python python-3.x

我目前正在“自动完成钻孔”的第3章中从事collat​​z项目。我有一个用于整数输入的完全正常运行的collat​​z函数,但是,我尝试添加除非整数值的语句以外的其他程序时,都试图使程序运行。

这是我的代码,仅适用于整数输入:

def collatz(number):
    if number % 2 == 0:
        print(number // 2)
        return(number // 2)
    else:
        print(3 * number + 1)
        return(3 * number + 1)

print('Type in a number: ')
colNum = int(input())

while colNum != 1:
        colNum = collatz(colNum)

现在,当我添加try / except语句时,这是我的代码:

def collatz(number):
    if number % 2 == 0:
        print(number // 2)
        return(number // 2)
    else:
        print(3 * number + 1)
        return(3 * number + 1)

def integercheck(inputVal):
    try:
        return int(inputVal)
    except ValueError:
        print('Error: Input needs to be a number.')
        print('Type in a number: ')
        integercheck(input())

print('Type in a number: ')
colNum = integercheck(input())

while colNum != 1:
        colNum = collatz(colNum)

这是我收到的错误代码:

Type in a number: 
string
Error: Input needs to be a number.
Type in a number: 
string
Error: Input needs to be a number.
Type in a number: 
5
Traceback (most recent call last):
  File "/Users/Library/Preferences/PyCharmCE2018.2/scratches/scratch_1.py", line 22, in <module>
    colNum = collatz(colNum)
  File "/Users/Library/Preferences/PyCharmCE2018.2/scratches/scratch_1.py", line 3, in collatz
    if number % 2 == 0:
TypeError: unsupported operand type(s) for %: 'NoneType' and 'int'

Process finished with exit code 1

需要明确的是,该程序在我立即输入整数时可以工作,但是当我在输入字符串后输入整数时,该程序将无法工作。如果有人可以帮助,我将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:2)

递归情况不返回任何内容,因此控制在调用堆栈解析时到达函数的末尾(Python函数隐式返回None,因此是您的错误)。更改行:

integercheck(input())

return integercheck(input())

或完全避免递归。补充说明:

  • 避免在函数中使用print。该side effect使其可重用性降低。
  • input("")使用了值得利用的提示字符串。
  • 每个PEP8在Python中使用snake_case
  • collatz仅执行序列的一个步骤,因此名称有点误导。设置下一个迭代的负担落在了调用者身上,但这确实为调用者提供了确定如何处理中间值的灵活性。考虑到这一点,此函数似乎非常适合重构为generator,可以一次调用一个元素或在调用代码认为合适的情况下运行整个序列。

可能的重写:

def collatz(n):
    while n > 1:
        if n % 2 == 0:
            n //= 2
        else:
            n = 3 * n + 1

        yield n

def get_int(prompt="Enter a number: ", 
            err="Error: Input needs to be a number."):
    while True:
        try:
            return int(input(prompt))
        except ValueError:
            print(err)

if __name__ == "__main__":
    for step in collatz(get_int()):
        print(step)

答案 1 :(得分:0)

这本书是Python的入门指南,我是n00basF,我写的使它起作用的代码如下:

def collatz(number):
   try:
      number = int(number)
      while (number) != 1:
        if number % 2 == 0:
            number = number // 2
            print(number)

        elif number % 2 == 1:
            number = 3 * number + 1
            print(number)   
        else:
            break
    except ValueError:
        print('ERROR!!! You need to enter an integer.')

print('Enter a number: ')
userNumber = input('>> ')

collatz(userNumber)

答案 2 :(得分:0)

我的代码如下。为了进行异常处理,我将其放入了while循环中,该循环中断了调用collat​​z函数的操作。

在我的collat​​z函数中,它首先进行测试以查看该数字是否为1,然后继续检查该数字是偶数还是奇数,然后继续进行操作以创建新数字并进行打印。我使用新数字在我的奇数/偶数块内递归调用collat​​z函数。

def collatz(number):

    if int(number) == 1:
        print('')
             
    elif int(number) % 2 == 0:
        newNumber = int(number / 2)
        print(newNumber)
        collatz(newNumber)

    elif int(number) % 2 == 1:
        newNumber = int(3 * number + 1)
        print(newNumber)
        collatz(newNumber)
    
print('Enter a number:')    
while True:         
    try:
        number = int(input())
        break
    except ValueError:
        print('Please enter a NUMBER:')

collatz(number)