Использование оператора" and "И" or " со строками Python
Я не понимаю смысл строки:
parameter and (" " + parameter) or ""
здесь параметр строка
почему нужно использовать and
и or
оператор, в общем, со строками python?
6 ответов
Предположим, вы используете значение parameter
, но если значение сказать None
, тогда вы хотели бы иметь пустую строку ""
вместо None
. Что бы вы сделали в целом?
if parameter:
# use parameter (well your expression using `" " + parameter` in this case
else:
# use ""
вот что делает это выражение. Сначала вы должны понять, что and
и or
оператор:
-
a and b
возвращаетb
если aTrue
, else returnsa
. -
a or b
возвращаетa
если aTrue
, else returnsb
.
Итак, ваше выражение:
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".
таким образом, есть только два возможных результата выражения, т. е. для пустой строки и для непустой строки.
второе, что нужно заметить, это то, какое значение оператора "or" и "and" возвращаются. Python не возвращает только значение true или false, для строк и/или оператора он возвращает одну из строк (учитывая, что они имеют значение true или false). Python использует ленивый подход:
для оператора" и " если левое значение равно true, то проверяется и возвращается правое значение. если значение left равно false, то возвращается
для оператора "или", если первое значение равно true, то возвращается. в противном случае, если второе значение равно false, возвращается второе значение
parameter = 'test'
print( parameter and (" " + parameter) or "" )
выход: тест
parameter = ''
print( parameter and (" " + parameter) or "" )
выход:(пустая строка)
пустая строка в Python эквивалентна False
логическое значение, так же, как пустой список. Строка, которую вы представили, - это версия тернарного оператора Python (как отмечено в комментарии ниже, в настоящее время устаревшая конструкция, как Python теперь имеет реальный троичный оператор). Он основан на трех правилах:
- на
a and b
Еслиa
isFalse
затемb
не будет оцениваться - на
a or b
еслиa
isTrue
затем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
оцените первое значение, которое сделало их "успешными"или " неудачными" - и это не обязательно должно быть правдой или ложью!
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 представляют значения" истина-y "и" ложь-y". Это выражение-цепочка работает потому что операторам не нужно возвращать True или False - это будет либо значение a
или b
.
со всеми хорошими ответами я нашел, что эти утверждения помогают мне лучше запомнить это и соответствовать тому, как работает мой мозг (и, надеюсь, еще для некоторых) :
" и " возвращает первый ложный элемент (например, None, "", [], (), {}, 0) или последний элемент, если нет (например, не найдено False)
" или " возвращает первый истинный элемент или последний элемент (например, не найден True)
в итоге все они возвращают первый элемент, который решает исход заявления. (В худшем случае, последний пункт в последовательности)
обратите внимание, что это правило также применяется к цепочке all " and "или all" или " statement