使用 Python 实现 collatz 函数
Implementing the collatz function using Python
我目前无法完成 "Automate the boring stuff" 中的挑战:
我的代码是:
def collatz(number):
global seqNum
if (seqNum % 2 == 0):
return seqNum // 2
elif (seqNum % 2 == 1):
return 3 * seqNum + 1
print('What number would you like to use?')
seqNum = input()
number = int(seqNum)
i = number
while i > 1:
collatz(seqNum)
print(number)
我收到这个错误:
"Traceback (most recent call last):
File "C:/Users/Administrative/AppData/Local/Programs/Python/Python36-32/collatzSeq.py", line 15, in <module>
collatz(seqNum)
File "C:/Users/Administrative/AppData/Local/Programs/Python/Python36-32/collatzSeq.py", line 3, in collatz
if (seqNum % 2 == 0):
TypeError: not all arguments converted during string formatting"
我知道我在编写代码时做错了一些事情,但我不明白到底是什么。非常感谢任何帮助!
我也在用python 3.
seqNum
是一个字符串。
>>> "3" % 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting
>>>
您似乎应该将 i
传递给您的函数而不是 seqNum
。
并在您的函数中删除对 seqNum
的所有引用并改用 number
。
您正在对字符串而不是整数进行算术运算。
不需要 global
变量。将一个参数传递给一个函数,并使其 return 相应地具有一个值。
def collatz(number):
if (number % 2 == 0):
return number // 2
elif (number % 2 == 1):
return 3 * number + 1
print('What number would you like to use?')
i = int(input())
while i > 1:
i = collatz(i)
print(i)
这里有几个问题,但导致异常的一个原因是您在函数中使用了 seqNum
,这就是 input()
返回的内容。和 input()
returns 一个字符串(至少 Python 3)。对于 strings the %
是 "formatting operator",它也解释了异常消息,它谈到了 "string formatting"。
你可以这样写(用number
代替seqNum
):
def collatz(number):
# you pass the number to the function and you return, so no need for global
if number % 2 == 0: # python doesn't need parenthesis for "if"s
return number // 2
else: # it can only be even OR odd so no need to calculate the modulo again
return 3 * number + 1
# You can put the question as argument for "input" instead of printing it
seqNum = input('What number would you like to use?')
number = int(seqNum)
while number > 1 :
number = collatz(number) # assign the result of the function to "number"
print(number)
嗨,我是编码新手,也在看这个练习。如果这里有帮助的话,我采用的方法是使用 1 x 函数 + 2 x while 循环。我还注意到程序没有很好地处理零值作为输入:
# This program runs the Collatz sequence - Automate book, Chapter 3 practice project
# It includes the 'Input Validaton' additional exercise
# It also inlcudes a further test for zero value input as this makes collatz non-terminating
def collatz(number):
#test even
if number % 2 == 0:
return number // 2
#or implicit it is odd
else:
return 3 * number + 1
# Get the user input and validate - loop continues until non-zero integer entered
while True:
try:
print('Enter a non-zero number')
number = int(input())
if number == 0:
continue
else:
break
except ValueError:
print('Error: You must enter and integer')
# Iterate over the input number until it == 1
while number != 1:
# return value assigned to global var
number = collatz(number)
# output the result of collatz to screen
print(number)
# This could be the simplest solution
def collatz(number):
while True:
if number <= 1:
break
elif number % 2 == 0:
number = number // 2
print(number)
elif number % 2 == 1:
number = 3 * number + 1
print (number)
try:
print('Enter a number \n')
number = int(input())
collatz(number)
except ValueError:
print('Invalid value, Enter a number.')
我觉得这个对于我这样的初学者来说是最容易理解的:
def collatz(number):
while number != 1:
if number % 2 == 0:
number = number // 2
print(number)
else:
number = 3 * number + 1
print(number)
try:
collatz(number=int(input("Enter the number: \n")))
except ValueError:
print('Error: Invalid argument \nPlease enter a number')
def collatz(number):
if number % 2 == 0:
return number // 2
else:
return 3 * number + 1
try:
print("Enter a number: ")
i = int(input())
while i > 1:
i = collatz(i)
print(i)
except ValueError:
print("You must enter an integer.")
我目前无法完成 "Automate the boring stuff" 中的挑战:
我的代码是:
def collatz(number):
global seqNum
if (seqNum % 2 == 0):
return seqNum // 2
elif (seqNum % 2 == 1):
return 3 * seqNum + 1
print('What number would you like to use?')
seqNum = input()
number = int(seqNum)
i = number
while i > 1:
collatz(seqNum)
print(number)
我收到这个错误:
"Traceback (most recent call last):
File "C:/Users/Administrative/AppData/Local/Programs/Python/Python36-32/collatzSeq.py", line 15, in <module>
collatz(seqNum)
File "C:/Users/Administrative/AppData/Local/Programs/Python/Python36-32/collatzSeq.py", line 3, in collatz
if (seqNum % 2 == 0):
TypeError: not all arguments converted during string formatting"
我知道我在编写代码时做错了一些事情,但我不明白到底是什么。非常感谢任何帮助!
我也在用python 3.
seqNum
是一个字符串。
>>> "3" % 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting
>>>
您似乎应该将 i
传递给您的函数而不是 seqNum
。
并在您的函数中删除对 seqNum
的所有引用并改用 number
。
您正在对字符串而不是整数进行算术运算。
不需要
global
变量。将一个参数传递给一个函数,并使其 return 相应地具有一个值。
def collatz(number):
if (number % 2 == 0):
return number // 2
elif (number % 2 == 1):
return 3 * number + 1
print('What number would you like to use?')
i = int(input())
while i > 1:
i = collatz(i)
print(i)
这里有几个问题,但导致异常的一个原因是您在函数中使用了 seqNum
,这就是 input()
返回的内容。和 input()
returns 一个字符串(至少 Python 3)。对于 strings the %
是 "formatting operator",它也解释了异常消息,它谈到了 "string formatting"。
你可以这样写(用number
代替seqNum
):
def collatz(number):
# you pass the number to the function and you return, so no need for global
if number % 2 == 0: # python doesn't need parenthesis for "if"s
return number // 2
else: # it can only be even OR odd so no need to calculate the modulo again
return 3 * number + 1
# You can put the question as argument for "input" instead of printing it
seqNum = input('What number would you like to use?')
number = int(seqNum)
while number > 1 :
number = collatz(number) # assign the result of the function to "number"
print(number)
嗨,我是编码新手,也在看这个练习。如果这里有帮助的话,我采用的方法是使用 1 x 函数 + 2 x while 循环。我还注意到程序没有很好地处理零值作为输入:
# This program runs the Collatz sequence - Automate book, Chapter 3 practice project
# It includes the 'Input Validaton' additional exercise
# It also inlcudes a further test for zero value input as this makes collatz non-terminating
def collatz(number):
#test even
if number % 2 == 0:
return number // 2
#or implicit it is odd
else:
return 3 * number + 1
# Get the user input and validate - loop continues until non-zero integer entered
while True:
try:
print('Enter a non-zero number')
number = int(input())
if number == 0:
continue
else:
break
except ValueError:
print('Error: You must enter and integer')
# Iterate over the input number until it == 1
while number != 1:
# return value assigned to global var
number = collatz(number)
# output the result of collatz to screen
print(number)
# This could be the simplest solution
def collatz(number):
while True:
if number <= 1:
break
elif number % 2 == 0:
number = number // 2
print(number)
elif number % 2 == 1:
number = 3 * number + 1
print (number)
try:
print('Enter a number \n')
number = int(input())
collatz(number)
except ValueError:
print('Invalid value, Enter a number.')
我觉得这个对于我这样的初学者来说是最容易理解的:
def collatz(number):
while number != 1:
if number % 2 == 0:
number = number // 2
print(number)
else:
number = 3 * number + 1
print(number)
try:
collatz(number=int(input("Enter the number: \n")))
except ValueError:
print('Error: Invalid argument \nPlease enter a number')
def collatz(number):
if number % 2 == 0:
return number // 2
else:
return 3 * number + 1
try:
print("Enter a number: ")
i = int(input())
while i > 1:
i = collatz(i)
print(i)
except ValueError:
print("You must enter an integer.")