python 中的 yield

最近由于某些原因,最近公司的技术栈新增了python,然后最近在研究tornado的时候在yield的理解上卡了壳,记录下笔记。

yield 做迭代器

关于 yield 在stackoverflow 搜到的大多数都是关于他用于迭代器的例子,比如这个的中文版

下面也举一个迭代器的例子,获取数据库的数据,使用的是 mysql-connector-python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

def _execute(self, sql_query, values=[]):
logger.debug('<sql: %s>', sql_query)
self.dbcur.execute(sql_query, values)
return self.dbcur

def _select2dic(self, sql, values=[]):
cur = self._execute(sql, values)
fields = [f[0] for f in cur.description]
for row in cur:
yield dict(zip(fields, [tostr(x) for x in row]))

print(db._select2dic("select * from test.tt"))
>> <generator object _select2dic at 0x104f44b40>

print(list(db._select2dic("select * from test.tt")))
>> [{'val': 'a', 'id': 1}, {'val': 'bb', 'id': 2}, {'val': 'ccc我', 'id': 3}, {'val': 'd时代', 'id': 4}]

yield 做异步回调

yield 可以在 用send 做为发送数据

```

reference

http://dongweiming.github.io/Expert-Python/#22

http://segmentfault.com/a/1190000000426460

http://stackoverflow.com/a/21541902/2264912

http://stackoverflow.com/a/14554322/2264912

avatar

lelouchcr's blog