Swaroop Nagendra
Swaroop Nagendra

Reputation: 605

Python if statement not working?

I started learning python just now, through the book "Think like a computer scientist" and I have got stuck in some language syntax.

def amt():
    amount = input("Enter your amount: ")
    amount = int(amount)
    if amount >= 20:
        twe = amount / 20
        amount = amount - twe * 20
            print("You need to pay %d twenty dollar bills" %(twe))
    if amount >= 10:
        ten = amount / 10
        amount = amount - ten * 10
        print("You need to pay %d ten dollar bills" %(ten))
    if amount >= 5:
        five = amount / 5
        amount = amount - five * 5
        print("You need to pay %d five dollar bills" %(five))
    if amount >= 1:
        one = amount / 1
        amount = amount - one * 1
        print("You need to pay %d one dollar bills" %(one))

amt()

when I run this with some input say 7 I get an error message like this:

Traceback (most recent call last):
  File "dollars.py", line 21, in <module>
    amt()
  File "dollars.py", line 7, in amt
    print("You need to pay %d twenty dollar bills" %(twe))
UnboundLocalError: local variable 'twe' referenced before assignment

Why isn't the if statement working properly? Even though input value is less than 20 its still entering into the first if statement

Upvotes: 1

Views: 4320

Answers (2)

Hyperboreus
Hyperboreus

Reputation: 32429

Copying and pasting your code, it runs without errors, but it doesn't do what you want. I think you mix up % (modulo) with // (integer division) in order to determine the number of bills you need.

Also, when you see a lot of repetitive lines in your code, it might be the case that you should reorganize it a bit. Basically your amt boils down to this:

def amt():
    amount = int(input('Enter your amount: ') )
    for name, nomination in [ ('twenty', 20), ('ten', 10), ('five', 5), ('one', 1) ]:
        bills = amount // nomination
        amount -= bills * nomination
        if not bills: continue
        print('You need to pay {} {} dollar bill{}.'.format (bills, name, '' if bills == 1 else 's') )

Some words on integer division:

For all a ∈ ℤ and b ∈ ℤ \ {0}, there exist exactly one d ∈ ℤ and exactly one r ∈ ℤ, such that a = db + r and 0 ≤ r < b. By definition a // b = d and a % b = r.

Upvotes: 2

John Kugelman
John Kugelman

Reputation: 361605

It's not visually noticeable, but you're mixing tabs and spaces. It looks like that print statement is inside the if, but it's actually not.

This is what your source code looks like in Stack Overflow's text editor:

enter image description here

Upvotes: 6

Related Questions