我正在尝试编写一个创建商品清单的程序 确定每件商品的数量,计算购物清单上所有商品的小计,计算总金额,包括7%的销售税 并打印小计和总费用,但我的计划是将总价格乘以总数而不是乘以项目。
这是我的代码
item_num = int(input("Please enter the number of items on your grocery list.\n"))
item_list = [str(input("What is the item #" + str(count + 1) + " on your list?\n")) for count in range(item_num)]
item_price = sum(int(input("Enter the price of the item \n")) for i in range(item_num))
item_quan = sum(int(input("What is the quantity of item #" + str(count + 1) + " that you bought?\n")) for count in range(item_num))
subtotal = sum(int(item_price * item_quan)for i in range(item_num))
print ("The subtotal is...")
print (subtotal)
tax = 0.07 * item_quan
total = subtotal + tax
print ("The grand total is...")
print (total)
这是我运行后的结果。
Please enter the number of items on your grocery list.
2
What is the item #1 on your list?
Bike
What is the item #2 on your list?
Gloves
Enter the price of the item
100
Enter the price of the item
15
What is the quantity of item #1 that you bought?
2
What is the quantity of item #2 that you bought?
1
The subtotal is...
345
The grand total is...
345.21
感谢您的帮助
答案 0 :(得分:0)
原因很简单:您未在item_price
或item_quan
计算单个商品的价格或数量,而是计算其总和
具体来说,在
中item_price = sum(int(input("Enter the price of the item \n")) for i in range(item_num))
和
item_quan = sum(int(input("What is the quantity of item #" + str(count + 1) + " that you bought?\n")) for count in range(item_num))
您首先创建了一个生成器表达式(手动波浪,您已经创建了一个列表),将每个输入转换为int
,然后在sum
上调用sum
总清单。 sum
获取一个列表并返回一个数字。但是你不想要单个数字(这是列表中所有项目的总和) - 你只需要为每个项目提供一系列相应的价格和数量。
只需删除subtotal
电话即可。这完全没必要。它唯一应该放在int
。
更一般地说,这个代码示例并不是非常干净,因此可能是混乱的原因。我强烈建议在Code Review寻求帮助以改进它。例如,您在任何地方都有多个重复ints
次呼叫,这些呼叫完全无关 - 两个ints
的产品也是int
,因此无需将其转换为map
。
然而,具体而言,我想推荐一些比您考虑的方法更接近的方法。这是通过使用lambda
和map
函数。
lambda
正如它听起来的那样:它创建一个新数组,其元素通过将函数应用于旧数组中的每个元素来计算。
item_price = map(lambda item: int(input("Enter the price for this item: {0}".format(item)), item_list]
可以让你在现场创建一个函数(更准确地说,它创建了一个匿名函数,但是不要让你陷入困境)。
item_quan
类似的方法将为-(BOOL) textFieldShouldReturn:(UITextField *)textField{
[textfield resignFirstResponder];
[self.view endEditing:YES];
return YES;
}
-(IBAction)submitRequest {
[textfield resignFirstResponder];
[self.view endEditing:YES];
// make API call, if call succeeds run this block {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"..."
message:@"..."
delegate:delegate
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
dispatch_async(dispatch_get_main_queue(), ^{
[alert show];
});
// }
}
// delegate after alert OK is pressed
- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
[self.navigationController popViewControllerAnimated:YES];
}
创造奇迹。请注意阅读更容易,以及您不需要依赖范围等原始结构。从地图的角度思考也会更加明显地发生了什么。
同样,请考虑使用Code Review。它是一个很好的工具,它将教你如何编写简洁明了的代码,而不仅仅是有用的东西。 :)
答案 1 :(得分:-1)
这是固定版本:
item_num = int(input("Please enter the number of items on your grocery list.\n"))
item_list = [str(input("What is the item #" + str(count + 1) + " on your list?\n")) for count in range(item_num)]
item_price = [int(input("Enter the price of the item \n")) for i in range(item_num)]
item_quan = [int(input("What is the quantity of item #" + str(count + 1) + " that you bought?\n")) for count in range(item_num)]
subtotal = sum(int(quan * price) for quan, price in zip(item_quan, item_price))
print ("The subtotal is...")
print (subtotal)
tax = 0.07 * subtotal
total = subtotal + tax
print ("The grand total is...")
print (total)
您需要创建2个列表,而不是汇总item_price
和item_quan
,而这些列表将包含每个项目的适当价格和数量。
我相信解决方案可以变得更漂亮,但我希望改变最少的代码而不是重写你的代码。