python 中生成器、迭代器、可迭代对象解析

python基础学习中,经常会提到迭代器、生成器、可迭代对象的概念,在日常的项目中,也会有很多的用处,面试中也经常会被问到,根据我所理解的,对这几个概念进行简单的介绍。(平时工作主要用到py3,以py3的用法为主进行介绍)

一、可迭代对象

什么是可迭代对象?简单的说就是能使用for进行循环遍历

也可以说可迭代对象满足以下条件:

1.能进行遍历,实现for循环

2.能通过__iter__() 方法,返回一个迭代器

3.能通过iter()函数,返回一个迭代器

如:列表,字符串,元组,字典就是可迭代对象

 

如何自定义一个可迭代对象?如果一个对象本身即是一个迭代器对象,又是一个可迭代对象,是没有办法迭代多次,为了解决这个问题,可以分别定义可迭代对象和迭代器对象。

Coding

class StudentList:

    “””自定义一个可迭代对象”””

    def __init__(self):

        self.items = list()

 

    def append(self,item):

        self.items.append(item)

 

    def __iter__(self):

        myIterator = MyIterator(self.items)

        return myIterator

 

class MyIterator:

    """自定义一个迭代器"""

    def __init__(selfitems):

        # 记录使用迭代器取值的数据对象

        self.items = items

        # 记录当前遍历索引的位置

        self.current_index = 0

 

    def __iter__(self):

        return self

 

    def __next__(self):

        if self.current_index < len(self.items):

            self.current_index += 1

            return self.items[self.current_index -1]

        else:

            raise StopIteration

 

a = StudentList()

a.append(1)

a.append(2)

a.append(3)

 

b = a.__iter__()

while True:

    try:

        print(b.__next__())

    except Exception as e:

        break

 结果:1 2 3   

列表本身可迭代,但是用类创建的对象不可迭代

    

二、迭代器

什么是迭代器?迭代器就是内部实现了__iter__()方法和__next__()方法

也可以说满足以下条件的就是一个迭代器:

1.可以通过可迭代对象的__iter__() 返回

2.实现 __next__()方法,获取下一个元素

3.没有访问的元素后,__next__()方法将抛出StopIteration异常,终止迭代器

 

三、for循环的本质

for i in [1,2,3]: ----->内部实现__iter__()方法,获取迭代器, itera = [1,2,3].__iter__()  ------> 通过__next__()方法获取下一个元素: itera.__next__() -------->  取出所有元素后自动捕获异常StopIterator,终止迭代

 

四、next()__next__()区别

1.py2中只能使用next()函数

py3next()函数和__next__()方法都可以使用

2. iter()__iter__()py2py3中都可以使用

    

五、生成器

生成器是一种特殊的迭代器,可以使用__next__()方法,取生成器中下一个值。

生成器可以通过函数和生成器表达式实现

1.生成器表达式:b = ( i for i in range(100))  b.__next__() 取出元素

2.函数实现:

def fibonacci (num):

a = 0

b = 1

current_index = 0

while current_index < num:

    result = a

    a,b = b,a+b

    current_index += 1

    # 遇见yield代码先把值返回,然后代码暂停,只有下一次启动生成器会再次在暂停的位置继续往下执行

yield result

 

f = fibonacci(6)

while True:

    try:

        re = next(f)

        print(re)

    except Exception as e:

        break

结果: 0 1 1 2 3 5

   

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值