Синтаксис Python "if X == Y and Z" - PullRequest
       12

Синтаксис Python "if X == Y and Z"

13 голосов
/ 02 сентября 2010

Означает ли это:

if key == "name" and item:

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

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

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

Ответы [ 7 ]

33 голосов
/ 02 сентября 2010

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

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

10 голосов
/ 02 сентября 2010

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

Псевдокод

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

должен быть таким:

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

Интересная идиома, чтобы сделать это:

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

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

4 голосов
/ 02 сентября 2010

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

  1. x == y
  2. z

Проверьте в документации по Python список того, что считается ложным в Python

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

if 3 < x < 6

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

if x > 3 and x < 6

) * * тысяча двадцать-один

3 голосов
/ 02 сентября 2010

Если, гипотетически, вы хотите

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

, вы можете сделать это

if key == "name" == item:
1 голос
/ 02 сентября 2010

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

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

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

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

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

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

name = raw_input("Enter your name: ")
name = name if name else "dude"
print "Hello, %s!" % name
0 голосов
/ 03 сентября 2010

@ 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.

0 голосов
/ 02 сентября 2010

Если вы посмотрите на код, например, 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!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...