Подтвердить что ты не робот

Является ли De Morgan Law Pythonic?

Какое из следующих утверждений 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        
4b9b3361

Ответ 1

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

Ответ 2

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

not any((a, b))

Так как для меня это читается гораздо больше, как английский, и, следовательно, является самым питоническим.

Ответ 3

Что использовать? В зависимости от того, что вы хотите сделать, читайте

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

Ответ 4

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

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

Ответ 5

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

если a, а затем b:   DoSomething

если a и b:   DoSomething

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

Это или эквивалент "или иначе"

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

и/или нетерпеливы.

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

Самое приятное в синтаксисе заключается в том, что он хорошо читается, и он не вводит новые ключевые слова.

Ответ 6

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

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

Верхняя часть.