亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 被yield弄暈了 [打印本頁]

作者: hp_truth    時(shí)間: 2011-03-01 15:40
標(biāo)題: 被yield弄暈了
本帖最后由 hp_truth 于 2011-03-01 15:42 編輯

剛開始學(xué)python,看python基礎(chǔ)教程那本書,被里面的yield弄暈了。
里面提到用yield解決八皇后問題, 人家好像都講明白了,就是自己理解起來有點(diǎn)困難。
后來還是通過對(duì)比以前的方法來理解yield, 稍微好點(diǎn)了。
  1. #! /usr/bin/env python

  2. __metaclass__ = type

  3. # 判斷沖突的函數(shù)
  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. # 參照以前的方法, 對(duì)書上的方法稍微改了一下
  29. # 比書上的方法多了幾次函數(shù)調(diào)用, 主要是體驗(yàn)一下
  30. # 遞歸調(diào)用中用到了幾次yield, 但對(duì)外界來說,
  31. # 應(yīng)該是 ‘yield i + [pos] 這 一句是真正的返回一種八皇后方案。
  32. # 而‘yield []’只是內(nèi)部遞歸調(diào)用時(shí)返回。
  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()
復(fù)制代碼

作者: ttvast    時(shí)間: 2011-03-02 21:27
不用
沒用
從來不用,還是一樣用python寫程序
作者: hp_truth    時(shí)間: 2011-03-03 13:25
回復(fù) 2# ttvast


    赫赫,是嗎, 還是有用的, 不然干嘛提出這么個(gè)概念。 目前只知道當(dāng)需要生成大量數(shù)據(jù)的時(shí)候, 可以用yield, 減少內(nèi)存占用量, 其他的應(yīng)用還有待進(jìn)一步學(xué)習(xí))




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2