免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3828 | 回复: 2
打印 上一主题 下一主题

被yield弄晕了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-01 15:40 |只看该作者 |倒序浏览
本帖最后由 hp_truth 于 2011-03-01 15:42 编辑

刚开始学python,看python基础教程那本书,被里面的yield弄晕了。
里面提到用yield解决八皇后问题, 人家好像都讲明白了,就是自己理解起来有点困难。
后来还是通过对比以前的方法来理解yield, 稍微好点了。
  1. #! /usr/bin/env python

  2. __metaclass__ = type

  3. # 判断冲突的函数
  4. def conflict(state, nextX):
  5.     nextY = len(state)
  6.     for i in range(nextY):
  7.         if abs(state[i] - nextX) in (0, nextY - i):
  8.             return True
  9.     return False

  10. # 书上的方法
  11. def queen1(num = 8, state = ()):
  12.     for pos in range(num):
  13.         if not conflict(state, pos):
  14.             if len(state) == num -1:
  15.                 yield (pos,)
  16.             else:
  17.                 for i in queen1(num, state + (pos,)):
  18.                     yield i + (pos,)

  19. # 以前用过的方法
  20. sum=[]
  21. def queen2(num, result = []):
  22.     if len(result) == num:
  23.         sum.append(result)
  24.     else:
  25.         for pos in range(num):
  26.             if not conflict(result, pos):
  27.                 queen2(num, result + [pos])


  28. # 参照以前的方法, 对书上的方法稍微改了一下
  29. # 比书上的方法多了几次函数调用, 主要是体验一下
  30. # 递归调用中用到了几次yield, 但对外界来说,
  31. # 应该是 ‘yield i + [pos] 这 一句是真正的返回一种八皇后方案。
  32. # 而‘yield []’只是内部递归调用时返回。
  33. def queen3(num, result = []):
  34.     if len(result) == num:
  35.         yield []
  36.     else:
  37.         for pos in range(num):
  38.             if not conflict(result, pos):
  39.                 for i in queen3(num, result + [pos]):
  40.                     yield i + [pos]



  41. def prettyprint(solution):
  42.     def line(pos, length=len(solution)):
  43.         return '. ' * (pos) + 'X ' + '. ' * (length-pos-1)
  44.     for pos in solution:
  45.         print line(pos)


  46. import random
  47. print len(list(queen1( 8 )))
  48. prettyprint(random.choice(list(queen1( 8 ))))

  49. queen2( 8 )
  50. print len(list(sum))
  51. prettyprint(random.choice(list(sum)))

  52. print len(list(queen3( 8 )))
  53. prettyprint(random.choice(list(queen3( 8 ))))

  54. i = queen3( 8 )
  55. print i.next()
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-03-02 21:27 |只看该作者
不用
没用
从来不用,还是一样用python写程序

论坛徽章:
0
3 [报告]
发表于 2011-03-03 13:25 |只看该作者
回复 2# ttvast


    赫赫,是吗, 还是有用的, 不然干嘛提出这么个概念。 目前只知道当需要生成大量数据的时候, 可以用yield, 减少内存占用量, 其他的应用还有待进一步学习)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP