2014-10-27 4 views
-3
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?Присвоение значения переменной на основе логического выбора

+2

Прочтите pep8 [http://legacy.python.org/dev/peps/pep-0008/] и некоторые основы для инструкции 'if' [https://docs.python.org/2/tutorial/controlflow .html # if-statements] – sepulchered

ответ

2

Это:

if vacationCheck=='n' is True: 

должно быть просто:

if vacationCheck=='n': 

И статья else не нуждается условие вообще:

else: 
2
if vacationCheck == 'n' is True 

вероятно - False . (Попробуйте print 'n'=='n' is True), изменить его на:

if vacationCheck == 'n': 

Кроме того, вам не нужны eleif.

Это происходит потому, что это эквивалентно:

if vacationCheck == ('n' is True) 

правая сторона Flase и vacationCheck является y или n, но никогда не False.

+0

'is' проверяет идентификатор объектов по id, поэтому 'n' не является True, если только (возможно, в python2) вы не делали' True = 'n'' перед сравнением. – sepulchered

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") 
+0

Это зависит от того, какую версию Python использует OP. Python 3 переименовал функцию Python 2 'raw_input' в' input', а функция ввода 'Python 2', которая делает eval на входе (к счастью), не существует в Python 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 
>>> 

Во-вторых, не проверяют значения против Правда или Ложно конкретно. Все значения имеют истинность, как указано в разделе Boolean operations, поэтому что-то вроде is True без лишних ограничений ограничивает одно конкретное истинное значение среди бесконечного множества, помимо того, что вы рискуете такими проблемами, как тот, с которым вы столкнулись.

+0

'vacationcheck == 'n' is True' может быть оценен до True, если вы ранее переопределили True как n (например, это 'True = 'n''), это разрешено в python 2.x, но поднять' SyntaxError' в python 3.x – sepulchered

Смежные вопросы