Использование операторов "и" и "или" с строками Python

Я не понимаю смысл строки:

parameter and (" " + parameter) or ""

где параметр - строка

Зачем нужно использовать and or оператор, в общем, с строками python?

Ответ 1

Предположим, что вы используете значение parameter, но если значение имеет значение " None, вы предпочитаете иметь пустую строку "" вместо " None. Что бы вы сделали в целом?

if parameter:
    # use parameter (well your expression using '" " + parameter' in this case
else:
    # use ""

Это то, что делает это выражение. Во- первых, вы должны понять, что and и or оператор делает:

  • a and b возвращает b если a True, else возвращает a.
  • a or b возвращает a если a True, else возвращает b.

Итак, ваше выражение:

parameter and (" " + parameter) or ""

что фактически эквивалентно:

(parameter and (" " + parameter)) or  ""
#    A1               A2               B
#           A                     or   B

Как выражение оценивается, если:

  • parameter - A1 оценивается как True:

    result = (True and " " + parameter) or ""
    
    result = (" " + parameter) or ""
    
    result = " " + parameter
    
  • parameter - A1 None:

    result = (None and " " + parameter) or ""
    
    result = None or ""
    
    result = ""
    

Как общее предложение, лучше и читабельнее использовать выражение A if C else B для условного выражения. Итак, вам лучше использовать:

" " + parameter if parameter else ""

вместо данного выражения. См. PEP 308 - Условное выражение для мотивации выражения if-else.

Ответ 2

Python рассматривает пустые строки как имеющие логическое значение "false" и непустые строки как имеющие логическое значение "true".

Таким образом, есть только два возможных результата выражения, то есть для пустой строки и для непустой строки.

Второе, что нужно заметить, это то, какое значение возвращает оператор "или" и "и". Python не возвращает только true или false значение, для строк и/или оператора он возвращает одну из строк (учитывая, что они имеют значение true или false). Python использует ленивый подход:

Для оператора "и", если левое значение истинно, правильное значение проверяется и возвращается. если левое значение ложно, то оно возвращается

Для оператора "или", если первое значение истинно, оно возвращается. в противном случае, если второе значение ложно, возвращается второе значение

parameter = 'test'
print( parameter and (" " + parameter) or "" )

ouput: test

parameter = ''
print( parameter and (" " + parameter) or "" )

output: (пустая строка)

Ответ 3

Пустая строка в Python эквивалентна логическому значению False, так же, как пустой список. Строка, которую вы представили, представляет собой версию Python тройного оператора (как отмечено в комментарии ниже, в настоящее время устаревшая конструкция, так как у Python теперь есть реальный тернарный оператор). Он основан на трех правилах:

  • для a and b если a является False тогда b не будет оценен
  • для a or b если a True тогда b не будет оценен
  • значение логического предложения - это значение его последнего оцениваемого выражения

Если значение parameter равно True вторая часть предложения and будет оцениваться: (" " + parameter). Поэтому он добавит ведущее пространство к parameter если это не пустая строка. Вторая часть предложения or не будет оцениваться, поскольку вы уже можете сказать, что все выражение True (True или что-то всегда True).

Если parameter является значением False (пустая строка в данном контексте) вторая часть and положение не будет оценено, как вы уже можете сказать, что это является False (False и все всегда False). Поэтому вторая часть предложения or оценивается, возвращая пустую строку.

Вы можете написать это более подробно:

if parameter:
    return " " + parameter
else:
    return ""

Ответ 4

Он проверяет, имеет ли parameter значение. Если это делает, это добавляет пробел. Если нет, он возвращает пустую строку.

$ python
Python 2.7.2 (default, Oct 11 2012, 20:14:37) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> foo = 'bar'
>>> foo and (" " + foo) or ""
' bar'

Ответ 5

Рассмотрим этот TTL. Затем он просто подключается к различным сценариям, чтобы увидеть, что происходит :)

Обратите внимание, что and or оцените первое значение, которое сделало их "успешными" или "неудачными" - и это не обязательно должно быть True или False!

a    b    a or b   a and b
--   --   ------   ------- 
T    T    a (T)    b (T)
T    F    a (T)    b (F)
F    T    b (T)    a (F)
F    F    b (F)    a (F)

T и F представляют значения "Truth-y" и "False-y". Это выражение-цепочка работает, потому что операторы не должны возвращать True или False - это будет либо значение a либо b.

Ответ 6

Со всеми хорошими ответами я обнаружил, что эти заявления помогают мне помнить об этом лучше и подходят, как работает мой мозг (и, надеюсь, для него еще немного):

  • "и" возвращает первый элемент False (например, None, "", [],(), {}, 0) или последний элемент, если нет (например, False не найден)

  • "или" возвращает первый True элемент или последний элемент (например, True не найдено)

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

Обратите внимание, что это правило также применяется к прикованным всем "и" или "всем" или "операторам"