ahhhhhjulie - 3 months ago 12

Python Question

How can I raise an exception here to catch nonpositive inputs? Right now nothing gets printed if I input a negative number

`"""`

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)

Answer

As Jon says, it's a much better design strategy to separate the input gathering from the core Fibonacci calculation. Also, it's generally better to use a simple loop than to use a recursive call (calling a function inside itself) unless you *really* need recursion (eg, when processing a recursive data structure, like a directory tree)..

Here's a modified version of your code. I've made a few other minor changes. In Python, we don't need a temporary variable like `nxt`

to do the core Fibonacci calculation. Instead we use tuple assignment so we can update `curr`

and save the old `curr`

to `prev`

in one step.

```
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)
```

**test**

```
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
```

Source (Stackoverflow)

Comments