"""""" """ # 循环称之为编历 又称之为迭代 #代码:可以用遍历工具来实现访问容器中成员,成为迭代 #开发:产品的更新升级称为迭代 #可迭代对象 #表象:能被for循环的对象就是可迭代对象 #本质:底层拥有_iter_魔法方法的对象 #判断某个对象是否是某个类的实例 #isinstance 判断某个对象是否是某个类的实例 判断某个对象是否是可迭代对象 """
from collections.abc import Iterable
print(isinstance("afs", Iterable)) # True
print(isinstance([1, 5, 8], Iterable)) # True
print(isinstance((1, 5, 8), Iterable)) # True
print(isinstance({4, 5, 6}, Iterable)) # True
print(isinstance({4: 6, 5: 6}, Iterable)) # True
print(isinstance(158, Iterable)) # False
print(isinstance(15.8, Iterable)) # False
# 用类创建一个列表,给列表增加数据
class Mylist(object):
# 在_init_方法里创建实例属性
def __init__(self):
self.list1 = []
def add(self, data):
self.list1.append(data)
def __iter__(self): # 本质:底层拥有_iter_魔法方法的对象
pass
# 创建对象 对象名=类名()
mylist = Mylist()
# 实例对象调用实例方法 对象名.方法名()
mylist.add("马可波罗")
mylist.add("暗猎游侠")
mylist.add("激情绿茵")
# 实例对象访问实例属性 print(对象名.属性名)
print(mylist.list1)
# 判断对象是否是可迭代对象
# 导包
from collections.abc import Iterable
print(isinstance(mylist, Iterable)) # True
# 获取可迭代对象中的元素
for i in mylist:
print(i)
# 保留报错 TypeError: iter() returned non-iterator of type 'NoneType'
""" 迭代器的本质 底层拥有__iter__和__next__方法 迭代器的功能 1.通过迭代器来获取可迭代对象中的数据 2.记录当前迭代位置 3.当迭代完成想要再一次获取数据抛出异常"""
"""分开 """
# 创建可迭代对象
class Mylist(object):
# 在__init__初始化方法中存放实例属性
def __init__(self):
self.list1 = []
# 给列表增加数据 列表名.append(数据)
def add(self, data):
self.list1.append(data)
def __iter__(self):
# 想要获取数据的时候发现报错
# 报iter没有返回迭代器的错
return MyItertor(self)
# 自定义一个迭代器进行迭代
class MyItertor(object):
"""自定义一个迭代器,供上面的可迭代对象使用"""
def __init__(self, lst):
# 记录当前位置
self.current = 0
# 获取可迭代对象
self.lst = lst
def __iter__(self):
# 返回迭代器,而当前类本身就是一个迭代器,所以在这里返回自己本身就可以了
return self
def __next__(self):
# 进行迭代取值
# 判断是否有下一个数据
if self.current < len(self.lst.list1):
# 如果有下一个数据 直接获取
# 获取当前数据 用索引获取 列表[索引]
item = self.lst.list1[self.current]
# 将当前位置往后移一位
self.current += 1
# 返回获取到的数据
return item
# 如果没有下一个数据 抛出异常
else:
# 程序员主动触发停止迭代的异常
raise StopIteration
# 创建对象 对象名 = 类名()
mylist = Mylist()
# 实例对象调用实例方法 对象名.方法名()
mylist.add("马可波罗")
mylist.add("激情绿茵")
mylist.add("暗夜游侠")
# 获取可迭代对象中的数据的三种方式
# for循环获取
for i in mylist:
print(i)
# list强转 就是list()进行数据类型转换 将可迭代对象中的数据放在列表中进行展示
print(list(mylist))
# tuple强转 就是tuple()进行数据类型转换 将可迭代对象中的数据放在元组里进行展示
print(tuple(mylist))
"""合并"""
# 创建可迭代对象
class Mylist(object):
def __init__(self): # 在__init__初始化方法中存放实例属性
self.list1 = [] # 获取可迭代对象
self.dangqian = 0 # 记录当前位置
def add(self, data):
self.list1.append(data) # 给列表增加数据 列表名.append(数据)
def __iter__(self):
return self # 想要获取数据的时候发现报错 报iter没有返回迭代器的错
def __next__(self):
if self.dangqian < len(self.list1): # 进行迭代取值判断是否有下一个数据
# 如果有下一个数据 直接获取
xiabiao = self.list1[self.dangqian] # 获取当前数据 用索引获取 列表[索引]
self.dangqian += 1 # 将当前位置往后移一位
return xiabiao # 返回获取到的数据
else: # 如果没有下一个数据 抛出异常
raise StopIteration # 程序员主动触发停止迭代的异常
a = Mylist()
a.add("你好1")
a.add("你好2")
a.add("你好3")
print(list(a)) # list 强转 列表
# print(tuple(a)) # tuple 强转 元祖
# for i in a: # for循环 输出
# print(i)
迭代器实现斐波那契
class My():
def __init__(self, x):
self.a = 0
self.b = 1
self.x = x
self.c = 0
def __iter__(self):
return self
def __next__(self):
if self.c < self.x:
self.a, self.b = self.b, self.a + self.b
self.c += 1
return self.a
else:
raise StopIteration
my = My(10)
print(list(my))