Я не понимаю смысл строки:
parameter and (" " + parameter) or ""
где параметр - строка
Зачем нужно использовать and
or
оператор, в общем, с строками python?
Я не понимаю смысл строки:
parameter and (" " + parameter) or ""
где параметр - строка
Зачем нужно использовать and
or
оператор, в общем, с строками python?
Предположим, что вы используете значение 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
.
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: (пустая строка)
Пустая строка в 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 ""
Он проверяет, имеет ли 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'
Рассмотрим этот 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
.
Со всеми хорошими ответами я обнаружил, что эти заявления помогают мне помнить об этом лучше и подходят, как работает мой мозг (и, надеюсь, для него еще немного):
"и" возвращает первый элемент False (например, None, "", [],(), {}, 0) или последний элемент, если нет (например, False не найден)
"или" возвращает первый True элемент или последний элемент (например, True не найдено)
В итоге все они возвращают первый элемент, который решает исход заявления. (В худшем случае последний элемент в последовательности)
Обратите внимание, что это правило также применяется к прикованным всем "и" или "всем" или "операторам"