我正在尝试使用以下代码将input()数据转换为int():
prompt_text = "Enter a number: "
try:
user_num = int(input(prompt_text))
except ValueError:
print("Error")
for i in range(1,10):
print(i, " times ", user_num, " is ", i*user_num)
even = ((user_num % 2) == 0)
if even:
print(user_num, " is even")
else:
print(user_num, " is odd")
当我输入 asd2 时,我得到以下奇怪的错误:
Enter a number: asd2 Error
Traceback (most recent call last): File "chapter3_ex1.py", line 8, in <module>
print(i, " times ", user_num, " is ", i*user_num)
NameError: name 'user_num' is not defined
我做错了什么?
答案 0 :(得分:3)
您面临的问题是解释器会在try
中引发错误并执行except
块。之后它将开始执行每一行。这将抛出NameError
您可以通过将程序的其余部分放入else
块来克服这个问题。
prompt_text = "Enter a number: "
try:
user_num = int(input(prompt_text))
except ValueError:
print("Error")
else:
for i in range(1,10):
print(i, " times ", user_num, " is ", i*user_num)
even = ((user_num % 2) == 0)
if even:
print(user_num, " is even")
else:
print(user_num, " is odd")
引用
try ... except语句有一个 可选的else子句 ,当 礼物,必须遵循除了条款以外的所有条款它对代码很有用 如果try子句没有引发异常 ,则必须 执行。
另一种方法是使用 sentinel 值
prompt_text = "Enter a number: "
user_num = 0 # default value
try:
user_num = int(input(prompt_text))
except ValueError:
print("Error")
这也有效。但结果可能不如预期。
Protip - 使用4个空格缩进
答案 1 :(得分:1)
问题不在于转换为int
。如果抛出异常,user_num
没有得到值,但稍后会使用它。
prompt_text = "Enter a number: "
try:
user_num = int(input(prompt_text)) # this fails with `asd2`
except ValueError:
print("Error") # Prints your error
for i in range(1,10):
print(i, " times ", user_num, " is ", i*user_num) # user_num wasn't assigned because of the error
even = ((user_num % 2) == 0)
if even:
print(user_num, " is even")
else:
print(user_num, " is odd")
您可以通过在try-block中放置使用user_num
的代码来解决此问题。我还将添加一个创建一个清理功能的函数。
def is_even(num):
return num%2 == 0
prompt_text = "Enter a number: "
try:
user_num = int(input(prompt_text))
for i in range(1,10):
print(i, " times ", user_num, " is ", i*user_num)
if is_even(user_num):
print(user_num, " is even")
else:
print(user_num, " is odd")
except ValueError:
print("Error")
查看ideone here。
答案 2 :(得分:1)
这可能不是最干净的解决方案但是它解决了问题,在你的代码中user_num没有被初始化,除非它是一个数字。
prompt_text = "Enter a number: "
user_num = "no Input"
try:
user_num = int(input(prompt_text))
except ValueError:
print("Error")
if str(user_num).isnumeric():
for i in range(1,10):
print(i, " times ", user_num, " is ", i*user_num)
even = ((user_num % 2) == 0)
if even:
print(user_num, " is even")
else:
print(user_num, " is odd")
else:
print("You did not enter a number")