Является ли закон де Моргана питоническим?

Какое из следующих утверждений if является более Pythonic?

if not a and not b:
    do_something

ИЛИ ЖЕ

if not ( a or b ):
    do something

Это не предикатная логика, поэтому я должен использовать ключевые слова Python, потому что это более читабельно, верно?

В более позднем решении более оптимальным, чем другие? (Я не верю в это.)

Есть ли какие-либо руководства по PEP-8 по этому вопросу?

Байт-код двух подходов (если это имеет значение):

In [43]: def func1():
    if not a and not b:
        return
   ....:     
   ....:     

In [46]: def func2():
    if not(a or b):
        return
   ....:     
   ....:     

In [49]: dis.dis(func1)
  2           0 LOAD_GLOBAL              0 (a)
              3 UNARY_NOT           
              4 JUMP_IF_FALSE           13 (to 20)
              7 POP_TOP             
              8 LOAD_GLOBAL              1 (b)
             11 UNARY_NOT           
             12 JUMP_IF_FALSE            5 (to 20)
             15 POP_TOP             

  3          16 LOAD_CONST               0 (None)
             19 RETURN_VALUE        
        >>   20 POP_TOP             
             21 LOAD_CONST               0 (None)
             24 RETURN_VALUE        

In [50]: dis.dis(func2)
  2           0 LOAD_GLOBAL              0 (a)
              3 JUMP_IF_TRUE             4 (to 10)
              6 POP_TOP             
              7 LOAD_GLOBAL              1 (b)
        >>   10 JUMP_IF_TRUE             5 (to 18)
             13 POP_TOP             

  3          14 LOAD_CONST               0 (None)
             17 RETURN_VALUE        
        >>   18 POP_TOP             
             19 LOAD_CONST               0 (None)
             22 RETURN_VALUE        

6 ответов

Решение

Я бы сказал, что вам легче читать, в зависимости от того, что такое a и b.

Я думаю, что оба ваших примера одинаково читабельны, однако, если бы я хотел "вытолкнуть лодку" из-за читабельности, я бы использовал:

not any((a, b))

Так как для меня это больше похоже на английский, и, следовательно, является наиболее Pythonic.

Какой использовать? Все, что более читабельно для того, что вы пытаетесь сделать.

Что касается того, что является более эффективным, первый делает дополнительный not так что это технически менее эффективно, но не так, как вы заметили бы в нормальной ситуации.

Они эквивалентны, и то, является ли один быстрее другого, зависит от обстоятельств (значения a и b).

Так что просто выберите версию, которую вы считаете наиболее читаемой и / или понятной.

Мне лично нравится подход Эйфеля, помещенный в питоническую форму

если а а потом б: что-то

если а и б: что-то

Первый подход отличается от второго, если a ложно. Он не оценивает b в первом случае, а во втором.

Или эквивалент "или иначе"

http://en.wikipedia.org/wiki/Short-circuit_evaluation

и / или хотят.

а затем / или еще короткое замыкание оценки

Приятной особенностью синтаксиса является то, что он хорошо читается и не вводит новые ключевые слова.

Чтобы кусок кода был Pythonic, он должен быть приятным для читателя сам по себе (читабельный) и в контексте его окружения (непротиворечивый). Без контекста этого куска кода трудно дать хорошее мнение.

Но, с другой стороны... Если бы я был Pythonic по моему мнению, давая мне, я должен был бы работать последовательно со своим окружением, которое, кажется, не принимает во внимание контекст (например, OP).

Верхний

Другие вопросы по тегам