我正在为我的课程编写一个程序,该程序是输入要在线购买的商品,然后输入价格。我创建了一个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()
答案 0 :(得分:1)
仅在 all 中的循环代码运行后才检查循环条件。而且由于它在那里减少了五倍,所以很有可能从2降到-3,而且它们都不等于0,所以它继续。
同样,您那里的相同代码大约是其五倍。为什么?只需确保它在那里一次即可。
后卫应该是while totalItems > 0:
,仅需进行一些防御性编程即可确保即使错误导致变量降至0以下,循环也能结束。
最后,没有变量'cost1','cost2','cost3'等,尤其是如果您事先不知道需要多少变量时,就不要这样。那就是列表的目的。
答案 1 :(得分:0)
您正在循环中多次减小变量。
答案 2 :(得分:0)
循环将遍历整个主体,并且将在执行整个主体后第二次检查条件:
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
答案 3 :(得分:0)
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开始计数。最终结果看起来有点令人困惑,但最终我们也跟踪添加了多少重复项。
答案 4 :(得分:0)
for-loop
:while-loop
对于连续操作更好。for-loop
更好地循环遍历range
或list
的值。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'}}