Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 30, 2013 00:34:55

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Инструкция True and True

Всем привет

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

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

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

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



Отредактировано Budulianin (Авг. 30, 2013 00:49:07)

Офлайн

#2 Авг. 30, 2013 01:34:46

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

Инструкция True and True

Во, надо будет расписать и в подпись положить. Про and, про or и про '' if. Хотя в задачках есть.



Бейсик - не порок, Гвидо - не пророк

Офлайн

#3 Авг. 30, 2013 06:18:33

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Инструкция True and True

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

Неа, если первое значение == False, то второе и последующие вообще не вычисляются, это особенность ленивых вычислений. Суть в том, что если где то в цепочке x and y and z and foo and bar встретился False, то вычислять остальные не имеет смысла. Можно сказать, что and возвращает первую встретившуюся переменную из цепочки, чье значение эквивалентно False.



Офлайн

#4 Авг. 30, 2013 06:23:48

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Инструкция True and True

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()



Офлайн

#5 Авг. 30, 2013 08:10:34

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Инструкция True and True

Офлайн

#6 Авг. 30, 2013 09:44:07

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Инструкция True and True

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 не очень пока. Нетерпеливый оператор :)



Отредактировано Budulianin (Авг. 30, 2013 10:32:27)

Офлайн

#7 Авг. 30, 2013 10:09:45

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

Инструкция True and True

Будет больше, жизнь-то идёт.



Бейсик - не порок, Гвидо - не пророк

Офлайн

#8 Авг. 30, 2013 10:18:15

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Инструкция True and True

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

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



Офлайн

#9 Авг. 30, 2013 10:37:23

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Инструкция True and True

FishHook
Теперь перечитайте, что я написал выше.

Я просто так выразился, не очень корректно, в первый раз. Потом я уточнил:
Budulianin
Только когда оба False, тут уточнение, что только один операнд вычисляется.



Отредактировано Budulianin (Авг. 30, 2013 10:37:50)

Офлайн

#10 Авг. 30, 2013 11:42:57

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

Инструкция True and True

чё вы спорите. выполнение идёт до ПЕРВОГО 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 {}
# {}



Бейсик - не порок, Гвидо - не пророк

Отредактировано wbt (Авг. 30, 2013 11:46:02)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version