开发者学堂课程【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)
运行后出错,结果如下:
此时 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 循环,进行运行后,
结果如下:
for..in 循环的本质就是调用可迭代对象的_iter_方法,获取到这个方法的返回值,这个返回值是一个对象,然后在调用这个对象的_next_方法,报错的原因为 d 的_iter_方法找到结果,再调用_next_方法,但现在 d 的_iter_方法没有数据,返回的是一个空类型的数据。
跟上:
class Foo(object):
Pass
再返回:
f = Foo()
return f
此时不再是一个空对象,再进行运行,
报错结果如下:
报错原因为返回值需要是一个迭代器对象,同时也没有_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
此时取到的返回结果则为本身,再进行运行,
报错结果为:
报错原因为取得返回结果后要调用_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
进行运行,则结果相同。



