根据布尔选择为变量赋值

时间:2014-10-27 08:34:50

标签: python

vacationDeduction=200
vacationCheck=input('Has your employee taken 3 or more days of vacation this month? y/n: ')
    if vacationCheck=='n' is True:
        vacationDeduction=0
    elif vacationCheck=='y' is True:
        vacationDeduction=200

在这段代码中,我尝试让程序为变量赋值0或200,以便稍后可以从代码中的某个计算中减去它。不幸的是,该程序拒绝接受n值,因此始终将vacationDeduction视为200,从而破坏了计算。如何才能使程序接受n,并将正确的变量分配给vacationDeduction

4 个答案:

答案 0 :(得分:2)

此:

if vacationCheck=='n' is True:

应该简单:

if vacationCheck=='n':

else子句根本不需要条件:

else:

答案 1 :(得分:2)

if vacationCheck == 'n' is True

可能评估为False 1 。 (尝试print 'n'=='n' is True),将其更改为:

if vacationCheck == 'n':

此外,您不需要eleif

1 这种情况正在发生,因为它相当于:

if vacationCheck == ('n' is True)

右侧为FlasevacationCheckyn,但从不False

答案 2 :(得分:2)

首先,它不是input。您应该使用raw_input来捕获用户输入。

您可以通过以下方式检查结果来使检查更加健壮:

if vacationCheck.lower() in ['y', 'yes', 't', 'true']:
   vacationDeduction = 0
elif vacationCheck.lower() in ['n', 'no', 'f', 'false']:
   vacationDeduction = 200
else:
   raise Exception("Invalid input")

答案 3 :(得分:0)

之前的几个答案指出is True不属于那里,但不是为什么。在许多语言中,您会向operator precedence查找此信息,但在这种情况下,您实际上(无意中)使用chained comparisons - 允许对bottom<=value<top形式进行范围测试的功能。因此,您的条件要求vacationcheck=='n''n' is True,后者不能(因为is检查完全相同的对象,而不是等价,并且它们仅相当于布尔值) 。因此,你输入的内容并不重要。您在第二种情况下获得行为的唯一原因是您在测试之前已经复制了它。

raw_input和input之间的区别是Python 2的行为,但是如果输入曾经为你工作过,那么你很可能已经在使用Python 3了,你不需要太担心。

我建议采用两种简单的补救措施:首先,当不确定动态变量的影响时,请使用print repr(vacationCheck)进行打印。这将为您提供可以在解释器中输入的表单,因此您可以验证它是否实际上是您正在测试的值,然后自行验证测试:

>>> vacationCheck=raw_input()
n
>>> print repr(vacationCheck)
'n'
>>> vacationCheck=='n' is True
False
>>> vacationCheck=='n'
True
>>> 'n' is True
False
>>>

其次,请勿特别针对True或False检查值。所有值都具有真实性,如Boolean operations中所列,因此像is True这样的东西会不必要地限制你在无限集中的一个特定真值,除了冒险遇到像你在这里遇到的那样的问题。