2012-10-22 6 views
24

Które z poniższych stwierdzeń, jeśli stwierdzenia są bardziej Pythoniczne?Czy Prawo De Morgana jest Pythoniczne?

if not a and not b: 
    do_something 

LUB

if not (a or b): 
    do something 

Jego logika predykatów nie tak powinno się używać słów kluczowych Pythona, ponieważ jej bardziej czytelnej prawo?

W późniejszym rozwiązaniu bardziej optymalnym niż inne? (Nie wierzę w to).

Czy są na niej jakieś przewodniki PEP-8?

kodu bajtowego z dwóch podejść (jeśli ma to znaczenie):

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   
+0

Co masz na myśli, mówiąc o słowach kluczowych w Pythonie? Używasz słów kluczowych Python w obu przypadkach. – sepp2k

+0

Przeprosiny Miałem na myśli składnię not(). W moim przypadku niektóre rzeczy będą wyglądały gorzej, jeśli nie użyję składni (a lub b). Dlatego bardziej pochylam się nad pierwszym fragmentem kodu. – nialloc

+0

Mam tendencję do myślenia, że ​​"do_something" i "do zrobienia czegoś" (bez podkreślenia) mogą być różne – Uri

Odpowiedz

15

Powiedziałbym, w zależności co jest łatwiejsze do odczytania, w zależności od tego, co aib są.

+0

Polecono nam zmienić kod, ponieważ ktoś uważa, że ​​ten drugi jest bardziej czytelny. Python 2.6, więc wszystkie funkcje mogą być używane dla bardziej złożonych instrukcji, ale gdy porównuje się dwa elementy, ma to znaczenie. Myślę, że pierwsze czytanie łatwiejsze, ale nie mam przypadku, aby powiedzieć, że drugi nie jest. . . Wiele zmian w kodzie i test jednostkowy do uruchomienia !! – nialloc

+0

wiele razy takie rzeczy są bardziej preferencyjne; lub czasami musisz przestrzegać już obowiązujących konwencji. jeśli pracujesz nad wspólną bazą kodu, a kilka osób woli jedną nad drugą, pójdę z konwencją. sprawia, że ​​ogólna podstawa kodu jest znacznie bardziej spójna. –

1

Są one równoważne i to, czy jeden jest szybszy od drugiego, zależy od okoliczności (wartości a i b).

Po prostu wybierz wersję, która jest dla Ciebie najbardziej czytelna i/lub zrozumiała.

3

Które użyć? Ktokolwiek jest bardziej czytelny dla tego, co próbujesz zrobić.

Co do tego, która jest bardziej wydajna, pierwsza z nich robi dodatkową not, więc jest technicznie mniej wydajna, ale nie w normalnej sytuacji.

+0

Masz na myśli, że jest to technicznie * bardziej * wydajne. – mgilson

+0

Masz na myśli, że ten pierwszy robi dodatkowe "nie", prawda? – sepp2k

+0

Tak, na tym ekranie laptopa nie widzę pytania i mojej odpowiedzi na raz. Naprawiłem to. :-) – kindall

15

myślę oba Twoje przykłady są równie czytelne, jednak gdybym chciał „push łódź” ​​na czytelność pójdę z:

not any((a, b)) 

Ponieważ dla mnie to brzmi bardziej jak po angielsku, i stąd jest najbardziej Pythoniczny.

+0

Huh. +1 za to, że mnie zaskakuje - nie sądzę, abym kiedykolwiek użył tego wzoru w moim kodzie i nie jestem w stanie wyjaśnić dlaczego. To prawda, staram się unikać '((' 'i')) 'gdzie mogę, ale tutaj nie jest tak źle. – DSM

+9

To jednak w pełni oceni zarówno "a" jak i "b", których zwykli operatorzy Boolean nie będą. Nie jest to powód, aby go nie używać, ale coś, o czym należy pamiętać. – kindall

+0

@mindall dobry punkt! –

1

osobiście jak podejścia Eiffla umieścić w postaci pythonowy

jeśli a oraz b: doSomething

jeśli A i B: doSomething

Pierwsze podejście różni się od drugiego jeśli a jest fałszywe. Nie ocenia b w pierwszym przypadku, w drugim robi.

Jeden lub ekwiwalentnych "albo"

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

i/lub są chętnie.

i/albo zwarcie ocena

Zaletą składni jest to, że brzmi dobrze, a nie wprowadzać nowe słowa kluczowe.

+0

W języku Python można uzyskać ten sam efekt, co operatory "chętni", dodając lub mnożąc liczbę bajtów. na przykład 'bool (a) + bool (b)' jest "chętny" lub "(zawsze ocenia zarówno' a' jak i 'b') i' bool (a) * bool (b) 'jest" chętny "' i ' . Oczywiście zwykłe zwarcie "i" i "lub". – kindall

0

Aby fragment kodu był Pythonic, musi być zarówno przyjemny dla czytelnika sam w sobie (czytelny), jak iw kontekście otoczenia (spójny). Bez kontekstu tego fragmentu kodu trudno jest podać dobrą opinię.

Ale z drugiej strony ... Gdybym był Pythonic, moim zdaniem, musiałbym działać zgodnie z moim otoczeniem, które wydaje się nie uwzględniać kontekstu (np. PO).

Górny.