python的迭代器和生成器

学习版本3.5.2

1.迭代器

在python中,很多对象都可以用for...in...语句来遍历里面的元素,这些对象被称为可迭代对象。例如:list, dict, string, set, generator...

迭代器对象是实现了对象的__iter__()和__next__()方法(在python2.x中是next()方法)的对象,其中__iter__()方法返回迭代器对象本身,__next__()返回容器的下一个元素,在结尾时发出StopIteration异常。

#学习版本3.5.2
#对于可迭代对象,可以使用iter()来获得迭代器对象

l = [1,2,3,4,5]
it = iter(l)
print(it)
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())

运行结果

<list_iterator object at 0x1013d8550>
1
2
3
4
5
Traceback (most recent call last):
  File "study.py", line 12, in <module>
    print(it.__next__())
StopIteration

自定义个迭代器

#学习版本3.5.2
#自定义迭代器,自定义一个类并实现__iter__()方法和__next__()方法

class myiter(object):
    def __init__(self):
        self.idx = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.idx += 1
        if self.idx > 3:
            raise StopIteration()
        return self.idx*2

if __name__ == "__main__":
    mi = myiter()
    print(mi)
    print(mi.__next__())
    print(mi.__next__())
    print(mi.__next__())
    print(mi.__next__())

运行结果

<__main__.myiter object at 0x1013d86d8>
2
4
6
Traceback (most recent call last):
  File "study.py", line 23, in <module>
    print(mi.__next__())
  File "study.py", line 14, in __next__
    raise StopIteration()
StopIteration

2.生成器

#学习版本3.5.2
'''生成器是一种特殊的迭代器,在调用生成器函数的时候,函数只返回了一个生成器对象>,并没有执行。当__next__()方法被调用的时候,生成器才开始执行,执行到yield语句处>停止,__next__()的返回值就是yield的参数;下一次运行__next__()时候从yield语句的下一句开始;如果后面没有yield语句了就抛出StopIteration异常'''

def myrange(n):
    print("myrange begin")
    i = 0
    while i < n :
        print("before yield")
        yield i
        print("after yield")
        i += 1
    print("myrange end")

if __name__ == "__main__":
    mr = myrange(5)
    print("="*20)
    print(mr.__next__())
    print("="*20)
    print(mr.__next__())
    print("="*20)
    print(mr.__next__())
    print("="*20)
    print(mr.__next__())
    print("="*20)
    print(mr.__next__())
    print("="*20)
    print(mr.__next__())

运行结果

====================
myrange begin
before yield
0
====================
after yield
before yield
1
====================
after yield
before yield
2
====================
after yield
before yield
3
====================
after yield
before yield
4
====================
after yield
myrange end
Traceback (most recent call last):
  File "study.py", line 27, in <module>
    print(mr.__next__())
StopIteration

生成器中的send()与stop()方法

send(None)的效果与__next__()是一样的

#学习版本3.5.2
'''生成器中的send()方法与close()方法:send(message)就是给前一个(yeild i)赋予了一>个返回值并且调用一次__next__(),当生成器还没运行第一个__next__()或者send(None)的
时候使用(send(message))就会报错;在调用了close()方法之后,调用send()与__next__()>方法都会报StopIteration异常'''

def myrange(n):
    print("myrange begin")
    i = 0
    while i < n :
        print("before yield")
        m = yield i
        print("after yield ", m)
        i += 1
    print("myrange end")

if __name__ == "__main__":
    mr = myrange(5)
    print("="*20)
    print(mr.send(None))
    print("="*20)
    print(mr.send("abc"))
    print("="*20)
    print(mr.__next__())
    print("="*20)
    print(mr.send("haha"))
    print("="*20)
    print(mr.__next__())
    print("="*20)

    mr1 = myrange(10)
    print(mr1.send("abc"))

运行结果

====================
myrange begin
before yield
0
====================
after yield  abc
before yield
1
====================
after yield  None
before yield
2
====================
after yield  haha
before yield
3
====================
after yield  None
before yield
4
====================
Traceback (most recent call last):
  File "study.py", line 29, in <module>
    print(mr1.send("abc"))
TypeError: can't send non-None value to a just-started generator

#学习版本3.5.2
'''生成器中的send()方法与close()方法,send(message)就是给前一个(yeild i)赋予了一>个返回值并且调用一次__next__(),当生成器还没运行第一个__next__()或者send(None)的
时候使用(send(message))就会报错'''

def myrange(n):
    print("myrange begin")
    i = 0
    while i < n :
        print("before yield")
        m = yield i
        print("after yield ", m)
        i += 1
    print("myrange end")

if __name__ == "__main__":
    mr = myrange(5)
    mr.close()
    mr.send(None)

运行结果

Traceback (most recent call last):
  File "study.py", line 17, in <module>
    mr.send(None)
StopIteration


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值