12.python 可迭代对象,迭代器,生成器之间的关联和区别

python 可迭代对象,迭代器,生成器之间的关联和区别

在这里插入图片描述

‘’’
1.可迭代对象包含迭代器,生成器,以及序列,字典等可遍历的类型数据
2.如果一个对象拥有__iter__方法,就是可迭代对象,如果需要定义一个可迭代方法必须要有:iter
3.如果一个对象拥有next方法,就是迭代器,如果需要顶一个迭代器必须要有: iter,next
4.迭代器,可迭代对象是一个对象,而生成器是一个函数
5.生成器是一种特殊的迭代器,底层其实也是实现了__iter__,next魔术方法,主要是调用的生成器类generator创建的对象
6.如果函数中带有【yield】关键字,那这个函数其实就是生成器
7.除了迭代器生成器可以使用next方法,可迭代对象(序列,字典)无法使用next方法
‘’’

可迭代对象(str,list,tuple…)

'''
常见的可迭代对象可以使用for x in ...的循环方法
可迭代对象list,str,tuple,dict 等方法不能使用next()方法进行读取数据
'''
from collections.abc import *
list1 = [1,2,3]
print(isinstance(list1,Iterable)) #返回为True则是可迭代对象,返回为False则不是可迭代对象
print(isinstance(list1,Iterator)) #返回为True则是迭代器,返回为False则不是迭代器

for ins in list1:
    print(ins)
True
False
1
2
3

迭代器

迭代器的创建和转换
#转换为迭代器可以使用iter()方法,该方法可以创建一个迭代器
#迭代器可以使用next方法也可以使用for进行循环遍历
#如果一个对象拥有next方法,就是迭代器,如果需要顶一个迭代器必须要有: __iter__,next
from collections.abc import *
list1 = [1,2,3]
iter_list = iter(list1)
print(type(iter_list))
print(isinstance(list1,Iterable)) #返回为True则是可迭代对象,返回为False则不是可迭代对象
print(isinstance(list1,Iterator)) #返回为True则是迭代器,返回为False则不是迭代器
for ins in iter_list: #
    print(ins)

#使用next进行遍历数据
list2 = [1,2,3]
iter_list = iter(list1)
next(iter_list)
next(iter_list)
next(iter_list)
next(iter_list)# 当遍历超出边界的时候则会抛出StopIteration异常
<class 'list_iterator'>
True
False
1
2
3
Traceback (most recent call last):
  File "D:/lvt_data/test8.py", line 109, in <module>
    print(next(iter_list))
StopIteration
自定义迭代器
'''
自定义迭代器包含了__iter__ 和 __next__方法
__iter__则返回self,
__next__返回下一个结果,如果没有结果则返回StopIteration异常
'''
from collections.abc import *
class A:

    def __init__(self,number):
        self.number = number
        self.init_number = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.init_number += 1
        if self.number< self.init_number:
            raise StopIteration

        return self.init_number

a = A(4)

print(dir(a))#使用dir方法可以知道当前实例a包含了__next__和__iter__方法

print(isinstance(a,Iterable))
print(isinstance(a,Iterator))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))# 当遍历超出边界的时候则会抛出StopIteration异常
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'init_number', 'number']
True
True
1
2
3
4
Traceback (most recent call last):
  File "D:/lvt_data/test8.py", line 109, in <module>
    print(next(a))
StopIteration

生成器

‘’’
1.生成器是一种特殊的迭代器,是属于迭代器的一种类型,相对于迭代器来说,他在底层实现了__iter__ 和 next方法
使代码不用自己手动创建,使用起来更加灵活和简便,
2.并且生成器在迭代过程中可以修改当前迭代的值,而普通迭代器修改太当前迭代的值会出现异常,导致程序无法继续执行
3.生成器继承了generator类方法
‘’’

使用()方法创建生成器
x = (x for x in [1,2,3])
print(type(x))

print(dir(x)) #该x对象下面也包含了__next__和__iter__方法。可见生成器是一种特殊的迭代器

print(next(x))
print(next(x))
print(next(x))
print(next(x))
print(next(x))
#next(a)#当遍历到超出边界的时候则会抛出StopIteration异常
<class 'generator'>
['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']
1
2
3
Traceback (most recent call last):
  File "D:/lvt_data/test8.py", line 109, in <module>
    print(next(x))
StopIteration
使用函数带yield方法创建生成器
print('*'*40)
def A_generator(number):
   i = 0
   while  i<number:
           yield i
           i += 1
   return None


a  = A_generator(0)
print(dir(x)) #该x对象下面也包含了__next__和__iter__方法。可见生成器是一种特殊的迭代器
print(isinstance(a,Iterable)) #返回为True则是可迭代对象,返回为False则不是可迭代对象
print(isinstance(a,Iterator)) #返回为True则是迭代器,返回为False则不是迭代器
for ins in A_generator(4):
    print(ins)
['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']
True
True
0
1
2
3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的蜗牛—平静从我开始

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值