Печать, если разные переменные имеют значение True или False Python 3.3

У меня возникли проблемы с печатью сообщения после проверки того, являются ли переменные истинными или ложными. Что я хочу сделать, так это напечатать переменные, которые являются истинными из выбора переменных. Должен быть более простой способ сделать это, чем ниже, но это все, что я могу придумать. Мне нужно лучшее решение или модификация ниже, чтобы заставить его работать.

Вот мой код:

if (quirk) and not (minor, creator, nature):
    print (quirk, item)
elif (minor) and not (quirk, creator, nature):
    print (minor, item)
elif (creator) and not (minor, quirk, nature):
    print (creator, item)
elif (nature) and not (minor, quirk, creator):
    print (item, nature)
else:
    print ("Something went wrong! Properties out of range! Nature =",nature,"Quirk =",quirk,"Minor =",minor,"Creator =",creator)

В этом случае я всегда получаю ошибку и никогда не печатаю. Ошибка всегда показывает, что одна из переменных верна.

Заранее спасибо!


person Simkill    schedule 28.04.2013    source источник


Ответы (3)


Вы проверяете, является ли непустой кортеж ложным, что никогда не бывает правдой. Вместо этого используйте any.

if quirk and not any([minor, creator, nature]):
    print (quirk, item)
# and so on

any([minor, creator, nature]) возвращает True, если какой-либо из элементов в коллекции равен True, False в противном случае.

person Volatility    schedule 28.04.2013
comment
Это полностью сработало! Я приму ответ, когда система позволит мне. Спасибо! Я думаю, мне нужно прочитать о «любом». - person Simkill; 28.04.2013
comment
@Simkill, пока вы этим занимаетесь, вы также можете прочитать all , которая является тесно связанной функцией. - person Volatility; 28.04.2013

(minor, creator, nature)

является кортежем. И он всегда оценивается как True в логическом контексте, независимо от значений minor, creator и nature.

Это то, что должна содержать документация по проверке истинности. сказать:

Любой объект может быть проверен на истинность, для использования в условиях if или while или в качестве операнда логических операций, описанных ниже. Следующие значения считаются ложными:

  • Никто
  • ЛОЖЬ
  • ноль любого числового типа, например, 0, 0.0, 0j.
  • любая пустая последовательность, например, '', (), [].
  • любое пустое отображение, например, {}.
  • экземпляры пользовательских классов, если класс определяет метод bool() или len(), когда этот метод возвращает целое число ноль или логическое значение False.

Все остальные значения считаются истинными, поэтому объекты многих типов всегда истинны.

Ваша непустая последовательность попадает в категорию "Все остальные значения" и поэтому считается истинной.


Чтобы выразить свое состояние с помощью простой логики Python, вам нужно написать:

if quirk and not minor and not creator and not nature:

Как указывает @Volatility, служебную функцию any() можно использовать для упрощения вашего кода и сделать его более понятным.

person David Heffernan    schedule 28.04.2013

any здесь кажется излишним:

if quirk and not (minor or creator or nature):
    print (quirk, item)
elif minor and not (quirk or creator or nature):
    print (minor, item)
elif creator and not (minor or quirk or nature):
    print (creator, item)
elif nature and not (minor or quirk or creator):
    print (item, nature)
else:
    print ("Something went wrong! Properties out of range! Nature =",nature,"Quirk =",quirk,"Minor =",minor,"Creator =",creator)
person Eric    schedule 28.04.2013