4
votes

Opérateur Python 'in' avec boucle 'for' et instruction 'if'

J'utilise l'opérateur python in avec la boucle for et avec l'instruction if . Ma question est de savoir comment dans est implémenté, qu'il se comporte différemment dans ces deux cas: il itère lors de l'utilisation de la boucle for et il vérifie si un élément existe lors de l'utilisation avec si déclaration? Cela dépend-il de la mise en œuvre de pour et si?

    for i in x:
        #iterates

    if i in x:
        #checks weather i in x or not 


0 commentaires

5 Réponses :


0
votes

Le mot-clé dans est généralement un opérateur:

# as aliases ExitStack
from contextlib import ExitStack as ContextStack

# as holds the result of ContextStack().__enter__()
with ContextStack() as stack:
    ...

Il correspond au object .__ contient__ méthode spéciale. L'expression a en b correspond au type (b) .__ contient __ (a) . Notez que a et b sont des noms qui sont recherchés.

Dans une instruction for , dans n'est pas un opérateur. Il fait partie de la syntaxe for .. in .. et sépare la variable de boucle name de l'itérable.

for thing in range(20):
    print(thing)  # thing is something else on each step

Notez que pour a in b seul b est un nom qui est recherché. a est un nom auquel se lier, semblable à une instruction d'affectation.


La syntaxe Python a plusieurs constructions où le mot-clé principal définit la signification des mots-clés suivants. Par exemple, le mot-clé as a une signification différente dans import et with:

print(2 in [1, 2, 3])  # True
if 3 in range(7, 20):
   print('3 in range!')

Il est utile de penser à ces mots-clés non pas par implémentation mais par signification . Par exemple, a in b signifie toujours que " a est contenu par b".


1 commentaires

@Nane merci de voter pour les réponses qui vous aident et d'accepter celle qui répond le mieux à votre question.



0
votes

La raison en est que pour ... dans est quelque chose de différent de seulement dans .

pour x dans y itère sur y .

si x dans y appelle y .__ contient __ (x) .


0 commentaires

1
votes

Le mot-clé "in" en python résout différents objectifs basés sur "for" et "if". veuillez consulter ce lien connexe dans le débordement de pile pour plus de clarté


0 commentaires

2
votes

Les tests d'appartenance avec dans sont implémentés via la méthode __contains__ (voir Documentation ). Le comportement différent vient du mot-clé avant, pour et si dans votre cas.

L'itération avec pour est implémentée de telle sorte que la méthode next est appelé et sa valeur de retour est écrite dans la variable d'itération tant que la condition après le mot clé pour est vraie. Le test d'adhésion en général n'est qu'une condition.

Code

A = B.next()
if B.__contains__(A) :
    # Body

A = B.next()
if B.__contains__(A) :
    # Body

# ...

A = B.next()
if B.__contains__(A) :
    # B.next() throws "StopIteration" if there is no more element

Exécution p >

for A in B :
    # Body

Code

B.__contains__(A)  # returns boolean

Exécution

A in B


1 commentaires

Si B.next () renvoie A , alors il n'y a pas besoin de si B .__ contient __ (A): . Corrigez-moi si je me trompe.



0
votes

Dans de nombreuses langues, vous trouverez des mots-clés à usages multiples. Ceci est simplement un exemple de cela. Il est probablement plus utile de penser en termes de déclarations que de penser au mot-clé in comme un opérateur.

L'instruction x in y est une instruction à valeur booléenne prenant (en supposant que y est une collection appropriée) True si et seulement si le la valeur de x est dans la collection y . Il est implémenté avec la fonction membre __contains__ de y .

L'instruction for x in y: démarre une boucle, où chaque itération x prend une valeur différente de la collection y . Cela est implémenté à l'aide de la fonction membre __iter__ de y et __next__ sur l'objet itérateur résultant.

Il existe d'autres instructions dans lesquelles le mot-clé in peut apparaître, comme la compréhension de liste ou la compréhension du générateur.


0 commentaires