Найти - Пользователи
Полная версия: "А не индийский ли код я написал?" или "Как быстрее/короче и т.д."
Начало » Python для новичков » "А не индийский ли код я написал?" или "Как быстрее/короче и т.д."
1 2 3 4 5
bismigalis
bot1net
Насколько, по вашему мнению, правомерно связывать ими элементы
все элементы в этом контексте считаются, либо True, либо False, так-что нарушения нет
bot1net
bismigalis, но по какой причине тогда мы имеем следующий результат:
>>> (1 and 2 and 3) == 3
True
>>> (1 and 3 and 2) == 3
False
Значения явно не булевы, и из примера следует, что скобки не изменяют приоритет операций, хотя булевы операнды имеют более высокий приоритет относительно операндов сравнения, так что можно обходиться и без скобок.
bismigalis
в документации написано что 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
bot1net
bismigalis, прояснилось, благодарю!
bot1net
bismigalis, а как вы это прокомментируете?
>>> 1 == True
True
>>> 2 == True
False
>>> 3 == True
False
>>> 1111111 == True
False
bot1net
Небольшое замечание. Моя позиция такова, что булевы операторы можно использовать только для выражений, результатом оценки которых будут булевы же значения, по причинам, указанным выше. Никаких 10005000 == True быть не должно, поскольку 10005000 не принадлежит множеству, над которым введена булева алгебра, всего то
Проблема для меня в том, что представляется затруднительным написать
if a and b and c == d:
    print 'ok'
Вместо
if a == b == c == d:
    print 'ok'
Короче говоря небезопасно, на мой взгляд абсолютно некомпетентного человека, использовать булевы операторы для литералов и т.п.
bismigalis
то был псевдокод ), поправил пост
bismigalis
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)
bismigalis
bot1net
Моя позиция такова, что булевы операторы можно использовать только для выражений, результатом оценки которых будут булевы же значения
по приведенной мной ссылке, есть табличка, там много языков с таким поведением(в последнем столбце стоит Boolean), выбирай любой
doza_and
bot1net
Небольшое замечание. Моя позиция такова….
Может пора взглянуть на проблему с другой стороны. А зачем вам это надо:
(1 and 2 and 3) == 3
Какая особо сложная задача потребовала от вас такого кода?
Такое поведение or and можно использовать для украшения кода вспомните перловское почти Шекспировское:
open F, "< $f" or die "Can't open $f : $!";
Но в питоне такие бантики почти не нужны. (точнее я практически не использую)
Пишите проще и таких проблем вообще не будет.
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