可迭代对象和迭代器 | 学习笔记

简介: 快速学习可迭代对象和迭代器,介绍了可迭代对象和迭代器系统机制, 以及在实际应用过程中如何使用。

开发者学堂课程【Python 入门 2020年版可迭代对象和迭代器】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/639/detail/10421


可迭代对象和迭代器

 

具体内容:

(1)类别

有很多可迭代对象:list/tuple/dict/set/str/range/filter/map

for...in + 可迭代对象

(2)具体解析

写入:

class Demo(object):

pass

d = Demo()

for i in d :

print(i)

names = list( ‘zhang’,’lisi’)

列表可以写为 names = [‘zhang’,’lisi’],还可以写为 names = list( ‘zhang’,’lisi’),再写入另一种写法,

如下:

class Demo(object):

def_init_(self,x):

self.x = x

d = Demo(100)

names = list( ‘zhang’,’lisi’)

这时为创造了列表对象,里边放入元组类型的参数。Demo 也表示一个属于自己创建的类,list 则属于系统的类。

d 也表示实例对象,传递的参数为数字,而 names 传递的参数为元组类型的参数。

:a = int(‘123‘),此时 int 也表示为一个类,调用 init 方法,系统内置的类名都为小写,自己编写的类名为大写。

此时跟上:

for x in d:

print(x)

运行后出错,结果如下:

image.png

此时 Demo 对象不是可迭代对象。

跟上:

print(isinstance(d,Iterable))  

# isinstance:用来判断一个实例对象是否是有指定的类创建出来的

了解面向对象才能了解可迭代对象

运行后会报错,可以忽略不计。

如果要进行改正,则改正为:

from collections.abc import Iterable

再次运行则可修正错误,但此时 d 不是可迭代对象。

此时跟上:

names = [ ]

print (isinstance(names,Iterable))

再次运营后结果表示为 true。此时填入:

names = list(‘hello’)

进行操作,会找到一个方法:

def_iter_(self):

pass

进行添加后,False 则变为 True,表明从普通对象变为可迭代对象。只要重写了_iter_方法,就是一个可迭代对象。

d成为可迭代对象后则可进行 for..in 循环,进行运行后,

结果如下:

image.pngfor..in 循环的本质就是调用可迭代对象的_iter_方法,获取到这个方法的返回值,这个返回值是一个对象,然后在调用这个对象的_next_方法,报错的原因为 d 的_iter_方法找到结果,再调用_next_方法,但现在 d 的_iter_方法没有数据,返回的是一个空类型的数据。

跟上:

class Foo(object):

Pass

再返回:

f = Foo()

return f

此时不再是一个空对象,再进行运行,

报错结果如下:

image.png

报错原因为返回值需要是一个迭代器对象,同时也没有_next_方法。

则跟上:

class Foo(object):

def _next_(self):

return 1

再次运行后,开始循环不再报错。

所以 for..in 循环就是找到对象调用_iter_方法,取到返回值结果后再不断调用该对象的_next_方法,再取到返回值,也是可迭代对象的本质。

再简化如下:

class Demo(object):

def _init_(self,x):

self.x = x

def _iter_(self):   #只要重写了_iter_方法就是一个可迭代对象

return self

此时取到的返回结果则为本身,再进行运行,

报错结果为:

image.png

报错原因为取得返回结果后要调用_next_方法,但其中没有_next_方法,

此时跟上:

def_next_(self):

return ‘hello’

再次运行,开始无限循环。

每一次 for..in 都会调用一次_next_方法,获取返回值。将参数设置为10,跟上变量0,即:

self.count = 0

再跟上:

self.count += 1

if self.count < = self.x:

return ‘hello’

再进行运行,则结果为打印‘hello’次数为10次,但没有停止,

跟上:

else:

raise StopIteration   # 让迭代器停止

进行运行后,则运行10次后就停止。

再写入:

for i in range(10):

print(i)

运行后打印的是0~9

此时改为:

for i in Demo(10):

print(i)

如果想与系统类同,则将 return  hello’改为:

return self.count - 1

进行运行,则结果相同。

相关文章
|
Java Maven 索引
idea更新maven索引失败
idea更新maven索引失败
|
机器学习/深度学习
R语言自适应LASSO 多项式回归、二元逻辑回归和岭回归应用分析(下)
R语言自适应LASSO 多项式回归、二元逻辑回归和岭回归应用分析
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
681 1
|
关系型数据库 MySQL 数据库连接
Unity连接Mysql数据库 增 删 改 查
在 Unity 中连接 MySQL 数据库,需使用 MySQL Connector/NET 作为数据库连接驱动,通过提供服务器地址、端口、用户名和密码等信息建立 TCP/IP 连接。代码示例展示了如何创建连接对象并执行增删改查操作,确保数据交互的实现。测试代码中,通过 `MySqlConnection` 类连接数据库,并使用 `MySqlCommand` 执行 SQL 语句,实现数据的查询、插入、删除和更新功能。
|
开发者
如何画业务架构图
如何快速上手画业务架构图
12652 2
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之RDS和ADB的区别是什么
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
672 2
|
消息中间件 监控 Kafka
Filebeat+Kafka+Logstash+Elasticsearch+Kibana 构建日志分析系统
【8月更文挑战第13天】Filebeat+Kafka+Logstash+Elasticsearch+Kibana 构建日志分析系统
1359 3
|
Go 开发者
golang的http客户端封装
golang的http客户端封装
509 0
|
Ubuntu Shell Linux
Ubantu终端常用命令、快捷键和基本操作(系统性学习day2)
Ubantu终端常用命令、快捷键和基本操作(系统性学习day2)
|
开发者 Python
深入浅出Python协程:提高并发性能的利器
本文旨在深入探讨Python中的协程机制,一种轻量级的并发编程解决方案。与传统的多线程和多进程相比,协程提供了更高效的并发性能,尤其是在I/O密集型应用中。我们将从协程的基本概念入手,解析其工作原理,并通过实例讲解如何在Python中使用协程来优化程序性能。文章还将对比协程与其他并发模型的优缺点,帮助读者全面理解协程在现代软件开发中的应用价值。
345 3