Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 确保输入仅限于变量_Python_Variables_Input_Python 3.x - Fatal编程技术网

Python 确保输入仅限于变量

Python 确保输入仅限于变量,python,variables,input,python-3.x,Python,Variables,Input,Python 3.x,我想确保只有在顶部的4个变量中指定的值被接受,而其他所有用户输入都被拒绝,我该怎么做?基本上,我希望代码接受Currency1、Currency2、Currency3和Currency4下的所有内容。我的代码的问题是,诸如“否”、“wdgdu”之类的所有内容都被接受。如何将输入限制为4个变量下的值 if currency in CurrencyYen + CurrencyEuro + CurrencyDollar + CurrencyPound: # do stuff 变量名使用小写字

我想确保只有在顶部的4个变量中指定的值被接受,而其他所有用户输入都被拒绝,我该怎么做?基本上,我希望代码接受Currency1、Currency2、Currency3和Currency4下的所有内容。我的代码的问题是,诸如“否”、“wdgdu”之类的所有内容都被接受。如何将输入限制为4个变量下的值

if currency in CurrencyYen + CurrencyEuro + CurrencyDollar + CurrencyPound:
    # do stuff
变量名使用小写字母


此外,您只需检查
currency.lower()
,然后您只需要列表中每种货币的小写版本。

您可以使用For检查用户输入:

CurrencyYen = ['Yen', 'yen', 'YEN']
CurrencyEuro = ['Euro','euro','EURO']
CurrencyDollar = ['Dollar','dollar','DOLLAR','$']
CurrencyPound = ['Pound', 'pound', 'POUND','£']

UserInput = raw_input("Value: ")

for i in range(0,2):
    if (UserInput == CurrencyEuro[i]):
        print "correct input!"
        break
    else:
        print "wrong input"
所有其他列表的代码都相同。

我将使用:

  • 用于验证和规范货币的字典,而不是临时列表
  • 从用户处获取有效输入的循环,而不是递归
  • 规范化大小写的
    .lower()
    方法
我的重构版本:

CURRENCY = {
    '¥': 'JPY', 'yen': 'JPY', 'jpy': 'JPY',
    '€': 'EUR', 'euro': 'EUR', 'eur': 'EUR',
    '$': 'USD', 'dollar': 'USD', 'usd': 'USD',
    '£': 'GBP', 'pound': 'GBP', 'gbp': 'GBP',
}

def read_currency(prompt):
    """Prompt the user to enter a currency.

    Returns a currency code.
    """
    while True:
        x = input(prompt)
        try:
            return CURRENCY[x.lower()]
        except KeyError:
            print('Unknown currency: {!r}'.format(x))
然后,您可以根据自己的喜好计算转换率:

from decimal import Decimal
RATES = { 
    'JPY': Decimal("0.010589"),
    'EUR': Decimal("1.2983"),
    'GBP': Decimal("1.5228"),
    'USD': Decimal("1.0000"),
}
def conversion_rate(cur1, cur2):
    """Get the conversion rate from currency 1 to currency 2."""
    return RATES[cur1] / RATES[cur2]
下面是转换代码:

amount = Decimal(input('Enter amount: '))
currency1 = read_currency('Enter source currency: ')
currency2 = read_currency('Enter target currency: ')
rate = conversion_rate(currency1, currency2)
print('{} {} is equal to {} {}'
      .format(currency1, amount, currency2, amount * rate))
请注意,您可能希望应用更好的舍入规则

运行示例:

Enter amount: 1450 Enter source currency: yen Enter target currency: $ JPY 1450 is equal to USD 15.3700 输入金额:1450 输入来源货币:日元 输入目标货币:$ 1450日元等于15.3700美元 如果对输入使用lower(),则不需要同时保留“Dollar”和“Dollar”。此外,您还可以使用一段除非输入正确的输入否则永远不存在的时间。您还可以使用quit命令中断while

accepted_input = ['yen', 'euro', 'dollar', 'pound', '$']

def get_currency(msg):
    input_valid = False
    while not input_valid:
        user_input = input(msg).lower()
        input_valid = user_input in accepted_input
    return user_input

currency_from = get_currency('Convert from: ')
currency_to = get_currency('Convert to: ')

可能只是有['yen']、['euro']、['dollar'、'$']等等,然后使用msg.lower()但是如果我让其他人测试这个,它会给出错误。我想尝试让它尽可能对用户友好:)
msg.lower()
将使输入完全小写,例如它将把输入
'DoLlAR'
变成
'DoLlAR'
。我的版本更加用户友好。;)试试张贴的答案!他们做的正是你想要的。我试过了。但我似乎无法检查输入值是否在变量中,并且它不是浮点值。我将更改名称。:)但是如果我在这里使用if语句,我将无法测试这两种货币?我需要代码来拒绝诸如“yes”或“sjkdh”之类的字符串。我是说。。我需要分别检查“Currency1”和“Currency2”。如果Currency1不在前4个变量中,那么代码应该给出一个错误?^是的,我意识到了。我希望按规定限制输入:/在CurrencyEuro中为i使用
,这是在重新实现python中已有的功能
如果用户输入的是CurrencyEuro
是免费的。谢谢@LStyle,代码是有效的,但我必须同时提供这两种输入。如果Currency1不存在,我希望它中断。@jhoyla,是的,我已经试过了:)但是再次,我想在请求currency2之前中断。你的意思是如果列表中的第一个值不是用户输入,它将停止检查列表中的其他值吗?嘿,谢谢,但问题是,我以后需要在代码中使用整个列表。如果我使用您的代码^^^会有很多错误,除了您可能需要重构代码以使其工作(因为这是一种非常整洁的方法)之外,您可以使用CURRENCY.keys()来获取原始列表。@jhoyla:您需要
列表(CURRENCY.keys())
,因为这是Python 3,但这是对的。如果Currency1是CurrencyYen,Currency2是CurrencyEuro:Result=float(Amount*ExRate)print(round(Amount,2),str('Yen'),str('is equal'),“%.2f”%Result,str('euro'),str('根据当前汇率)),这是我代码的下一位,所以如果我使用上面的方法,这将停止工作,并且编码将是错误的mess@Jemini:如果CurrencyYen中的currency1
,您只需执行
如果currency1=='JPY'