2012-05-24 13 views
5

ja tkwi w tym konkretnym przypadku z nurkowania do pytonaZanurz pytona i albo nie

przykładzie 4.18. Kiedy i albo Sztuczka zawodzi

>>>>a = "" 
>>>>b = "second" 
>>>1 and a or b 
>>>>'second' 

Ponieważ jest pusty ciąg znaków, który Python uważa fałsz w kontekście logicznym, 1 i „” evalutes do „”, a następnie „” lub „drugi” evalutes do "drugiego". Ups! Nie tego chciałeś. Znak i-lub trik, bool i a lub b, nie będzie działał jak Bool wyrażenia C? a: b, gdy a jest fałszem w kontekście boolowskim .

Dlaczego mówi się, że nie jest to, czego chce użytkownik, mam na myśli 1 i "" oceni na "Fałsz", a "" lub b oceni na "drugie", to dokładnie to, co powinno się wydarzyć, nie wiem " t rozumiem, dlaczego jest źle? Czy brakuje mi czegoś?

Odpowiedz

4

Nie, czegoś nie brakuje.

Inline warunkowe expr if cond else expr zostało wprowadzone do Pythona 2.5 w PEP 308; przed tym, warunkowe musiał być pełnej formie

if cond: 
    expr 
else: 
    expr 

Jednak ludzie zauważyli, że expr and cond or expr sort-of pracował jako inline warunkowego, o ile pierwsze wyrażenia się ocenić na Boolean true. Ponieważ większość rzeczy w Pythonie jest prawdziwa, składnia ta zazwyczaj działała - a potem, oczywiście, czasami zawodzi. W rzeczywistości była to motywacja do dodania warunkowego warunku "właściwego".

2

"i-lub trik" został użyty do emulacji trójskładnikowego operatora warunkowego, condition ? if-true : if-false lub podobnego. Ponieważ 1 jest równoważne z True w kontekście logicznym, wyrażenie ma przynieść a, a nie b. Tak więc lekcja brzmi: nie używaj ani nie podstępuj. Pyton posiada potrójny warunkowo od 2,5:

true if condition else false 
+0

Dziękuję. Pomyślałem, że jest coś jeszcze, czego nie rozumiem. –

2

Zanurz pytona nie jest dobrym przewodnikiem i should not be followed


Wyrażenie x and y or z użyto przed pyton miał odpowiednią ekspresję trójskładnikowej (y if x else z). Ta sekcja mówi, dlaczego może cię zaskoczyć, jeśli spodziewasz się, że zachowa się jak C's x ? y : z.


Jest lista tutoriali na python wiki. że może dać bardziej aktualne zasobu.

+0

Fajne zing shaw rant. – gary

+0

co powinienem wtedy naśladować ?, myślałem, że zanurkowanie w pythonie powinno wystarczyć jako przykłady. Jestem świadomy składni, szukałem na przykład, aby zobaczyć, jak można lepiej zrobić rzeczy w pythonie –

+0

@KartikAnand: Link w mojej odpowiedzi ma wiele opcji w sekcji "Nauka Pythona" (gdzie można zauważyć, że DIP nie występuje w żadnej formie). – Daenyth

0

Dlaczego mówi, że to nie jest to, co użytkownik chce, to znaczy 1, a „” byłoby FALSE, podczas gdy „” lub b oceni na „drugi”, to doskonale, co powinno się zdarzyć, Nie rozumiem, dlaczego jest nie tak? Czy jestem czegoś brakuje?

Czuję, że ta część pytania jest ignorowana. condition and if-true or if-false jest sztuczką używaną w wersjach> 2.5, jak wyjaśniono w innych odpowiedziach, aby naśladować inne języki "condition ? if-true : if-false lub nowsze wersje" if-true if condition else if-false.

Problemem jest to, że jeśli if-true jest obiektem, który ma wartość false ("", [], (), False lub 0), to nie powiedzie się, zgodnie z oczekiwaniami, jeśli spojrzeć na oceny, ale który może przesuwać się jako błąd, jeśli if-true jest dynamicznie ustawiane i może oceniać jako fałszywe.

naiwnie oczekiwać wynikiem condition and a or b byłby którego treść a ("", pusty string), jako warunek (1) ocenia się true, ale jak 1 and a ocenia się false więc masz zawartość b.

Rozwiązaniem tego problemu jest użycie składni Python 2.5+ (if-true if condition else if-false) lub upewnienie się, że if-true nigdy nie jest fałszywe. Jednym ze sposobów osiągnięcia drugi to pakować if-true i if-false w krotki lub listy, jako iterable niepusty jest zawsze prawdziwe:

>>> a = "" 
>>> b = "second" 
>>> condition = 1 
>>> condition and a or b 
'second' 

>>> condition and [a] or [b] 
[''] 

>>> (condition and [a] or [b])[0] 
'' 

Jest to rodzaj brzydki rozwiązanie, ale jest tam, jeśli trzeba kierować stare wersje Pythona.

+0

W rzeczywistości to, co powiedziałeś, zostało już podane w książce, a moje pytanie nie brzmi: jak naprawić błąd, mój pytanie brzmi: dlaczego autor mówi "nie jest to, czego oczekiwał użytkownik". W zasadzie odpowiedziałeś na moje pytanie w pierwszej części odpowiedzi, nie było potrzeby pisania kodu i podziękowań :) –

+0

@KartikAnand: jasne, chciałem tylko aby mieć pewność, że jeśli ktoś znajdzie to pytanie w przyszłości, będzie miał pełny kontekst :) – voyager