python 迭代、可迭代对象、迭代器、for内部机制剖析、生成器

本文深入探讨了Python中的迭代概念,强调迭代器的使用以及可迭代对象和生成器的区别与联系。通过实例解析for循环的工作原理,指出迭代器如何通过__iter__()和__next__()方法实现元素的逐个获取。此外,文章还介绍了生成器的优势,如内存效率和惰性计算,并提供了生成器函数和生成器表达式的例子。最后,总结了可迭代对象、迭代器和生成器之间的关系,帮助读者理解这些核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 迭代

  第一,迭代需要重复进行某一操作

  第二,本次迭代的要依赖上一次的结果继续往下做,如果中途有任何停顿,都不能算是迭代.

2. 可迭代对象

除了整型之外,python内的基本数据类型都是可迭代对象,包括文件对象。

一个对象是否可迭代,关键看這个对象是否有__iter__()方法。

3. 迭代器

容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取。简单来说,就好比一个盒子,我们可以往里面存放数据,也可以从里面一个一个地取出数据。

在python中,属于容器类型地有:list,dict,set,str,tuple.....。容器仅仅只是用来存放数据的,我们平常看到的 l = [1,2,3,4]等等,好像我们可以直接从列表这个容器中取出元素,但事实上容器并不提供这种能力,而是可迭代对象赋予了容器这种能力。

迭代器与可迭代对象仅仅就是__next__()方法的有无。

4. for内部机制剖析

L = [1,2,3,4,5]是一个可迭代对象。而且可迭代对象是不可以直接从其中取到元素。那么为啥我们还能从列表L中取到元素呢?这一切都是因为for循环内部实现。在for循环内部,首先L会调用__iter__()方法,将列表L变为一个迭代器,然后这个迭代器再调用其__next__()方法,返回取到的第一个值,这个元素就被赋值给了i,接着就打印输出了。

l = [1,2,3,4,5,6]

item = l.__iter__()  # 将l变为迭代器
print(item.__next__())  # 迭代器调用next方法,并且返回取出的元素
print(item.__next__())
print(item.__next__())
print(item.__next__())
print(item.__next__())
print(item.__next__())
print(item.__next__())  # 报错
#######输出结果############# 
1 2 3 4 5 6

######上面为什么报错呢??##########
#当调用了最后一个next方法,没有下一个元素可取
#就会报错StopIteration异常错误。你可能会想会
#为什么for循环没有报错?答案很简单,因为for循
#环内部帮我们捕捉到了这个异常,一旦捕捉到异常
#说明,迭代应该结束了!
###########################

当我们试图用for循环来迭代一个可迭代对象时候,for循环在内部进行了两步操作:第一,将可迭代对象S变为迭代器M;第二,迭代器M调用__next__()方法,并且返回其取出的元素给变量i。

你可能看见过这种写法,for i in iter(M):xxx ,其实这一步操作和我们上面没什么区别。iter()函数,就是将一个可迭代对象M变为迭代器也就是M调用__iter__()方法,然后内部在调用__next__()方法。也就是说,

M = [1,2,3,4,5]

for i in iter(M):  # 等价于 M.__iter()__   人为显示调用
    print(i)

for i in M:  # 解释器隐式调用
    print(i)

#################
#
#上面输出的结果完全一样
#
#################

  还有next(M)等价于M.__next__。  

  迭代器优点:

    1.节约内存

    2.不依赖索引取值

    3.实现惰性计算(什么时候需要,在取值出来计算)

5.生成器(本质就是迭代器)

生成器就是迭代器。

Python有两种不同的方式提供生成器:

        1.生成器函数(函数内部有yield关键字):常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

        2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

生成器小结:

        1.是可迭代对象

        2.实现了延迟计算,省内存啊

        3.生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处,其余的可迭代对象可没有这点好处!

6.可迭代对象、迭代器、生成器关系总结

好文推荐:

详解生成器、迭代器 - 看雪。 - 博客园

Python进阶——迭代器和可迭代对象有什么区别? - 云+社区 - 腾讯云 

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

理心炼丹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值