почему не прерывается цикл при 0 отсчете, когда я устанавливаю переменную! = 0 - PullRequest
0 голосов
/ 19 сентября 2019

Я пишу программу для своего класса, программа для ввода товара, который вы хотите купить онлайн, затем цена.Я создал цикл while, который должен прерываться, как только общее количество покупаемых пользователем предметов становится равным нулю, так что я могу взять все желаемые предметы.По какой-то причине, хотя, когда переменная totalItems достигает нуля (и я знаю, что это потому, что я печатаю его каждую строку), цикл не прерывается, фактически он продолжает идти в негативы.

def main():
    totalItems = int(input('How many items are you buying? '))
    while totalItems != 0:
        item1 = input('What is the first item? ')
        cost1 = input('What is the price of the first item? ')
        totalItems = totalItems - 1
        print(totalItems)
        item2 = input('What is the second item? ')
        cost2 = input('What is the price of the second item? ')
        totalItems = totalItems - 1
        print(totalItems)
        item3 = input('What is the third item? ')
        cost3 = input('What is the price of the third item? ')
        totalItems = totalItems - 1
        print(totalItems)
        item4 = input('What is the fourth item? ')
        cost4 = input('What is the price of the first item? ')
        totalItems = totalItems - 1
        print(totalItems)
        item5 = input('What is the first item? ')
        cost5 = input('What is the price of the first item? ')
        totalItems = totalItems - 1
    print('done')


main()

Ответы [ 5 ]

1 голос
/ 19 сентября 2019

Состояние цикла проверяется только после выполнения all кода внутри него.И поскольку там оно уменьшается в пять раз, есть хороший шанс, что оно будет, скажем, от 2 до -3, и оба они не равны 0, поэтому оно продолжается.

Кроме того, у вас в пять или более раз большетот же код там.Почему?Просто убедитесь, что он там один раз.

И охранник должен быть while totalItems > 0:, просто немного защитного программирования, чтобы убедиться, что цикл заканчивается, даже если ошибка приводит к тому, что переменная становится ниже 0.

Наконец, не используйте переменные 'cost1', 'cost2', 'cost3' и так далее, особенно если вы не знаете заранее, сколько вам понадобится.Вот для чего списки.

0 голосов
/ 19 сентября 2019

В этом случае я бы использовал for-loop:

  • A while-loop лучше для непрерывной работы, пока не произойдет заданное условие.
  • A for-loopлучше для циклического перебора значений range или list.
  • Нет необходимости жестко кодировать каждый элемент.Что, если есть 100 элементов?
  • while-loop в вашем коде не работает, потому что python является последовательным, а последовательность вашего кода начинается с item1 до item5.while != 0: оценивается повторно только после cost5.
    • Кроме того, если начальное значение totalItems равно <= 3, totalItems будет < 0 до переоценки условия while.В этом случае цикл будет продолжаться вечно.
  • Всегда повторное использование кода, если это возможно
  • product & cost теперь возвращено dictпо функции
def main():
    totalItems = int(input('How many items are you buying? '))
    item_dict = dict()
    for item in range(1, totalItems + 1):
        product = input(f'What is item {item}? ')
        cost = input(f'What is the price of item {item}? ')
        item_dict[f'item_{item}'] = {'product': product, 'cost': cost}
    print('done')
    return item_dict

items = main()

Вывод:

How many items are you buying?  4
What is item 1?  Book
What is the price of item 1?  7.50
What is item 2?  Car
What is the price of item 2?  15000
What is item 3?  Milk
What is the price of item 3?  6.99
What is item 4?  Coffee
What is the price of item 4?  4.99
done

Сохранено items:

print(items)

Вывод:

{'item_1': {'product': 'Book', 'cost': '7.50'},
 'item_2': {'product': 'Car', 'cost': '15000'},
 'item_3': {'product': 'Milk', 'cost': '6.99'},
 'item_4': {'product': 'Coffee', 'cost': '4.99'}}
0 голосов
/ 19 сентября 2019

Таблица правды Python: «любое ненулевое число - это истина».Это означает, что while totalItems: хорошо.

Цикл for может лучше подходить для того, что вам нужно.

for item_counter in range(total_items): # do stuff

Это остановится, как только вы перейдете от 0 к total_items.Это дает дополнительный бонус: вам не нужно все отслеживать.

Вы можете отформатировать строку, которую вы печатаете, для пользователя.

item = input('Item {}: '.format(item_counter))  # Item 1:
cost = input('How much did {} cost? '.format(item))  # How much did The Internet cost?

Если вы надеетесь что-то получитьумные для элементов «первый», «второй», «третий» и т. д., вам необходимо отобразить их, но, поскольку для этого потребуется бесконечное количество печатания, дать числовое представление обычно проще.101,102,103,104,105,106,107,108,109,110,111,112,113,220,330,440,550,660,770,880,990 И вы сделали это только для ста одного новояллионного (ish) элемента.


Чтобы расширить словари dict Вы также можете назначить элемент в словаре.

products = dict{}
for loop:
  item = ...
  if item not in products:
    cost = ...
    product[item] = cost

И что это будет делать, это сохранять элементы, имеющие сертифицированный органический продукт без добавления ГМО, без добавления сахара, без трансжирной диетической воды, поэтому, если пользователю нужно несколько копий элемента, ему нужно будет только добавитьстоить один раз.Более того, вы можете подсчитать, сколько раз элемент был добавлен.

...
      product[item] = [cost, 1]
    else:
      product[item][1] += 1

product [item] относится к значению, которое является списком [cost, count].Нам нужно изменить второй индекс, чтобы мы указали [1], потому что мы начинаем считать с 0. Конечный результат выглядит немного странно, но в конечном итоге мы также отслеживаем, сколько дублирующих элементов добавлено.

0 голосов
/ 19 сентября 2019

Цикл будет повторяться по всему телу, и условие будет проверено во второй раз после выполнения тела целом :

while thing:
    do_stuff()
    thing = 0
    hello()  # this is still executed, even though `thing == 0`
    what()  # and this too

Выглядит так, как вы хотитечтобы автоматически выйти из цикла, как только totalItems станет равным нулю в любом месте цикла , но циклы этого не делают, вам придется сделать это вручную:

while totalItems != 0:
    item1 = input("What's the first item?")  # mind the quotes here
    cost1 = input('What is the price of the first item? ')
    totalItems = totalItems - 1
    if totalItems == 0:
        break  # get out of the loop
    print(totalItems)

    item2 = input("What's the second item?")  # mind the quotes here
    cost2 = input("What is the price of the second item?")  # mind the quotes here
    totalItems = totalItems - 1
    if totalItems == 0:
        break  # get out of the loop
    print(totalItems)

    # and so on
0 голосов
/ 19 сентября 2019

Вы уменьшаете свою переменную в цикле несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...