2017-01-20 9 views
6

Robię to co następuje:Powiązanie oświadczenia za pomocą „i” słowa kluczowego

if ycoords[0] > 0 and ycoords[1] > 0 and ycoords[2] > 0: 
    # do stuff 

można skrócić ten kod robiąc coś takiego:

if (ycoords[0] and ycoords[1] and ycoords[2]) > 0: 
    # do stuff 
+0

Także pokrewne: http://stackoverflow.com/questions/10666163/how-to-check-if-allements-of-a-list-matches-a-ondition –

Odpowiedz

9

Tak, można użyć all:

if all(x > 0 for x in ycoords): 

lub ycoords[:3] jeśli ycoords ma więcej niż 3 elementy.

3

Nie można jednak wystarczy skorzystać min uprościć test składniowo:

if min(ycoords[0],ycoords[1],ycoords[2]) > 0: 
    # do stuff 

i zważywszy, że ycoords dokładnie ma trzy elementy, nawet krótsze:

if min(*ycoords) > 0: 
    #do stuff 

można tutaj, jak @ Tagc mówi, pomiń gwiazdkę (*):

if min(ycoords) > 0: 
    #do stuff 

, ale spowoduje to pewien narzut.

Inną opcją jest używać all:

if all(x > 0 for x in [ycoords[0],ycoords[1],ycoords[2]]): 
    # do stuff 

lub ponownie, jeśli ycoords zawiera tylko te trzy elementy:

if all(x > 0 for x in ycoords): 
    # do stuff 
+3

"nawet krótszy:' if min (* ycoords)> 0' ". I * nawet * krótszy: 'if min (ycoords)> 0'. – Tagc

1

coś, co nie jest intuicyjny, że and:

"ani ani ani lub ograniczać wartość i wpisać wrócą do Fałsz i prawda, ale raczej powrócić ostatni oceniany argument”

wystarczy otworzyć terminal Python i zrobić:

>> 4 and 3 
3 

Dlaczego to ważne, aby wziąć to pod uwagę?

Można by pomyśleć, że:

(ycoords[0] and ycoords[1] and ycoords[2]) > 0 

odpowiada:

ycoords[0] > 0 and ycoords[1] > 0 and ycoords[2] > 0 

lub że jest równoważne:

(bool(ycoords[0]) and bool(ycoords[1]) and bool(ycoords[2])) > 0 

ale zamiast równoważne:

ycoords[2] > 0 

Uważaj, ponieważ tłumacz nie robi tego, co myślisz.