python yield
来源:互联网 发布:淘宝店铺怎么升级的 编辑:程序博客网 时间:2024/04/29 13:50
在Python中,for循环可以用于Python中的任何类型,包括列表、元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器
迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration。任何这类的对象在Python中都可以用for循环或其他遍历工具迭代,迭代工具内部会在每次迭代时调用next方法,并且捕捉StopIteration异常来确定何时离开。
使用迭代器一个显而易见的好处就是:每次只从对象中读取一条数据,不会造成内存的过大开销。
for line in open("t.txt"): print line
generator 在Python中与迭代器协议的概念联系在一起。yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。函数也许会有个return语句,但它的作用是用来yield产生值的。
不像一般的函数会生成值后退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效
以生成斐波那契数列为例:原版遍历巨大的list, 函数在运行中占用的内存会随着参数的增大而增大, 效率不好
def fib(n): i = 0 a, b = 0, 1 ll = [] while i < n: ll.append(b) a, b = b, a + b i += 1 return llfor e in fib(100): print e,
yield 版
def fib(n): i = 0 a, b = 0, 1 while i < n: yield b a, b = b, a + b n += 1
调用 fib(10) 不会执行 fib 函数,而是返回一个 iterable 对象! 在 for 循环执行时,每次循环都会执行 fib 函数内部的代码,执行到 yield b 时,fib 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
利用固定长度的缓冲区来不断读取文件内容:
def readfile(fpath): with open(fpath) as f: while True: buf = f.read(1024) if buf: yield buf else: returnfor i in readfile("about.html"): print i,
- python----yield
- Python yield
- python yield
- python yield
- python --yield
- Python yield
- Python -- yield
- python yield
- Python yield
- python yield
- Python yield
- python yield
- python --yield
- Python yield
- python yield
- Python yield
- Python - yield
- python yield
- 粒子滤波简介(转载)
- Unix聊天室案例 客户端+服务端
- wait, WIFEXITED, WEXITSTATUS
- LeetCode-Climbing Stairs
- 【NOI 2014】总结
- python yield
- TSQL 带参数的游标 表值类型+record + cursor 模仿 plsql %rowtype
- 《Programming in Lua 3》读书笔记(十六)
- ubuntu再次体验之【美化】--安装windows7字体库
- hdu 1070 milk
- uitableviewcell去掉多余分割线
- Linux下单表同步
- android:windowSoftInputMode属性详解
- 基于DASH的视频分片传输