学习版本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