Skip to content

Instantly share code, notes, and snippets.

@tawateer
Last active August 29, 2015 14:23
Show Gist options
  • Save tawateer/96f755d1098e5ac4421b to your computer and use it in GitHub Desktop.
Save tawateer/96f755d1098e5ac4421b to your computer and use it in GitHub Desktop.
迭代器和生成器的理解.
#!/bin/env python
#-*- coding: utf-8 -*-
"""
包含 yield 指令的函数执行的时候就是一个生成器, 其实一个协程对象,
启动后执行到 yield 指令后返回 yield 后的内容, 然后让出, 等待下一次执行.
"""
def create_generator():
mylist = range(3)
for i in mylist:
yield i * i
mygenerator = create_generator()
print type(mygenerator) # 生成器类型.
print mygenerator.next()
mygenerator = create_generator()
for i in mygenerator:
print i
#/bin/env python
#-*- coding: utf-8 -*-
def coroutine():
print "coroutine stating"
result = None
while 1:
s = yield result
result = str(s) * 2
c = coroutine()
print type(c) # 生成器类型.
#print c.send(None) # 使用 send(None) 或者 next() 启动协程.
print c.next()
print c.send("a") # 向协程发送消息, 使其恢复执行.
# c.throw(Exception("exception")) # 可以使用 throw 引发异常.
c.close()
#/bin/env python
#-*- coding: utf-8 -*-
"""
In [85]: iter([1, 2])
Out[85]: <listiterator at 0x107d8afd0>
In [86]: iter((1, 2))
Out[86]: <tupleiterator at 0x107d8ad90>
In [90]: (x for x in [1, 2])
Out[90]: <generator object <genexpr> at 0x107dd41e0>
"""
class Data(object):
def __init__(self, *args):
self._data = list(args)
def __iter__(self): # __iter__ 会被特殊处理, 自动生成生成器.
for i in self._data:
yield i
d = Data(1, 2, 3)
for i in d:
print i
# 删除 Data 类, 进入下一个测试.
del Data
print "#" * 20
class Data(object):
def __init__(self, *args):
self._data = list(args)
def _not_iter(self):
for i in self._data:
yield i
d = Data(1, 2, 3)
for i in d._not_iter(): # 如果不加()会报错, 也就是执行的时候生成生成器.
print i
#/bin/env python
#-*- coding: utf-8 -*-
"""
list 已经可以被 for 处理, 为什么要用迭代器, 因为迭代器元素不能被修改, list 是可以的.
注意 range 会返回一个 list, 而如果用 xrange 不会返回 list, 而是 xrange 对象.
另外, list 和 xrange 没有 next 方法, 而迭代器有.
"""
x = range(3)
for i in x:
print i
x[-1] = 10
x = iter(range(3))
for i in x:
print i
# x[-1] = 10 # 无法修改, 异常.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment