Python迭代器:

""""""
"""
# 循环称之为编历 又称之为迭代
#代码:可以用遍历工具来实现访问容器中成员,成为迭代
#开发:产品的更新升级称为迭代

#可迭代对象
#表象:能被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))

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值