Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 27, 2013 19:05:19

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

bot1net
Насколько, по вашему мнению, правомерно связывать ими элементы
все элементы в этом контексте считаются, либо True, либо False, так-что нарушения нет

Офлайн

#2 Апрель 27, 2013 19:47:24

bot1net
Зарегистрирован: 2013-01-18
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

bismigalis, но по какой причине тогда мы имеем следующий результат:

>>> (1 and 2 and 3) == 3
True
>>> (1 and 3 and 2) == 3
False
Значения явно не булевы, и из примера следует, что скобки не изменяют приоритет операций, хотя булевы операнды имеют более высокий приоритет относительно операндов сравнения, так что можно обходиться и без скобок.

Офлайн

#3 Апрель 27, 2013 20:08:56

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

в документации написано что and и or являются short-circuit операциями, я не знаю как это перевести, но смысл в том что операнды эвалуируются по порядку.
и поэтому

1 and 2 and 3
это сокращение для
if bool(1) == True:
    if bool(2) == True:
        if bool(3) == True:
            return 3

1 and 3 and 2
это сокращение для
if bool(1) == True:
    if bool(3) == True:
        if bool(2) == True:
            return 2
а впрочем есть статья на википедии http://en.wikipedia.org/wiki/Short-circuit_evaluation

Отредактировано bismigalis (Апрель 27, 2013 20:46:33)

Офлайн

#4 Апрель 27, 2013 20:21:07

bot1net
Зарегистрирован: 2013-01-18
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

bismigalis, прояснилось, благодарю!

Офлайн

#5 Апрель 27, 2013 20:27:10

bot1net
Зарегистрирован: 2013-01-18
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

bismigalis, а как вы это прокомментируете?

>>> 1 == True
True
>>> 2 == True
False
>>> 3 == True
False
>>> 1111111 == True
False

Офлайн

#6 Апрель 27, 2013 20:31:20

bot1net
Зарегистрирован: 2013-01-18
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

Небольшое замечание. Моя позиция такова, что булевы операторы можно использовать только для выражений, результатом оценки которых будут булевы же значения, по причинам, указанным выше. Никаких 10005000 == True быть не должно, поскольку 10005000 не принадлежит множеству, над которым введена булева алгебра, всего то
Проблема для меня в том, что представляется затруднительным написать

if a and b and c == d:
    print 'ok'
Вместо
if a == b == c == d:
    print 'ok'
Короче говоря небезопасно, на мой взгляд абсолютно некомпетентного человека, использовать булевы операторы для литералов и т.п.

Отредактировано bot1net (Апрель 27, 2013 20:39:54)

Офлайн

#7 Апрель 27, 2013 20:46:51

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

то был псевдокод ), поправил пост

Отредактировано bismigalis (Апрель 27, 2013 20:47:02)

Офлайн

#8 Апрель 27, 2013 20:51:09

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

bot1net
а как вы это прокомментируете?
>>> 1 == True
True
>>> 2 == True
False
>>> 3 == True
False
>>> 1111111 == True
False

В данном контексте True это 1, False это 0, т.е.
1 == int(True)
2 == int(True)
3 == int(True)

Офлайн

#9 Апрель 27, 2013 21:06:20

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

bot1net
Моя позиция такова, что булевы операторы можно использовать только для выражений, результатом оценки которых будут булевы же значения
по приведенной мной ссылке, есть табличка, там много языков с таким поведением(в последнем столбце стоит Boolean), выбирай любой

Офлайн

#10 Апрель 27, 2013 21:11:17

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

"А не индийский ли код я написал?" или "Как быстрее/короче и т.д."

bot1net
Небольшое замечание. Моя позиция такова….
Может пора взглянуть на проблему с другой стороны. А зачем вам это надо:
(1 and 2 and 3) == 3
Какая особо сложная задача потребовала от вас такого кода?
Такое поведение or and можно использовать для украшения кода вспомните перловское почти Шекспировское:
open F, "< $f" or die "Can't open $f : $!";
Но в питоне такие бантики почти не нужны. (точнее я практически не использую)
Пишите проще и таких проблем вообще не будет.



Отредактировано doza_and (Апрель 27, 2013 21:16:02)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version