Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4450446
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: Python/Ruby

2011-01-03 00:29:42


排列的思想就是把一个大一点的列表拆开,然后组成小一点的列表。

itertools.permutations() itertools.combinations()

yield 生成器的运行机制

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

例子:Python 排列,组合生成器
#生成全排列
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

#生成组合
def comb(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+1:]
            for c in comb(rest, n-1):
                yield v + c

a = perm('abc')
for b in a:
    print b
    break
print '-'*20
for b in a:
    print b

结果如下:

102 pvopf006 ~/test> ./generator.py
 abc
 --------------------
 acb bac bca cab cba

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



yield 生成器的基本使用剖析:http://blog.donews.com/limodou/archive/2006/09/04/1028747.aspx

yield 生成器的迭代器用法剖析:http://lukejin.javaeye.com/blog/587051

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