|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
最近看书看到一个生成器的例子。实在看不懂。求大神帮忙分析一下其中yield生成器的用法:
题目:皇后问题,皇后不能再同一列,也不能是对角线。求出所有可能的情况
代码:
def conflict(state,nextx):
nexty=len(state)
for i in range(nexty):
if abs(state-nextx) in (0,nexty-i):
return True
return False
def queen(num=8,state=()):
for pos in range(num):
if not conflict(state, pos):
if len(state) == num - 1:
yield (pos,)
else:
for result in queen(num, state + (pos,)):
yield (pos,) + result
print list(queen(4))
求问:为什么可以直接用yield生成,yield生成的到底是什么?
关于生成器的概念, 可参见: http://www.liaoxuefeng.com/wiki/ ... abc8424e12b5fb27000
在形式上是把return换成了yield。但有很大不同:
return是到此就结束程序,并返回值。
yield是到此将函数挂起,并返回迭代器对象,再次运行函数则从挂起处之后继续运行。
举个简单的例子:
- >>> def y(): #这是生成自然数序列的函数
- n = 1
- while n < 11:
- yield n
- n += 1
-
- >>> y() #直接引用无法得到结果,它只是一个生成器
- <generator object y at 0x01580420>
- >>> list(y())#将其转换成列表就可以了,range也是这个意思
- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- >>> for i in y():#更方便的是用for遍历
- print(i)
-
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
复制代码
|
|