开发者学堂课程【Python 入门 2020年版:可迭代对象和迭代器】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10421
可迭代对象和迭代器
具体内容:
(1)类别
有很多可迭代对象:list/tuple/dict/set/str/range/filter/map
for...in + 可迭代对象
(2)具体解析
写入:
class
D
emo(
object):
pass
d
= Demo()
f
or i in d
:
print(i)
names
= list(
(
‘zhang’,’lisi’
)
)
列表可以写为 names
=
[
‘zhang’,’lisi’]
,还可以写为 n
ames = list( ‘zhang’,’lisi’)
,再写入另一种写法,
如下:
class
D
emo(
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
I
terable
再次运行则可修正错误,但此时 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
= F
oo(
)
return
f
此时不再是一个空对象,再进行运行,
报错结果如下:
报错原因为返回值需要是一个迭代器对象,同时也没有_next_方法。
则跟上:
class
F
oo
(object):
def _next_(self):
return 1
再次运行后,开始循环不再报错。
所以 for..in 循环就是找到对象调用_iter_方法,取到返回值结果后再不断调用该对象的_next_方法,再取到返回值,也是可迭代对象的本质。
再简化如下:
class
D
emo(
object):
def _init_(self,x):
self.x = x
d
ef _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
S
top
I
teration
#
让迭代器停止
进行运行后,则运行10次后就停止。
再写入:
for i
in
range
(10):
print(i)
运行后打印的是0~9。
此时改为:
for i
in D
emo
(10):
print(i)
如果想与系统类同,则将 return ‘ hello’改为:
return
self
.
count
- 1
进行运行,则结果相同。