Python yield 小结和实例


Posted in Python onApril 25, 2014

一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

yield 的好处:把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next() 的值,不仅代码简洁,而且执行流程异常清晰。

测试代码:
 

#!/usr/bin/env python
#-*- coding:utf8 -*-
def fab(max):
    """斐波那契?盗?""
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n += 1

def perm(items, n=None):
    """全排列"""
    if n is None:
        n = len(items)
    for i in range(len(items)):
        v = items[i:i+1]
        if n == 1:
            yield v
        else:
            rest = items[:i] + items[i+1:]
            for p in perm(rest, n-1):
                yield v + p
if __name__ == '__main__':
    for n in fab(5):
        print n
    print  "全排列:123"
    for n in perm("123"):
        print n
Python 相关文章推荐
在Django中管理Users和Permissions以及Groups的方法
Jul 23 Python
总结Python编程中函数的使用要点
Mar 20 Python
Python Socket使用实例
Dec 18 Python
Python中的TCP socket写法示例
May 11 Python
python爬取Ajax动态加载网页过程解析
Sep 05 Python
python爬虫中多线程的使用详解
Sep 23 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
Python使用ElementTree美化XML格式的操作
Mar 06 Python
在主流系统之上安装Pygame的方法
May 20 Python
Python OpenCV去除字母后面的杂线操作
Jul 05 Python
Python 在函数上添加包装器
Jul 28 Python
asyncio异步编程之Task对象详解
Mar 13 Python
python计数排序和基数排序算法实例
Apr 25 #Python
python处理圆角图片、圆形图片的例子
Apr 25 #Python
python实现的阳历转阴历(农历)算法
Apr 25 #Python
Python实现的简单万年历例子分享
Apr 25 #Python
python实现simhash算法实例
Apr 25 #Python
python实现DNS正向查询、反向查询的例子
Apr 25 #Python
python网络编程之TCP通信实例和socketserver框架使用例子
Apr 25 #Python
You might like
php smarty函数扩展
2010/03/15 PHP
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
2013/04/26 PHP
PHP iconv()函数字符编码转换的问题讲解
2019/03/22 PHP
Laravel框架控制器的request与response用法示例
2019/09/30 PHP
用Div仿showModalDialog模式菜单的效果的代码
2007/03/05 Javascript
js删除所有的cookie的代码
2010/11/25 Javascript
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
js防止页面被iframe调用的方法
2014/10/30 Javascript
使用JavaScript和C#中获得referer
2014/11/14 Javascript
javascript动态添加删除tabs标签的方法
2015/07/06 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
js和C# 时间日期格式转换的简单实例
2016/05/28 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
2016/08/25 Javascript
微信小程序 UI布局常用技巧整理总结
2016/12/05 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
HTML的select控件美化
2017/03/27 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
2017/06/02 jQuery
vue 2.0封装model组件的方法
2017/08/03 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
[01:07:22]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG加赛
2014/05/26 DOTA
[51:50]完美世界DOTA2联赛 Magma vs GXR 第一场 11.07
2020/11/10 DOTA
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
Python pip安装模块提示错误解决方案
2020/05/22 Python
阿迪达斯丹麦官网:adidas丹麦
2016/10/01 全球购物
数据库什么时候应该被重组
2012/11/02 面试题
给老婆道歉的话
2015/01/20 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
MySQL COUNT函数的使用与优化
2021/05/10 MySQL
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android