#python
#python
Вопрос:
Кажется, я не могу изменить fprice, чтобы он не совпадал с вводом и не был * с НДС
while True:
VAT=1
shoep = int(input("what is the price of the shoe (in euros)"))
country = input("what country are you buying the shoe from ")
if country == "Germany":
VAT=int(1.19)
elif country =="France":
VAT=int(1.20)
elif country == "Spain":
VAT=int(1.21)
elif country == "Italy":
VAT=int(1.22)
elif country == "Portugal":
VAT=int(1.23)
elif country != "Germany" or "Portugal" or "Italy" or "Spain"or "France" :
print("invalid input please try again")
fprice=shoep*VAT
fprice=float(fprice)
float(shoep)
float(VAT)
print("the price of the shoe is €",fprice)
Комментарии:
1. Ну, каковы ваши входные данные?
2. Почему вы разыгрываете чаны
int
? Таким образом, вы теряете десятичную точность.int(1.2) --> 1
, ноint(1.99999) --> 1
также. Вы всегда будете умножать на единицу.3.
elif country != "Germany" or "Portugal" or "Italy" or "Spain"or "France"
это не значит, что вы думаете, что это значит. Это условие всегда равно False. Это не означает `страна elif! = «Германия» или страна! = «Португалия» …» и т. Д.4. @JohnColeman — Последнее условие всегда выполняется . Так что он вроде как делает то, что должен, по чистой случайности.
5. @Michaelsczesny Вы правы. Сначала я забыл приоритет.
Ответ №1:
Это:
VAT=int(1.19)
Приведет к тому, что значение VAT
будет 1
равно, поскольку 1
это значение floor . Когда вы приведете его к int
нему, он примет все, что вы ему дадите.
>>> int(1.9)
1
>>> int(1.12)
1
>>> int(2.1)
2
Один раз что-либо, по свойству identity, будет этим. Таким 12
образом, ввод приведет к 12
выводу.
Я думаю, вы хотите:
VAT=1.19
У вас также есть какая-то странная логика, связанная с попытками обрабатывать любые страны, которых нет в вашем списке. На первый взгляд, вы можете просто использовать else
. Однако вы больше не запрашиваете ввод страны и поэтому выводите недопустимое значение (умноженное на 1, значение НДС по умолчанию, результат). Подобная структура, скорее всего, послужит вам лучше:
from typing import Dict, Optional
taxes = {
"Germany": 1.19,
"France": 1.20,
"Spain": 1.21,
"Italy": 1.22,
"Portugal": 1.23,
}
def get_vat(taxes: Dict[str, float], msg: Optional[str] = None) -> float:
if msg is not None:
print(msg)
country = input("What country are you buying the shoe from?")
# Use the `get` functions ability to define a default to ask until the users get it right.
return taxes.get(country, get_vat(taxes, "You've selected an invalid country. Try again!")
while True:
shoe_price = float(input("what is the price of the shoe (in euros)") # You could use an int, but you're dropping info.
vat = get_vat(taxes)
fprice: float = shoe_price * vat # This will naturally be a float, no need to cast.
print("the price of the shoe is €",fprice)
Ответ №2:
похоже, не удается изменить fprice, чтобы он не совпадал с вводом
int(1.<<anything>>)
всегда 1
, поэтому вы умножаете свой ввод на 1 и получаете то же значение
Решение: удалите int()
использование функции.
Вы также должны использовать import decimal
и использовать это, поскольку оно больше подходит для точности валюты
Не связано, условие «недопустимый ввод» неверно. Если вы хотите проверить несколько значений, используйте in
elif country not in ["Germany", "Portugal", "Italy", "Spain", "France"]:
print("invalid input please try again")
Ответ №3:
Несколько вещей, на которые следует обратить внимание:
во-первых, VAT = int(1.22)
это преобразует значение 1.22
в целое 1
число. Поэтому, независимо от страны, НДС всегда будет равен 1. Вы можете просто сказать VAT = 1.22
(например)
Во-вторых, условие
elif country != "Germany" or "Portugal" or "Italy" or "Spain" or "France"
не делает то, что вы думаете.
elif country != "Germany" or country != "Portugal" or country != "Italy" or ...
это правильный метод.
Другой способ:
elif country not in ["Germany", "Portugal", "Italy", ...]:
print("invalid input please try agaim")
Ответ №4:
Значение не меняется с 12, потому что, когда вы вводите число с плавающей запятой int
, оно преобразует его в целое число, т. Е. int(1.19)
Равно 1
.
Кроме того, оператор elif country != "Germany" or "Portugal" or "Italy" or "Spain"or "France":
выдаст вам ошибку во время выполнения, и вместо этого простой else
оператор выполнит эту работу.
Более того, операторы float(shoep)
and float(VAT)
, похоже, ничего не делают и могут быть полностью удалены.
Поэтому я бы переписал код следующим образом, чтобы он работал.
while True:
VAT=1
shoep = int(input("what is the price of the shoe (in euros)"))
country = input("what country are you buying the shoe from ")
if country == "Germany":
VAT = 1.19
elif country =="France":
VAT = 1.20
elif country == "Spain":
VAT = 1.21
elif country == "Italy":
VAT = 1.22
elif country == "Portugal":
VAT = 1.23
else:
print("invalid input please try again")
fprice=float(shoep*VAT)
print("the price of the shoe is €",fprice)
Ответ №5:
Учитывая, чего вы хотите достичь, использование словаря для сопоставления страны со ставкой НДС делает код более компактным и читаемым:
import decimal as d
try_again = True
VAT_by_country = {"Germany": d.Decimal('1.19'), "France": d.Decimal('1.2'), "Spain": d.Decimal('1.21'),
"Italy": d.Decimal('1.22'), "Portugal": d.Decimal('1.22')}
while try_again:
shoep = int(input("what is the price of the shoe (in euros)"))
country = input("what country are you buying the shoe from ")
VAT = VAT_by_country.get(country, 1)
if VAT > 1:
try_again = False
fprice=float(shoep*VAT)
print("the price of the shoe is €",fprice)
else:
print("invalid input please try again")