Значение не меняется с 12

#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")