目录
一,简介迭代对象
1.首先我们引入一个函数叫isintance()
isintence(要判断的对象,判断前面的的对象是否为该类型的成员)
我是这样理解的,就是判断前一个是不是后面的对象的成员,为什么这样说(python一切皆对象)
其返回的是true/flase 如果是就返回true,反之返回flase
代码演练:
# 首先我们要说isinstance是不需要导入的
print(isinstance(123, int))
# true
print(isinstance('123', str))
# true
这里我们介绍isinstance()函数的用法
2.然后我们引入一个可迭代对象的概念及(iterable:可遍历的)
我们应该知道遍历是什么意思,通俗的解释就是 挨个查看每个元素的经历的过程就叫遍历,可能有点空洞,我们下面用代码解释一下
代码演练:
# 遍历
for i in 'stdjhdajjs':
print(i)
'''
s
t
d
j
h
d
a
j
j
s
'''
# 没错,字符串是可以便利的,这样我们可以看出来其实就是挨个查看
# 一个 对象 的所包含的元素
那我们其实就可以看看字符串是不是iterable
判断方法如下:当然这个Iterable是需要导包的 from collections.abc import Iterable
代码演练:
# 1.导包
from colections.abc import Iterable
str = 'stdjhdajjs'
print(isinstance(str, Iterable))
# true
list = ['张三', '李四']
print(isinstance(list, Iterable))
# true
# 字典,元组也是可以的
a = 123
print(isinstance(a, Iterable))
# flase
for i in list:
print(i)
'''
'张三'
'李四'
'''
我们发现可迭代对象都是一些有成员的非原子的(及可以再分的),我们还发现其实可迭代对象都可以循环遍历,有这么多对象都可以迭代那其他对象可不可以呢??? 比如实例对象,类对象。。。,
总结:我们借助isinstance函数可以查看对象是否是可以迭代的,而可以迭代的对象是拥有可再分成员的对象(而exp:str),或者是有成员的的对象,(exp:list),有个共同点都可以用循环遍历
二.简介迭代器(iterator)
1.判断实例对象是否可以迭代
上面我们提到的是否实例对象可以迭代下面我们用代码演示一下,上面我们提到过可以迭代的对象就可以用循环遍历
代码演示:
class AAA(object):
def __init__(self):
self.lists = ['张三', '李四']
# 创建实例对象
aaa = AAA()
for i in aaa.lists:
print(i)
'''
'张三'
'李四'
'''
for i in aaa:
print(i)
# error
print(isintance(aaa, Iterable))
#flase
事实证明他们都不是,唉就这样结束了?
可曾听说过类的魔法方法O.o?
2.__iter__方法简介
通俗的将就是当你的类中定义了__iter__方法就会有神奇的事情发生(magic...)
# 1.导包
from collections.abc import Iterable
class AAA(object):
def __init__(self):
self.lists = ['李四', '张三']
def __iter__(self):
pass
# 创建实例对象
aaa = AAA()
print(isinstance(aaa, Iterable))
# true
print(isinstance(AAA, Iterable))
# false
for name in aaa:
print(name)
# TypeError: iter() returned non-iterator of type 'NoneType'
哇,成功了,实例对象竟然是可以迭代的,而类对象却不是,遗憾,可我们用循环去遍历的时候出现的错误,TypeError: iter() returned non-iterator of type 'NoneType'----->大致翻译为 iter()方法被返回了一个无类型的非迭代器,哦,天哪,它需要返回值O.o?而且还得是个迭代器
3.迭代器的引入
上面说到我们找到了实例对象可以拥有可迭代属性,通过一个方法,但方法选哟返回一个迭代器,迭代器顾名思义就是具有迭代属性以及迭代方法的功能强大的模块,我们重新创一个类,而这里又会提到一个魔法方法(magic)__next__
代码演示:
# 1.导包
from collections.abc import Iterable
from collections.abc import Iterator
class AAA(object):
def __init__(self):
self.lists = ['李四', '张三']
def __iter__(self):
return BBB() # 这里着重解说一下,这是直接返回类BBB创建的实例对象
class BBB(object):
def __iter__(self):
pass
def __next__(self):
pass
# 创建实例对象
aaa = AAA()
print(isinstance(aaa, Iterable))
# true
iterator = iter(aaa)
print(isinstance(iterator, Iterator))
# true
for name in aaa:
print(name)
'''
此处输出无数个none
'''
上面的代码中提到一个iter()函数,用来返回一个迭代器对象成功说明,该对象是个迭代器,解决了迭代器的问题,我们其实刚开始就有个需求,就是我们通过迭代实例对象,来打印出来‘张三’,‘李四’,可现在是none,是因为我们定义的next方法中没有定义返回值的方法
代码演示:
# 1.导包
from collections.abc import Iterable
from collections.abc import Iterator
class AAA(object):
def __init__(self):
self.lists = ['李四', '张三']
def __iter__(self):
return BBB(self.lists) # 这里着重解说一下,这是直接返回类BBB创建的实例对象
class BBB(object):
def __init__(self, names):
self.names = names
self.current_num = 0
def __iter__(self):
pass
def __next__(self):
if self.current_num <= len(self.names)
print(self.names[self.current_num])
self.current_num += 1
# 创建实例对象
aaa = AAA()
for name in aaa:
print(name)
'''
李四
张三
none
....
'''
最后的结果是输出完李四张三一直输出none,这各现象表明,我们的而迭代方法并没有结束信息返回,当我们迭代完了,应该抛出一个异常,而这个异常就是StopIteration异常,他会帮我们在迭代的对象结束后返回一个异常,使得for循环截至
代码演示:
# 1.导包
from collections.abc import Iterable
from collections.abc import Iterator
class AAA(object):
def __init__(self):
self.lists = ['李四', '张三']
def __iter__(self):
return BBB(self.lists) # 这里着重解说一下,这是直接返回类BBB创建的实例对象
class BBB(object):
def __init__(self, names):
self.names = names
self.current_num = 0
def __iter__(self):
pass
def __next__(self):
if self.current_num <= len(self.names)
print(self.names[self.current_num])
self.current_num += 1
else:
raise StopIteration
# 创建实例对象
aaa = AAA()
for name in aaa:
print(name)
'''
李四
张三
'''
结束发现是我们要答案,但是我们又发现这两个类有很多相同的方法,我们能不能把这简化为一个类,让他实现迭代器
代码演示:
# 1.导包
from collections.abc import Iterable
from collections.abc import Iterator
class AAA(object):
def __init__(self):
self.lists = ['李四', '张三']
self.current_num = 0
def __iter__(self):
return self # 这里就是要满足返回的对象有iter,next方法,索性直接返回自己
def __next__(self):
if self.current_num <= len(self.names):
print(self.names[self.current_num])
self.current_num += 1
else:
raise StopIteration
# 创建实例对象
aaa = AAA()
for name in aaa:
print(name)
'''
李四
张三
'''
结果一置,说明想法是对的,
三.总结
说到这里,迭代器就是一个包含特殊属性的类建立的实例对象,这个类中要包含__iter__来保证对象具有迭代属性的,而__next__方法是用来真
正实现循环中遍历时显示什么的方法,说到这里上面的提到魔法属性是有自己的调用规则的,不需要你专门去调用,就像创建实例对象时会自己调用__init__方法