2011-01-17 8 views
-3
string='a' 
p=0 
while (p <len(string)) & (string[p]!='c') : 
        p +=1 

print ('the end but the process already died ') 
     while (p <1) & (string[p]!='c') : 
IndexError: string index out of range 

Ich möchte eine Bedingung testen bis zum Ende einer Strings (zB Stringlänge = 1) warum beiden Teile des sind und ausgeführt ist die Bedingung bereits falsch ist! solange p < len(string). Der zweite Teil braucht nicht einmal ausgeführt zu werden. wenn es eine Menge Leistung kann verloren gehenPython 3 Reihenfolge der Tests unbestimmter

+1

Warum verwenden Sie den bitweisen '&' Operator? –

+3

Nicht das ist ein Rad neu erfassender Code. Wie wäre es mit 'p = string.find (c)' (gibt -1 statt 'len (string) -1 'zurück, wenn es nicht da ist - also ist es noch besser, wie in, nicht mehrdeutig)? – delnan

Antwort

9

Sie verwenden nicht ordnungsgemäß boolean and. Verwenden Sie es und Sie werden dieses Problem nicht sehen. Was Sie verwenden (&) ist ein bitweiser Vergleich, der beide Seiten auswertet.

1

bitweise AND, "a & b", sollte man sich als

function _bitwise_and(A,B): 
    # A and B are Python expressions 
    # which result in lists of 1's and 0's 

    a = A.evaluate() 
    b = B.evaluate() 

    return [ 1 if abit==1 and bbit==1 else 0 for abit,bbit in zip(a,b)] 

so, grafisch,

a: ... 0 1 1 0 
b: ... 1 0 1 0 
     -------- 
a&b ... 0 0 1 0 <- each bit is 1 if-and-only-if the 
         corresponding input bits are both 1 

und das Ergebnis ist eine Liste von Bits, in eine ganze Zahl gepackt.

.

Logisches UND, "a und b", sollte statt als

function _and(A,B): 
    # A and B are Python expressions which result in values having truthiness 

    a = A.evaluate() 
    if is_truthy(a): 
     b = B.evaluate() 
     return b 
    else: 
     return a 

gedacht werden.

Hinweis: wenn das Ergebnis der A falsy ist, B wird nie ausgewertet - also, wenn Ausdruck B hat einen Fehler bei der Auswertung, bitweise und wird in einem Fehler während logisch und wird nicht führen.

Dies ist die Grundlage für das gemeinsame Python Idiom

while (offset in data) and test(data[offset]): 
    do_something_to(data[offset]) 
    next offset 

..., da die Daten [offset] nur Offset ausgewertet wird, wenn ein nutzbarer (non-error-produzierenden) Wert.

Mit '&' anstelle von 'und' garantieren Sie einen Fehler durch Auswertung der Daten [last_offset + 1] am Ende Ihrer Schleife.

.

Natürlich ist dies mit einem anderen gemeinsamen Idiom hätte vermieden werden können:

for ch in string if ch=='c': 
    do_something_to(ch) 

die insgesamt Indexerror Probleme vermeidet.

Verwandte Themen