Python如何对非正数进行例外
如何在这里引发异常以捕获非正输入?现在,如果我输入一个负数,就不会打印任何内容Python如何对非正数进行例外,python,exception,numbers,try-catch,except,Python,Exception,Numbers,Try Catch,Except,如何在这里引发异常以捕获非正输入?现在,如果我输入一个负数,就不会打印任何内容 """ Generate fibonacci sequence to the nth digit """ def fib(n): try: if n <= 0: raise Exception prev = 0 curr = 1 for terms in range(0, int(n)): n
"""
Generate fibonacci sequence to the nth digit
"""
def fib(n):
try:
if n <= 0:
raise Exception
prev = 0
curr = 1
for terms in range(0, int(n)):
nxt = prev + curr
print str(curr),
prev = curr
curr = nxt
except ValueError or Exception:
new = raw_input("Invalid input. Please enter a positive integer: ")
fib(new)
n = raw_input("Enter number of terms: ")
fib(n)
“”“
生成第n位的斐波那契序列
"""
def纤维(n):
尝试:
如果n除了值错误或异常
正确的语法是except(ValueError,Exception)
,但请注意,由于所有异常都继承自Exception
,因此这可能会出现错误
你最好不要提出并试图抓住一个普遍的例外。
相反,请提高已捕获的ValueError
:
def fib(n):
try:
if n <= 0:
raise ValueError
.
.
.
except ValueError:
.
.
.
def fib(n):
尝试:
如果n要捕获多个异常类型,请将它们放入元组中ValueError或Exception
是一个计算结果为ValueError的布尔表达式
此外,您永远不应该引发异常,也永远不应该捕获它。定义自己的自定义异常类
class NonNegativeNumber(Error):
pass
...
except (ValueError, NonNegativeNumber):
然而,请注意,ValueError似乎是这里提出的一个完全有效的例外;您可能根本不需要更具体的类。我认为这里的核心问题是您的fib
函数有两个完全独立的职责:
处理用户输入和验证;及
计算斐波那契数
从名字上看,我认为它应该只做#2
相反,将您的程序组织为:
def positive_integer():
"""Loops until the user enters a positive integer."""
...
def fib(n):
"""Prints first n Fibonacci numbers."""
if n < 0:
raise ValueError
prev = 0
curr = 1
for terms in range(n): # note simplification here
nxt = prev + curr
print str(curr),
prev = curr
curr = nxt
fib(positive_integer())
只有一个:
prev, curr = curr, curr + prev
还要注意的是,一般来说,您应该使try
块尽可能短,使except
子句尽可能具体。这使得它们在阅读代码时更加有用(“我认为这一点可能会出错,在这种情况下我们可以这样做”),这意味着合法的问题不会被悄悄地忽略。特别是,您几乎不应该直接处理异常
(无论是在raise
还是except
),它的范围太广,无法有效处理。正如Jon所说,将输入收集与核心Fibonacci计算分离是一种更好的设计策略。此外,除非您确实需要递归(例如,在处理递归数据结构(如目录树)时),否则使用简单循环通常比使用递归调用(在其内部调用函数)要好
这是您的代码的修改版本。我做了一些其他的小改动。在Python中,我们不需要像nxt
这样的临时变量来进行核心斐波那契计算。相反,我们使用元组赋值,这样我们可以更新curr
,并一步将旧的curr
保存到prev
def input_positive_integer(prompt=''):
""" Get a positive integer from the user """
while True:
try:
n = int(raw_input(prompt))
if n <= 0:
raise ValueError
break
except ValueError:
print "Invalid input.",
prompt = "Please enter a positive integer: "
return n
def fib(n):
""" Print n terms of the Fibonacci sequence """
prev, curr = 0, 1
for terms in range(n):
print curr,
prev, curr = curr, prev + curr
n = input_positive_integer("Enter number of terms: ")
fib(n)
您应该将负数测试移到try
之外-您希望它导致错误!还要注意的是,try
块应该尽可能短,并且除外
测试尽可能具体,否则会隐藏真正的问题。ValueError或Exception
是一个布尔表达式,其计算结果为ValueError
(我相信您很清楚)。快速问题:当您说“int”(原始输入(提示))'是否将输入转换为整数?或者您正在验证输入的类型raw\u输入(提示符)
始终返回字符串int(some_string)
尝试将some_string
转换为整数,但如果some_string
不是表示整数的有效字符串int
将引发ValueError
。因此在表达式int(原始输入(提示))
中,int
为我们处理转换和验证。一旦我们创建了整数n
,我们就可以继续验证n
是否为非负整数。
def input_positive_integer(prompt=''):
""" Get a positive integer from the user """
while True:
try:
n = int(raw_input(prompt))
if n <= 0:
raise ValueError
break
except ValueError:
print "Invalid input.",
prompt = "Please enter a positive integer: "
return n
def fib(n):
""" Print n terms of the Fibonacci sequence """
prev, curr = 0, 1
for terms in range(n):
print curr,
prev, curr = curr, prev + curr
n = input_positive_integer("Enter number of terms: ")
fib(n)
Enter number of terms: -4
Invalid input. Please enter a positive integer: q
Invalid input. Please enter a positive integer: 2.5
Invalid input. Please enter a positive integer: 5
1 1 2 3 5