Цикл Python while с 2 условиями для переменных - PullRequest
0 голосов
/ 18 мая 2018

Ниже приведен код, созданный для практики, и я намеревался попробовать цикл while и убедиться, что суммы moneyihave и coffee оба вычитаются, пока один из них не достигнет 0, что приведет к разрыву цикла.

Проблема, с которой я столкнулся, заключается в том, что moneyihave не вычитается правильно. когда я ввожу 200 для coffee, сначала вычитается двойная сумма. но когда я ввожу больше 200, кажется, что он правильно вычитает сумму из moneyihave, но не прерывает цикл, пока moneyihave не станет -200 ..

Я очень новичок в python, и если бы кто-то смог меня пройти, я был бы очень признателен!

coffee = 20
coffeeprice = 200
moneyihave = 40000

while True:
    money = int(input('insert your money: '))
    if money == 200:
        coffee = coffee - 1
        moneyihave = moneyihave - 200

        print('here is your coffee, we have {} coffees left'.format(coffee))
        print('you have {} left in your pocket'.format(moneyihave-200))

    elif money>200:

        print('please take your change {} and here is your coffee'.format(money-200))        
        print('you have {} left in your pocket'.format(moneyihave-200))   

        coffee = coffee -1
        moneyihave = moneyihave - 200

    else:

        print('our coffee is 300 dollars')
        print('we have {} coffees left'.format(coffee))
        print('you have {} left in your pocket'.format(moneyihave))


    if not coffee:      

        print('please come back, we do not have coffee anymore')
        break

    elif moneyihave<=0:
        print('no more money')
        break

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

ИМХО, я думаю, использование while True в такой ситуации не является хорошей практикой.

Я бы посоветовал вам заранее проверить, является ли каждое из них наименьшим, используя min(moneyihave, coffee), а затем создать цикл, используяrange method:

min_val = min(moneyihave, coffee)
for i in range(0, min_val):
    print(i) # Goes from 0 to min_val

Другой способ, который я бы посоветовал вам, это напрямую установить условия цикла в операторе while:

# Since you sell coffee's without checking if you still have some, the condition should be coffee > 0.
while moneyihave >= 0 and coffee > 0:
    # Do stuff...
    # Deduct variables:
    moneyihave -= 1
    coffee -= 1

Но, глядя на ваш кодЯ вижу некоторые другие проблемы:

  • У вас есть coffeeprice, но он никогда не используется.Я предполагаю, что вы намерены вычесть его из moneyihave каждый раз, когда «покупатель» покупает кофе.
  • Пользователь вводит деньги на каждой итерации цикла, но это введенное значение используется только для проверки первого if...else блок.Я думаю, что немного сбивает с толку, когда значение money устанавливается каждый раз, но вычитая некоторую сумму из moneyihave.
  • у вас есть: print('you have {} left in your pocket'.format(moneyihave-200)) после выполнения moneyihave = moneyihave - 200, таким образом, вы показываете пользователюневерное количество.
  • Фраза print('our coffee is 300 dollars') не совпадает с указанной ценой на кофе.Опять же, я думаю, что проблема здесь не в том, чтобы использовать эту переменную

Кроме того, в вашем первом if...else блоке, и на if, и на elif вы тратите один кофе и немного денег, таким образом ярекомендовал бы рефакторинг для чего-то вроде:

# Spend money if possible
if money >= 200:
    coffee = coffee - 1
    moneyihave = moneyihave - 200 # I think here you should use coffeeprice
else:
    print('our coffee is 300 dollars') # I think here you should use coffeeprice
    print('we have {} coffees left'.format(coffee))
    print('you have {} left in your pocket'.format(moneyihave)) # Since he can't have negative money, this should always be 0

# User still have money left
if moneyihave > 0:
    print('please take your change {} and here is your coffee'.format(money-200))        
    print('you have {} left in your pocket'.format(moneyihave-200))
else:
    print('here is your coffee, we have {} coffees left'.format(coffee))
    print('you have {} left in your pocket'.format(moneyihave-200))
0 голосов
/ 18 мая 2018

Я отредактировал ваш код, и это, кажется, работает.Проблема в том, что когда вы форматировали код, вы использовали .format (moneyihave-200).Таким образом, вы изначально вычитали 400, когда печатали результаты, хотя вы только вычитали 200. Ваше напечатанное значение не соответствовало фактическому значению.Приведенный ниже код упростит это и даст вам вывод, который вы ищете:

coffee = 20
coffeeprice = 200
moneyihave = 40000

while True:
    money = int(input('insert your money: '))
    if money == 200:
        coffee -= 1
        moneyihave -= 200

        print('here is your coffee, we have {} coffees left'.format(coffee))
        print('you have {} left in your pocket'.format(moneyihave)) 


    else:

        print('our coffee is 200 dollars')
        print('we have {} coffees left'.format(coffee))
        print('you have {} left in your pocket'.format(moneyihave))


   if coffee <= 0:      

      print('please come back, we do not have coffee anymore')
      break

   elif moneyihave <=0:
      print('no more money')
      break

А вот ваш вывод каждый раз, когда мы выполняем цикл:

insert your money: 200
here is your coffee, we have 19 coffees left
you have 39800 left in your pocket
insert your money: 200
here is your coffee, we have 18 coffees left
you have 39600 left in your pocket
insert your money: 200
here is your coffee, we have 17 coffees left
you have 39400 left in your pocket
insert your money: 200

И в концемы вырываемся из цикла:

you have 0 left in your pocket
no more money
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...