Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5017430
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Python/Ruby

2012-04-10 18:27:36

用法说明:

yield 简单说来就是一个生成器生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

  • 生成器 是 一个函数

函数的所有参数都会保留

  • 第二次调用 此函数 时

使用的参数是前一次保留下的.

  • 生成器还“记住”了它在流控制构造

生成器不仅“记住”了它数据状态。 生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。由于连续性使您在执行框架间任意跳转,而不总是返回到直接调用者的上下文(如同生成器那样),因此它仍是比较一般的。

当你问生成器要一个数时,生成器会执行,直至出现 yield 语句,生成器把 yield 的参数给你,之后生成器就不会往下继续运行。当你问他要下一个数时,他会从上次的状态开始运行,直至出现yield语句,把参数给你,之后停下。如此反复直至退出函数。


 

  1. #生成全排列
  2. def perm(items, n=None):
  3.     if n is None:
  4.         n = len(items)
  5.     for i in range(len(items)):
  6.         v = items[i:i+1]
  7.         if n == 1:
  8.             yield v
  9.         else:
  10.             rest = items[:i] + items[i+1:]
  11.             for p in perm(rest, n-1):
  12.                 yield v + p

  13. #生成组合
  14. def comb(items, n=None):
  15.     if n is None:
  16.         n = len(items)
  17.     for i in range(len(items)):
  18.         v = items[i:i+1]
  19.         if n == 1:
  20.             yield v
  21.         else:
  22.             rest = items[i+1:]
  23.             for c in comb(rest, n-1):
  24.                 yield v + c

  25. a = perm('abc')
  26. for b in a:
  27.     print b
  28.     break
  29. print '-'*20
  30. for b in a:
  31.     print b


 

结果如下:


 

  1. 102 pvopf006 ~/test> ./generator.py
  2. abc
  3. --------------------
  4. acb
  5. bac
  6. bca
  7. cab
  8. cba

可以看到,在第一个循环break后,生成器没有继续执行,而第二个循环接着第一个循环执行


 

阅读(804) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~