2013-09-05 9 views
5

Ich weiß, logisch ist and für booleans verwendet, um wahr zu überprüfen beide Bedingungen erfüllt sind, aber ich habe ein Problem mit der folgenden Aussage:und Betrieb in Python Überlastung

print "ashish" and "sahil" 

it prints out "sahil"? 
another example: 
return s[0] == s[-1] and checker(s[1:-1]) 
(taken from recursive function for palindrome string 
checking    
please explain it and other ways and is oveloaded ,especially what the second statement do. 
+3

was soll es drucken? – alecxe

+7

Die logischen Operatoren von Python geben keine booleschen Werte zurück. Werfen Sie einen Blick auf die Dokumentation: http://docs.python.org/3.3/library/stdtypes.html#boolean-ope- rationen-und-oder-nicht – Blender

Antwort

7

x and y im Grunde bedeutet:

Falsch-ish

Rückkehr y, es sei denn, x ist - in diesem Fall Rückkehr x

Hier ist eine Liste der möglichen Kombinationen:

>>> from itertools import combinations 
>>> items = [True, False, 0, 1, 2, '', 'yes', 'no'] 
>>> for a, b in combinations(items, 2): 
    print '%r and %r => %r' % (a, b, a and b) 


True and False => False 
True and 0 => 0 
True and 1 => 1 
True and 2 => 2 
True and '' => '' 
True and 'yes' => 'yes' 
True and 'no' => 'no' 
False and 0 => False 
False and 1 => False 
False and 2 => False 
False and '' => False 
False and 'yes' => False 
False and 'no' => False 
0 and 1 => 0 
0 and 2 => 0 
0 and '' => 0 
0 and 'yes' => 0 
0 and 'no' => 0 
1 and 2 => 2 
1 and '' => '' 
1 and 'yes' => 'yes' 
1 and 'no' => 'no' 
2 and '' => '' 
2 and 'yes' => 'yes' 
2 and 'no' => 'no' 
'' and 'yes' => '' 
'' and 'no' => '' 
'yes' and 'no' => 'no' 
+1

Für einen Moment dachte ich, Sie manuell alle diese Operationen eingegeben (dann habe ich gescrollt hoch und gefunden 'Kombinationen'). ;-) –

+1

@AshwiniChaudhary: Ich würde es nicht wagen;) Ich könnte aber einfach die Ausgabe einfügen, so dass ich nicht erklären müsste, was 'Kombinationen' tun, aber auf diese Weise gab ich OP nicht nur die Antwort, sondern auch Werkzeug zu erkunden es weiter. – Tadeck

10

and nicht überlastet ist.

In Ihrem Code ist "ashish" ein truthy Wert (weil nicht leere Zeichenfolgen truthy sind), so wertet es "sahil" aus. Da "sahil" ebenfalls ein truthy-Wert ist, wird "sahil" an die print-Anweisung zurückgegeben und dann gedruckt.

+2

Selbst wenn "Sahil" nicht truthy wäre, wäre es immer noch der Wert, der vom 'und' Operator zurückgegeben wird. – chepner

+0

@MattBryant: Wie @chepner sagte, wird das zweite Element immer zurückgegeben, es sei denn, das erste Element wird als falsch betrachtet (z. B. leere Zeichenfolge, "False", Null, leere Liste usw.). – Tadeck

+0

Ja, ich hätte das wahrscheinlich erklären sollen, aber ich denke @chepner hat es gut behandelt. –

4

Wenn das Ergebnis des Ausdrucks links von and falsch ist, wird dies ausgewertet. Andernfalls wird das Ergebnis des Ausdrucks auf der rechten Seite ausgewertet. "ashish" ist truthy.