Last active
August 29, 2015 14:23
-
-
Save tawateer/96f755d1098e5ac4421b to your computer and use it in GitHub Desktop.
迭代器和生成器的理解.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#/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() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#/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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#/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