Найти - Пользователи
Полная версия: Инструкция True and True
Начало » Python для новичков » Инструкция True and True
1 2
Budulianin
Всем привет

Рылся в коде и нашёл такую удобную инструкцию

#в result результат re.match
return result and result.group(1)

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

Это фишка Python или такое поведение во многих языках ? Где ещё можно посмотреть про подобные не очевидные фишки ?

wbt
Во, надо будет расписать и в подпись положить. Про and, про or и про '' if. Хотя в задачках есть.
FishHook
Budulianin
Если оба значения True, то возвращается значение правого операнда, если одно даёт False, то возвращается оно, если оба False

Неа, если первое значение == False, то второе и последующие вообще не вычисляются, это особенность ленивых вычислений. Суть в том, что если где то в цепочке x and y and z and foo and bar встретился False, то вычислять остальные не имеет смысла. Можно сказать, что and возвращает первую встретившуюся переменную из цепочки, чье значение эквивалентно False.
FishHook
def a():
    print "a"
    return 0
def b():
    print "b"
    return 2
def c():
    print "c"
    return 3
print a() and b() and c()
print b() and a() and c()
sergeek
это из лиспа
http://en.wikipedia.org/wiki/Short-circuit_evaluation
Budulianin
FishHook
Неа,

Что неа? всё что я описал, так и есть

Budulianin
Если оба значения True, то возвращается значение правого операнда, если одно даёт False, то возвращается оно, если оба False, то возвращается значение левого операнда.

Только когда оба False, тут уточнение, что только один операнд вычисляется. Я знаю про ленивые вычисления, только не уверен был, что они в Python используются. Меня в этой инструкции удивило, что возвращается значение операнда, а не логический литерал :) наверно потому что привык подобное видеть, как условие цикла или ветвления

Хотя в таблице Short-circuit_evaluation, указано, что некоторые ЯП возвращают boolean значения, а некоторые Last value

wbt
http://py.hc25.ru
Там мало примеров

Из Short-circuit_evaluation:
С Result type понятно, выводится последнее значение, которое проверялось, а вот Eager operators не очень пока. Нетерпеливый оператор :)
wbt
Будет больше, жизнь-то идёт.
FishHook
wbt
Что неа? всё что я описал, так и есть
Budulianin
Если оба значения True, то возвращается значение правого операнда, если одно даёт False, то возвращается оно, если оба False, то возвращается значение левого операнда.

Теперь перечитайте, что я написал выше.
Конкретно у Вас ошибка в рассуждениях тут “если оба False, то возвращается значение левого операнда”
Это неверно только лишь потому, что левый операнд вообще не будет учитываться. Вы запустите пример, который я дал и поймёте, что
a() and b() and c()
если а == False, то функции b и c вообще не выполняются и никаких “оба False” не бывает, они могли бы вернуть True, False, Адольфа Гитлера - вообще не важно что, ибо они никогда не выполнятся.
Budulianin
FishHook
Теперь перечитайте, что я написал выше.

Я просто так выразился, не очень корректно, в первый раз. Потом я уточнил:
Budulianin
Только когда оба False, тут уточнение, что только один операнд вычисляется.
wbt
чё вы спорите. выполнение идёт до ПЕРВОГО True в случае or или до первого False в случае and, слева направо.

я пример не выложил, потому что не хочу делать мелкие обновления, но вот он:

a = 0 or 5
# 5
a = 1 or 5
# 1
a = 1 or 5 or 0
# 1
a = 0 and 5
# 0
a = 1 and 5
# 5
#
def r(x):
    print (x), bool(x)
    return x
#
r(1) and r(2) and r(3)
# 1 True, 2 True, 3 True
r(0) and r(1) and r(2) and r(3)
# 0 False
#
r(1) or r(2) or r(3)
# 1 True
r(0) or r(1) or r(2) or r(3)
# 0 False, 1 True
#
x = 0 or 0/0
# ZeroDivisionError
x = 1 or 0/0
# 1
x = 0 and 0/0
# 0

а если нет совпадений - равнение по последнему:

 a = 0 or {} or False
# False
a = False or 0 or {}
# {}
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB