Использование оператора" 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 если a True, else returns a.
  • a or b возвращает a если a True, else returns 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".

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

второе, что нужно заметить, это то, какое значение оператора "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 is False затем b не будет оцениваться
  • на a or b если a is 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 оцените первое значение, которое сделало их "успешными"или " неудачными" - и это не обязательно должно быть правдой или ложью!

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