Цикл For в python повторяется ненужное количество раз

#python

#python

Вопрос:

Я пытаюсь создать банкомат, используя for цикл, который будет печатать 100, 20, 10 и 1 секунды, но мой цикл for чрезмерно зацикливается и даст мне нужное количество изменений, но будет проходить через 100 секунд 20 раз.

 import math

withdrawl = int(input("How much money do you want to withdraw?: "))
count = 0
for x in range(withdrawl):
    if x >= 100:
        print(math.trunc(withdrawl/100)," $100 Dollar Bills",)
        withdrawl = withdrawl - (math.trunc(withdrawl/100)*100)
        count = 1
else:
    print("0 $100 Dollar Bills")
for x in range(x-1,withdrawl):
    if x >= 20:
        print(math.trunc(withdrawl/20)," $20 Dollar Bills")
        withdrawl = withdrawl - (math.trunc(withdrawl/20)*20)
for x in range(withdrawl):
    if x >= 10:
        print(math.trunc(withdrawl/10)," $10 Dollar Bills")
        withdrawl = withdrawl - (math.trunc(withdrawl/10)*10)
for x in range(withdrawl):
    if x >= 5:
        print(math.trunc(withdrawl/5)," $5 Dollar Bills")
        withdrawl = withdrawl - (math.trunc(withdrawl/5)*5)
for x in range(withdrawl):
    if x >= 1:
        print(math.trunc(withdrawl/1)," $1 Dollar Bills")
        withdrawl = withdrawl - (math.trunc(withdrawl/1)*1)

print ("Thank you for using our upgraded ATM machine!")
  

Комментарии:

1. Не могли бы вы, пожалуйста, переформатировать свой код? if и else не имеют правильного отступа

2. for x in range(withdrawl): создаст объект диапазона в начале, например, от 0 до 9999. Когда вы затем изменяете вывод в цикле, объект range не изменяется.

3. По сути, вы ожидаете, что мы отладим вашу программу за вас… Пожалуйста, прочитайте о том, как отлаживать небольшие программы и использовать PythonTutor , чтобы помочь вам отслеживать выполнение вашей программы. В любом случае вы никогда не break выходите из циклов, поэтому они всегда будут выполняться withdrawl количество раз…

Ответ №1:

Я думаю, что для вашей цели цикл for не является необходимым. Вы можете попробовать что-то вроде

 n = 838

hundred, n = divmod(n, 100)
twenty, n  = divmod(n, 20)
ten, n     = divmod(n, 10)
five, n    = divmod(n, 5)
one        = n 

print(hundred, twenty, ten, five, one)
  

>>> 8 1 1 1 3

Комментарии:

1. вы могли бы даже изучить numpy.divmod() , поскольку это возвращает оба // и % одновременно.

Ответ №2:

Следуя @Girish Dattatray Hegde идее, вы можете иметь словарь и получать нужные вам суммы, перебирая ключи словаря, используя те же // , % операции, что и @Girish Dattatray Hegde :

 amount = 486.51
bill_dict = {
    500: 0,  200: 0,  100:0,
    50: 0,   20: 0,   10:0,
    5: 0,    2: 0,    1:0,
    0.50: 0, 0.20: 0, 0.10:0,
    0.05: 0, 0.02: 0, 0.01:0,
}
for k in bill_dict.keys():
    if amount / float(k) >= 1:
        bill_dict[k] = int(amount // k)
    amount = round(amount % k, 2)