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

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

开发者学堂课程【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

进行运行,则结果相同。

相关文章
|
2月前
|
存储 数据处理
什么是迭代,什么是可迭代对象
什么是迭代,什么是可迭代对象
30 1
|
9月前
|
设计模式 Java 数据库连接
手写自定义迭代器,秒懂迭代器底层原理
迭代器模式的UML类图如下图所示。
48 0
|
2月前
|
算法 程序员 C语言
【C++ 迭代器实现细节 】深入探索C++迭代器:从实现到整合
【C++ 迭代器实现细节 】深入探索C++迭代器:从实现到整合
80 0
|
2月前
|
并行计算 算法 安全
【C++ 迭代器 】C++ 迭代器标签的使用场景
【C++ 迭代器 】C++ 迭代器标签的使用场景
43 0
|
2月前
|
算法 数据处理 C语言
【C++迭代器深度解析】C++迭代器类型之间的继承关系与反向迭代器的独特性
【C++迭代器深度解析】C++迭代器类型之间的继承关系与反向迭代器的独特性
33 0
|
3月前
|
存储 编译器 C++
C++:迭代器的封装思想
C++:迭代器的封装思想
14 0
|
9月前
|
JavaScript 前端开发
如何把一个对象变成可迭代对象?
如何把一个对象变成可迭代对象?
|
7月前
|
C++
C++:模拟实现list及迭代器类模板优化方法
C++:模拟实现list及迭代器类模板优化方法
|
前端开发
前端学习案例5-迭代器和生成器5 原
前端学习案例5-迭代器和生成器5 原
51 0
前端学习案例5-迭代器和生成器5 原
|
JavaScript 前端开发 索引
带你手写一个对象,深入理解可迭代对象是什么,与类数组有什么区别
带你手写一个对象,深入理解可迭代对象是什么,与类数组有什么区别
142 0
带你手写一个对象,深入理解可迭代对象是什么,与类数组有什么区别