Maison > développement back-end > Tutoriel Python > [Python] Comment fonctionne la boucle for ?

[Python] Comment fonctionne la boucle for ?

高洛峰
Libérer: 2017-02-16 10:56:23
original
1050 Les gens l'ont consulté

Si vous le comprenez à un niveau itératif, vous aurez peut-être une compréhension plus profonde de son fonctionnement.
Tout d’abord, utilisons dir pour voir ce que les deux types différents de range et str ont en commun.

>>> dir(range)
['__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__',   
'__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__',   
'__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',   
'__repr__', '__reversed__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',   
'count', 'index', 'start', 'step', 'stop']  

>>> dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__',   
'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__',   
'__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', 
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', 
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 
'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map',
 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 
'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 
'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 
'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',
 'translate', 'upper', 'zfill']

查看这两个的共有属性

>>> set(dir(range)) & set(dir(str))
{'__hash__', '__eq__', '__contains__', '__iter__', '__getitem__', 'count', '__lt__', 
'__dir__', '__le__', '__subclasshook__', '__ge__', '__sizeof__', '__format__', '__len__', 
'__ne__', '__getattribute__', '__delattr__', '__reduce_ex__', '__gt__', '__reduce__', 
'__setattr__', '__doc__', '__class__', '__new__', '__repr__', '__init__', 'index', '__str__'}
Copier après la connexion

Nous nous concentrons sur l'attribut __iter__, tous deux ont cette fonction, si vous regardez d'autres objets qui peuvent être itérés à l'aide d'une boucle for, vous pouvez trouver cette méthode spéciale.
L'objet qui implémente cette méthode est appelé itérable.
Nous transmettons l'objet à la méthode iter() intégrée de Python, qui renverra un itérateur. La boucle for utilise ce modèle pour l'implémenter applicable à tous les objets.
Par exemple :

>>> iter([1, 2])
<list_iterator object at 0x000001A1141E0668>
>>> iter(range(0, 10))
<range_iterator object at 0x000001A1124C6BB0>
>>> iter("abc")
<str_iterator object at 0x000001A1141E0CF8>
>>>
iter函数返回的对象我们称之为iterator,iterator只需要做一件事,那就是调用next(iterator)方法,返回下一个元素。
Copier après la connexion

Par exemple :

>>> t = iter("abc")
>>> next(t)
&#39;a&#39;
>>> next(t)
&#39;b&#39;
>>> next(t)
&#39;c&#39;
>>> next(t)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
Copier après la connexion

Une exception sera levée lorsque l'itérateur n'a plus d'éléments à itérer.
Je donne donc ici les définitions d'itrable et d'itérateur.
iterable :
peut être passé à iter et renvoyer un objet itératot
iterator :
peut être passé à la fonction suivante et renvoyer un objet de l'élément itéré suivant, et lever une exception à la fin de l'itération.

Donc, pour l'exemple que vous avez mentionné, nous utilisons des itérateurs pour le redéfinir.

>>> t = iter(range(90, 0, -1))
>>> t
<range_iterator object at 0x000001A1124C6BB0>
>>> next(t)
90
>>> next(t)
89
>>> next(t)
88
Copier après la connexion

J'espère que vous gagnerez quelque chose en le lisant.

Pour plus d'articles sur [Python] le fonctionnement de la boucle for, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal