迭代器
一、协程
1、协程是Python语言独有的一种多任务方式。
2、使用gevent模块实现协程。
3、协程的实现过程(步骤)
迭代器
生成器
yield
greenlet
gevent
二、迭代器
1、迭代的定义: 在原有的基础之上添加新的功能。
2、迭代对象的定义:即一个对象中有包含了【__iter__】的方法。
3、迭代器的定义:
即:一个对象中既包含了【__iter__】方法,又包含了【__next__】方法
通过它可以用来节省内存空间,并且能够知道将来生成数据的方式。
4、判断一个数据类型是否可以迭代:
说明:
a、通过【isinstance】语句用于判断一个对象是否由一个类创建的。
返回一个布尔值:是则返回True,不是则返回False。
语法:
isinstance(对象, 类)
# True:属于
# False:不属于
b、判断这个数据类型对象是否是属于【Iterable】类的子类。
语法:
from collections import Iterable
isinstance(迭代对象, Iterable)
# True:属于
# False:不属于
c、示例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from collections import Iterable
# 1. 判断列表
list_ret = isinstance([1, 2, 3], Iterable)
print(f"列表:{list_ret}")
# 2. 判断元组
list_ret = isinstance((1, 2, 3), Iterable)
print(f"元组:{list_ret}")
# 3. 判断字符串
list_ret = isinstance("huangwei", Iterable)
print(f"字符串:{list_ret}")
# 4. 判断数字
list_ret = isinstance(100, Iterable)
print(f"数字:{list_ret}")
运行结果:
列表:True
元组:True
字符串:True
数字:False
4、可迭代对象
a、成为可迭代对象的条件:类中必须要有【__iter__】方法。
要求:自定义一个可迭代对象
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from collections import Iterable
class Demo(object):
def __init__(self):
self.names = list()
def add(self, name):
self.names.append(name)
obj = Demo()
obj.add(100)
obj.add(200)
obj.add(300)
print(f"判断obj对象是否为可迭代对象:{isinstance(classmate, Iterable)}")
运行结果:判断obj对象是否为可迭代对象:False
可迭代对象示例代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from collections import Iterable
class Demo(object):
def __init__(self):
self.names = list()
def add(self, name):
self.names.append(name)
def __iter__(self):
pass
obj = Demo()
obj.add(100)
obj.add(200)
obj.add(300)
print(f"判断obj对象是否为可迭代对象:{isinstance(classmate, Iterable)}")
运行结果:判断obj对象是否为可迭代对象:True
5、使用for循环的条件
a、判断一个对象可以使用for循环的条件
b、for循环的执行原理:
1、被循环的对象是否可以迭代,即:类中必须有【__iter__】方法
2、在【__iter__】方法中必须要返回一个引用:迭代器。
即:该迭代器中必须具有【__iter__方法】和【__next__方法】。
3、迭代器中必须包含【__iter__】方法和【__next__】方法。
4、通过这个迭代器的引用,for循环将调用该引用中的【__next__】的返回值。
即:使用【for 变量 in 可迭代对象】语句时,
打印变量的值得到的是迭代器中【__next__】方法的返回值。
c 、演示:
示例1:创建一个可以被for循环遍历的类。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Demo(object):
def __init__(self):
self.names = list()
def add(self, name):
self.names.append(name)
def __iter__(self):
return ClassIterator() # 返回一个迭代器
class ClassIterator(object):
def __iter__(self):
pass
def __next__(self):
pass
obj = Demo()
# 通过iter函数可查看obj对象的__iter__方法的返回值。
print(iter(obj))
运行结果:
示例2:查看一个对象是否为迭代器,并通过【next】方法取到可迭代对象中的值。
运行结果:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from collections import Iterator
class Demo(object):
def __init__(self):
self.names = list()
def add(self, name):
self.names.append(name)
def __iter__(self):
return ClassIterator()
class ClassIterator(object):
def __iter__(self):
pass
def __next__(self):
return 100
obj = Demo()
demo_iterator = iter(obj)
# 1. 判断obj对象是否为可迭代对象
print(f"obj对象是否为可迭代对象:{isinstance(demo_iterator, Iterable)}")
# 2. 判断demo_iterator对象是否为迭代器
print(f"demo_iterator对象是否为迭代器:{isinstance(demo_iterator, Iterator)}")
# 3. 通过next方法取值
print(next(demo_iterator))