鱼C论坛

 找回密码
 立即注册
查看: 2397|回复: 4

[已解决]生成器 yield 的用法求助

[复制链接]
发表于 2016-10-26 15:36:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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生成的到底是什么?
最佳答案
2016-10-27 09:34:15
关于生成器的概念, 可参见:http://www.liaoxuefeng.com/wiki/ ... abc8424e12b5fb27000

在形式上是把return换成了yield。但有很大不同:
return是到此就结束程序,并返回值。
yield是到此将函数挂起,并返回迭代器对象,再次运行函数则从挂起处之后继续运行。
举个简单的例子:
  1. >>> def y(): #这是生成自然数序列的函数
  2.         n = 1
  3.         while n < 11:
  4.                 yield n
  5.                 n += 1

  6.                
  7. >>> y() #直接引用无法得到结果,它只是一个生成器
  8. <generator object y at 0x01580420>
  9. >>> list(y())#将其转换成列表就可以了,range也是这个意思
  10. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  11. >>> for i in y():#更方便的是用for遍历
  12.         print(i)

  13.        
  14. 1
  15. 2
  16. 3
  17. 4
  18. 5
  19. 6
  20. 7
  21. 8
  22. 9
  23. 10
复制代码

yield.txt

473 Bytes, 下载次数: 0

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-27 08:58:07 | 显示全部楼层
为啥没人理我。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-27 09:34:15 | 显示全部楼层    本楼为最佳答案   
关于生成器的概念, 可参见:http://www.liaoxuefeng.com/wiki/ ... abc8424e12b5fb27000

在形式上是把return换成了yield。但有很大不同:
return是到此就结束程序,并返回值。
yield是到此将函数挂起,并返回迭代器对象,再次运行函数则从挂起处之后继续运行。
举个简单的例子:
  1. >>> def y(): #这是生成自然数序列的函数
  2.         n = 1
  3.         while n < 11:
  4.                 yield n
  5.                 n += 1

  6.                
  7. >>> y() #直接引用无法得到结果,它只是一个生成器
  8. <generator object y at 0x01580420>
  9. >>> list(y())#将其转换成列表就可以了,range也是这个意思
  10. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  11. >>> for i in y():#更方便的是用for遍历
  12.         print(i)

  13.        
  14. 1
  15. 2
  16. 3
  17. 4
  18. 5
  19. 6
  20. 7
  21. 8
  22. 9
  23. 10
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-27 11:55:50 | 显示全部楼层
学习了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-27 17:11:25 | 显示全部楼层
冬雪雪冬 发表于 2016-10-27 09:34
关于生成器的概念, 可参见:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a ...

谢谢啦~~~~

感觉迷迷茫茫的貌似有点感觉了~~

可能多用几次就好了~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-2 02:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表