1、可迭代对象

  1.1、可迭代对象概念

    可迭代对象,最直观的感觉就是可以使用for来循环迭代每一个元素。例如Python内置的类型:str、list、tuple、dict等类型的对象,都是可迭代对象。

    其实for循环迭代可迭代对象,是先调用可迭代对象的__iter__()方法,得到迭代器,然后再依次调用迭代器的__next__()方法获取元素的。

  1.2、可迭代对象的判断

    判断一个对象是不是“可迭代对象”,可以使用“collection.abc.Iterable”,即“isinstance(对象, Iterable)”来判断是否是可迭代对象,值是True则是可迭代对象,值是False则不是可迭代对象

  1.3、可迭代对象必须方法

      1.3.1、__iter__()

        a) 要使一个对象是可迭代对象,那么该对象必须要有__iter__()方法。但是只是有__iter__()方法,也不能保证能被for循环调用,只有当__iter__()方法返回一个迭代器的时候,才能被for循环迭代调用。总之,我们在__iter__()方法中,要保证返回一个迭代器,不然没什么意义。

        b) 如果没有__iter__()方法,那么就肯定不是可迭代对象,不过可能也能被for循环调用。

  1.4、可迭代对象的使用

    1.4.1、for中使用

      只要自定义的对象中有__iter__()方法,那么该对象就是可迭代对象,即使用“isinstance(自定义对象, Iterable)”就会返回True。

      可迭代对象不一定能直接被for循环调用迭代。只有自定义对象的__iter__()方法返回值是一个迭代器的时候,这个可迭代对象才能被for进行迭代调用。

      for循环调用可迭代对象的步骤:

        a) 调用可迭代对象的__iter__()方法,得到对应的迭代器

        b) 调用迭代器的__next__()方法,得到每一个元素,直到出现StopIteration异常抛出

    1.4.2、iter()函数使用

      可以使用“iter(可迭代对象)”来得到一个【迭代器】

  1.5、自定义可迭代对象示例

      我们在自定义可迭代对象的时候,最好继承Iterable接口,当然了,也可以不用继承


from collections.abc import Iterable, Iterator

class MyIterable:
def __init__(self, data: Iterable):
self.__data = data

def __iter__(self):
"""
必须提供该方法,并且该方法的返回值要是一个迭代器(生成器也属于迭代器)
"""
yield from self.__data

if __name__ == '__main__':
obj = MyIterable("abc")
print(obj)
print(iter(obj))
for _ in obj:
print(_)
 

2、迭代器

  2.1、迭代器概念

    迭代器是实际上能被for调用或者被list调用的对象。一般我们自定义的可迭代对象中的__iter__()方法,返回的就是迭代器。

    生成器也是一种迭代器。

  2.2、迭代器的判断

    判断一个对象是不是“迭代器对象”,可以使用“collection.abc.Iterator”,即“isinstance(对象, Iterator)”来判断是否是迭代器,值是True则是迭代器,值是False则不是迭代器。

  2.3、迭代器必须方法

      只要一个对象定义了__next__()和__iter__()方法,即使两个的方法体是空的,那么该对象也是迭代器。即“isinstance(对象, Iterator)”的返回值是True

    2.3.1、  __next__()

      迭代器的__next__()方法,返回迭代器的下一个元素

    2.3.2、 __iter__()

      迭代器的__iter__()方法,一般都是返回自己

  2.4、迭代器的使用

    2.4.1、for中使用

      for直接迭代迭代器,每次获取一个元素。

    2.4.2、next()函数使用

      next()函数调用迭代器,每次获取一个元素。

    2.4.3、list()函数使用

      list()函数调用迭代器,把迭代器中的所有元素都取出来,放在列表中。

  2.5、自定义迭代器示例

  

from collections.abc import Iterable, Iterator

# 可迭代对象
class MyIterable:
def __init__(self, data: Iterable):
self.__data = data def __iter__(self):
return MyIterator(self.__data) # 迭代器
class MyIterator:
def __init__(self, data: Iterable):
self.__data = data
self.__index = 0 def __iter__(self):
return self def __next__(self):
try:
value = self.__data[self.__index]
self.__index += 1
except IndexError:
raise StopIteration
return value if __name__ == '__main__':
obj = MyIterable("abc")
print(obj)
print(iter(obj))
for _ in obj:
print(_)

    输出:

<__main__.MyIterable object at 0x01F55110>
<__main__.MyIterator object at 0x01F50130>
a
b
c

3、可迭代对象和迭代器汇总

  3.1、图示

  

Python中的可迭代对象和迭代器的更多相关文章

  1. Python中的可迭代对象与迭代器对象

    刚刚学习Python,对“可迭代对象”和"迭代器对象"的个人理解,不知道对不对. 1.几个概念 (1)迭代工具:包括for循环.列表解析.in成员关系测试.....等等在内的,用于 ...

  2. Python中的可迭代对象,迭代器与生成器

    先来看一张概览图,关于容器(container).可迭代对象(Iterable).迭代器(iterator).生成器(generator). 一.容器(container) 容器就是一个用来存储多个元 ...

  3. Python中的可迭代对象

      Python中的可迭代对象有:列表.元组.字典.字符串:常结合for循环使用: 判断一个对象是不是可迭代对象: from collections import Iterable isinstanc ...

  4. Python中的可迭代对象/迭代器/For循环工作机制/生成器

    本文分成6个部分: 1.iterable iterator区别 2.iterable的工作机制 3.iterator的工作机制 4.for循环的工作机制 5.generator的原理 6.总结 1.i ...

  5. Python:容器、迭代对象、迭代器、生成器及yield关键字

            在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list, ...

  6. python函数之可迭代对象、迭代器的判断

    怎么判断一个对象是可迭代对象还是迭代器 例子 from collections import Iterable, Iterator lst = ['Today is Wednesday', 'Tomo ...

  7. python基础一 ------可迭代对象和迭代器对象

    可迭代对象和迭代器对象:前者生成后者 比喻:10个硬币都可以一一数(迭代),放入到存钱罐(可以取钱的那种),那这个存钱罐就是一个迭代器对象 需求:从网络抓取各个城市气温信息,并依次显示若依次抓取较多的 ...

  8. 【转】Python中自定义可迭代对象

    python 中内置的可迭代的对象有 list.tuple.set.dict 等,那么我们自己怎么定义一个可迭代的对象呢?先来段代码吧 import re import reprlib RE_WORD ...

  9. Python中的可迭代Iterable和迭代器Iterator

    目录 Iterable可迭代对象 如何判断对象是否是可迭代对象Iterable Iterator迭代器 如何判断对象是否迭代器Iterator 将Iterable转换成Iterator Iterabl ...

  10. python中可迭代对象、迭代器、生成器

    可迭代对象 关注公众号"轻松学编程"了解更多. 1.列表生成式 list = [result for x in range(m, n)] g1 = (i for i in rang ...

随机推荐

  1. CANoe学习笔记(四):UDS常用否定响应

    UDS中定义的否定响应代码常用的: ServiceNotSupported/服务不支持($11 ) 当诊断仪发送的请求消息中服务标识符无法识别或不支持时,ECU应发送该响应码 SubFunctionN ...

  2. Hive执行计划之只有map阶段SQL性能分析和解读

    目录 目录 概述 1.不带函数操作的select-from-where型简单SQL 1.1执行示例 1.2 运行逻辑分析 1.3 伪代码解释 2.带普通函数和运行操作符的普通型SQL执行计划解读 2. ...

  3. 如何在 Python 中实现遗传算法

    前言 遗传算法是一种模拟自然进化过程与机制来搜索最优解的方法,它由美国 John Holland 教授于20世纪70年代提出.遗传算法的主要思想来源于达尔文生物进化论和孟德尔的群体遗传学说,通过数学的 ...

  4. 发布一个Visual Studio 2022 插件,可以自动完成构造函数依赖注入代码

    赖注入(DI)在开发中既是常见的也是必需的技术.它帮助我们优化了代码结构,使得应用更加灵活.易于扩展,同时也降低了各个模块之间的耦合度,更容易进行单元测试,提高了编码效率和质量.不过,手动注入依赖项也 ...

  5. Sentieon实战:NGS肿瘤变异检测流程

    肿瘤基因突变检测是NGS的一个重要应用,其分析难点主要在于低频变异的准确性.不同于遗传病检测,肿瘤样本类型多样,测序方法和参数复杂,且缺乏对应各种场景的公共标准真集.再加上常用开源软件经常遇到的准确性 ...

  6. 2023-07-10:Kafka如何做到消息不丢失?

    2023-07-10:Kafka如何做到消息不丢失? 答案2023-07-10: Kafka采用多种机制来确保消息的不丢失,其中包括副本机制.ISR(In-Sync Replicas)机制以及ACK机 ...

  7. 即构SDK8月迭代:新增下行网络测速、切换房间、预览首帧回调等多项功能

    即构SDK8月上新,网络探测模块新增下行网络测速.媒体播放器新增缓存到文件结尾的回调.新增切换房间功能.新增预览首帧回调等.本月SDK迭代新上线的功能非常丰富,详细内容请看下文. LiveRoom 新 ...

  8. 运维自动化工具--Ansible

    运维自动化工具Ansible 1. ansible安装 rocky安装 需要先安装 enel源 # yum install -y epel-release 然后再安装ansible # yum ins ...

  9. 【MAUI Blazor踩坑日记】4.只在特定平台上引用包

    其实这个并不是MAUI特有的问题,只是在MAUI中可能会遇到. 例如某个包只在Windows上有用,但打包的时候,安卓.ios也会把这个包计算在内 所以需要在不是特定平台时把它排除. 万幸从微软文档找 ...

  10. 用python selenium提取网页中的所有<a>标签中的超级链接地址

    urls = driver.find_elements_by_xpath("//a") for url in urls: print(url.get_attribute(" ...