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
5 Réponses :
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
".
@Nane merci de voter pour les réponses qui vous aident et d'accepter celle qui répond le mieux à votre question.
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)
.
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é
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
Si B.next ()
renvoie A
, alors il n'y a pas besoin de si B .__ contient __ (A):
. Corrigez-moi si je me trompe.
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.