资讯专栏INFORMATION COLUMN

[Python] for循环是怎样工作的?

myeveryheart / 1025人阅读

摘要:我们把对象传给内置的方法,会返回一个迭代器,循环就是使用这个模式来实现适用于所有的对象。举例当迭代器再没有元素可以迭代时会引发一个异常。因此,对于你提的例子我们使用迭代器来重新定义一下。

如果你从迭代层面来理解的话可能对于for的工作原理会有更深的理解。
首先我们来使用dir查看一下对于range、str这两个的不一样的类型有什么共同点。

>>> 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__"}

我们关注__iter__属性,他们两个都有这个函数,如果你查看其他可以使用for循环迭代的对象,你都可以发现这个特殊方法。
实现了这个方法的对象我们称之为iterable。
我们把对象传给Python内置的iter()方法,会返回一个迭代器,for循环就是使用这个模式来实现适用于所有的对象。
比如:

>>> iter([1, 2])

>>> iter(range(0, 10))

>>> iter("abc")

>>>
iter函数返回的对象我们称之为iterator,iterator只需要做一件事,那就是调用next(iterator)方法,返回下一个元素。

举例:

>>> t = iter("abc")
>>> next(t)
"a"
>>> next(t)
"b"
>>> next(t)
"c"
>>> next(t)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration

当迭代器再没有元素可以迭代时会引发一个异常。
那么在这里我给出itrable和iterator的定义。
iterable:
可以传给iter并返回一个iteratot的对象
iterator:
可以传给next函数并返回下一个迭代元素的对象,并在迭代结束引发一个异常。

因此,对于你提的例子我们使用迭代器来重新定义一下。

>>> t = iter(range(90, 0, -1))
>>> t

>>> next(t)
90
>>> next(t)
89
>>> next(t)
88

希望看完有所收获。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38432.html

相关文章

  • 独家 | 6种让Python程序变慢坏习惯

    摘要:假设我们需要在程序中计算一些数字的平方根。此外如果我们需要在程序中多次使用平方根函数,代码将会更整洁。然而在这个虚构的例子中,只有的年龄超过岁。然后检查这三个人的年龄是否满足第二个条件。 作者: Christopher Tao翻译:王可汗校对:王雨桐本文约1800字,建议阅读5分钟本文...

    xcc3641 评论0 收藏0
  • 可迭代对象和迭代器

    摘要:对于迭代器来说,返回的是它自身,则是返回迭代器中的下一个值,如果没有值了则抛出一个的异常。有一点绕,我们再来理一理迭代器和可迭代这两个的差别一个迭代器一定是可迭代对象,因为它一定有方法。而可迭代对象的方法通常会生成一个新的迭代器对象。 for 循环 是我们在 Python 里非常常用的一个语法,但你有没有思考过 for 循环是怎样实现的? 如果你以前接触过 C++,应该会知道类似 fo...

    Kaede 评论0 收藏0
  • python入门正确姿势,从一无所知到无所不知

    摘要:不同的人的路线图版本会有所不同。寻找答案从一无所知到无所不知如果你在这个过程中多次遇到困难,在知难而退之前努力尝试解决问题。并不是成为一个全面的开发人员所需要的唯一技能。首先进行一两个月的学习阶段,然后进入一个月的构建阶段。 初级开发者学Python容易陷入茫然,面对市面上种类众多的编程语言和框架,重要的是坚持自己的选择,宜精不宜杂。本文是一篇指路文,概述了从编程基础、引导、文档阅读、...

    legendmohe 评论0 收藏0
  • python入门正确姿势,要永远做个学习者,但不仅仅只做学习者!

    摘要:总之,要永远做个学习者,但不仅仅只做学习者了解并践行学习实践阶段循环任何创造性学科的学习都可以分两个阶段,学习阶段和构建阶段,彼此不断重复。 初级开发者学Python容易陷入茫然,面对市面上种类众多的编程语言和框架,重要的是坚持自己的选择,宜精不宜杂。本文是一篇指路文,概述了从编程基础、引导、文档阅读、书籍和视频、源代码等学习和积累环节,值得初学者参考。 作为一个开发者,为何要选择Py...

    MarvinZhang 评论0 收藏0
  • [译]Python面试中8个必考问题

    摘要:因此,当任何由返回的函数被调用时,的值将在附近的范围进行查找。下面是解决这一问题的一些方法。另外一个解决方案就是创造一个闭包,利用默认函数立即绑定。当缺失时,执行类,字典的实例将自动实例化这个数列。 1、下面这段代码的输出结果是什么?请解释。 def extendList(val, list=[]): list.append(val) return list list...

    warmcheng 评论0 收藏0

发表评论

0条评论

myeveryheart

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<