python中迭代器和生成器的简单介绍

# -*- coding: utf-8 -*-
"""
迭代器和生成器
迭代器:类型list、tuple、file、dict的对象有__iter__()方法,标志着它们能够迭代
用__iter__()方法生成迭代对象,然后用__next__()方法访问

生成器:是迭代器,__iter__()和next();针对大数据的时候,Python处理列表时,将全部数据都读入到内存,而
迭代器(生成器是迭代器)的优势就在于只将所需要的读入内存里,因此生成器解析式比列表解析式少占内存

一个简单的生成器my_generator = (x*x for x in range(4))


yield:生成器的标志,yield除了作为生成器的标志之外,还有一个功能就是返回值;作为生成器的函数,
由于有了yield,遇到它则程序挂起

yield和return的区别:return返回后,程序后面的语句不执行,yield返回后,程序挂起,再次调用__next__()时,继续执行后面的语句


"""

class MyIter:
    '''简单的range迭代器实现'''
    def __init__(self,n):
        self.i=0
        self.n=n
    def __iter__(self):
        '''__iter__()是类中的核心,它返回了迭代器本身,实现了__iter__()方法的对象,即意味着其可迭代'''
        print("调用__iter__()")
        return self
    def __next__(self):
        '''含有next()的对象就是迭代器,并且在这个方法中,在没有元素的时候要发起StopIteration()异常。'''
        print("调用__next__()")
        if self.i<self.n:
            i=self.i
            self.i=self.i+1
            return i
        else:
            raise StopIteration()
            

def gener():
    '''函数f()通过yield生成一个简单的迭代器'''
    yield 0
    yield 1
    yield 2


def R_return(n):
    '''return返回值测试,return后的语句不执行'''
    while(n>0):
        print("before return")
        return n
        n=n-1
        print("after return") 

def R_yield(n):
    '''yield返回值测试,yiled后的语句执行,每次通过__next__()获取函数值'''
    while(n>0):
        print("before yield")
        yield n
        n=n-1
        print("after yield") 
    else:
        raise StopIteration()



if __name__=="__main__":
    
    '''迭代器测试'''
    mi=MyIter(7)
    for i in mi:
        print(i)
    
    '''生成器测试'''
    a=gener() #含有yield关键词的函数是一个生成器类型的对象,这个生成器对象是可迭代的
    print(type(a)) #generator
    print(a.__next__())
    
    '''return ,yield返回测试'''
    
    R_return(3)
    for i in R_yield(3):
        print(i)

实验结果:

调用__iter__()
调用__next__()
0
调用__next__()
1
调用__next__()
2
调用__next__()
3
调用__next__()
4
调用__next__()
5
调用__next__()
6
调用__next__()
<class 'generator'>
0
before return
before yield
3
after yield
before yield
2
after yield
before yield
1
after yield
E:/学习/20181023-2.py:83: DeprecationWarning: generator 'R_yield' raised StopIteration
  for i in R_yield(3):

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值