Python ", если X == Y и Z"

Это:

if key == "name" and item:

означает то же самое, что и:

if key == "name" and if key == "item":

Если это так, я полностью смущен пример 5.14 в Dive Into Python. Как ключ может быть равен как "имени", так и пункту? С другой стороны, "и элемент" просто спрашивают, существует ли элемент как переменная?

Ответ 1

if key == "name" and item: означает if (key == "name") and (item evaluates to True).

Имейте в виду, что (item evaluates to True) возможно несколькими способами. Например, if (key == "name") and [] будет оцениваться до False.

Ответ 2

Маной объяснил это хорошо. Вот некоторые дополнительные примечания.

Псевдокод

if key == "name" or if key == "item":

должен быть следующим образом:

if key == "name" or key == "item":

Интересная идиома для этого:

if key in ("name", "item"):

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

Ответ 3

Нет, вам нужно повторить выражение. Он оценивается как два отдельных условия и проверяет, являются ли оба значения истинными -

  • x == y
  • z

Отметьте Документацию Python для списка того, что считается False в Python

(Однако интересно отметить, что в отличие от других языков:

if 3 < x < 6

эквивалентно

if x > 3 and x < 6

)

Ответ 4

Если, предположительно, вы захотели

if key == "name" and if key == item:

вы могли бы сделать это

if key == "name" == item:

Ответ 5

Другие объяснили, как оценивается выражение, о котором вы спрашиваете. Важно знать, что если первый операнд оператора "и" оценивает значение "ложь", второй никогда не оценивается, потому что результат "и" всегда является ложным, если один операнд является ложным, и если вы знаете первый операнд ложный, тогда все "и" ложно, и вам не нужно оценивать второе. Это называется "короткое замыкание" и применяется к "или", а также к "и" (за исключением того, что "или" всегда истинно, когда оба операнда истинны, поэтому второй операнд оценивается только тогда, когда первый является ложным).

Другая вещь, которую вам нужно знать, это то, что результатом всей операции "и" является значение последнего оцененного операнда. Поскольку вещи, отличные от литеральных констант True и False, считаются логически истинными или ложными, этот факт (в сочетании с коротким замыканием) можно использовать в качестве замены для операторов "if" в некоторых ситуациях, и вы будете иногда видеть, что он используется таким образом,

Например, "x или y" оценивается как x, если x истинно, но для y, если x является ложным. Иногда это используется для предоставления значений по умолчанию для отсутствующих значений:

name = raw_input("Enter your name: ") or "dude"
print "Hello, %s!" % name

Если вы не вводите ничего в приглашении, просто нажмите Enter, возвращаемое значение raw_input - это пустая строка, "", которая считается ложной. Поскольку левая ветвь "или" неверна, она не закорачивается, а правая ветвь оценивается, поэтому результат "или" является "чуваком". Если вы введете значение в приглашении, правая ветвь никогда не будет оценена из-за короткого замыкания, и поэтому значение "или" будет тем, что вы ввели.

Многие люди считают, что злоупотребление булевыми операторами так плохо, что Python имеет "x, если y else z", но это конкретное использование делает меня достаточно читаемым. (Но это только об одном!) "Значение - это, или если оно пусто". Сравните это со следующим:

name = raw_input("Enter your name: ")
name = name if name else "dude"
print "Hello, %s!" % name

Ответ 6

Если вы посмотрите на код, например, 5.14:

def __setitem__(self, key, item):         
    if key == "name" and item:            
        self.__parse(item)                
    FileInfo.__setitem__(self, key, item)

item - это переменная, похожая на ключ.

Он может использоваться в операторе if, если он вычисляет либо true, либо false.

например.

happy = True
name = "Peter"
if name == "Peter" and happy:
    print name + " is happy!"

Ответ 7

@Victor Neo: вам также не нужно отдельное логическое:

for happy in (False, "Peter", '', "Susan" , []):
    print(happy + ' is happy.' if happy else 'Everybody is bored.')

Если оператор предпочитает использование or и and с небулевыми значениями, которые эмулируют эффект до того, как value if condition else value стал доступен в Python.