2017-10-03 49 views
0

Python court-circuite les opérateurs logiques. pour par exemple:Comment arrêter Python d'un court-circuit?

if False and Condition2: 
    #condition2 won't even be checked because the first condition is already false. 

est-il un moyen d'arrêter ce comportement. Je veux qu'il vérifie les deux conditions et ensuite exécute l'opération et (comme fait en c, C++ etc). C'est utile lorsque nous effectuons une opération avec la condition. Par exemple:

if a<p.pop() and b<p.pop(): 

Une façon peut être de vérifier les conditions avant de comparer les valeurs booléennes. Mais ce serait un gaspillage de mémoire.

+1

Je vous garantis que le « gaspillage » mémoire ici n'affectera pas votre programme de quelque façon que ce soit. –

+0

* gaspillage de mémoire *, je ne sais pas comment la mémoire est ** gaspillée ** ici. –

+0

Solution de contournement incorrecte: '(a

Répondre

8
if all([a < p.pop(), b < p.pop()]) 

Cela crée une liste, qui sera évaluée dans son ensemble, et utilise ensuite all pour confirmer que les deux valeurs sont véridique. Mais cela est un peu obscur et je préfère vous suggère d'écrire simple, facile à comprendre le code:

a_within_limit = a < p.pop() 
b_within_limit = b < p.pop() 
if a_within_limit and b_within_limit: 
0

Vous pouvez utiliser les all() et any() fonctions intégrées à imiter en quelque sorte les opérateurs and et or. Les deux prennent un itérable des valeurs de préférences booléennes comme paramètre. Si vous lui donnez un tuple littéral ou liste, tous les membres sont pleinement évalués:

# all emulates the and operator 
if all((False, Condition2)): 
    do_stuff() 


# any emulates the or operator 
if any((False, Condition2)): 
    do_stuff() 
1

Réponse courte: Non, vous ne pouvez pas arrêter de le faire.

Par exemple:

av = p.pop() 
bv = p.pop() 
if a < av and b < bv: 
    pass 

Ou:

av, bv = p.pop(), p.pop() 
if a < av and b < bv: 
    pass 

En outre, il n'y a pas de perte de mémoire dans ces exemples. En Python, presque tout est fait par référence. L'objet de valeur qui a été créé existe déjà quelque part. Même les scalaires comme les chaînes, les ints, etc. sont des objets (certains d'entre eux sont légèrement optimisés). Les seuls changements de mémoire ici sont (1) la création d'une nouvelle variable qui fait référence au même objet existant, et (2) la suppression de l'enregistrement dans le dict en même temps (qui se référait à cet objet avant de sauter). Ils sont de la même échelle.

0

Si les conditions sont booléens, comme dans votre exemple, vous pouvez utiliser à la place &:

>>> a, b, p = 1, 1, [0, 0] 
>>> (a < p.pop()) & (b < p.pop()) 
False 
>>> p 
[]