Reputation: 605
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
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
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:
Upvotes: 6