此python版本:python 3.3.5
一、yield語句
任何包含 yield 語句的函式稱為生成器, yield 不像 return 那樣返回值,yield 每次產生多個值。使用 yield 語句每次產生乙個值後,函式就會被凍結:即函式停在這一點等待被啟用,啟用後從此點開始執行。
例:>>> def flatten(nested):
for sublist in nested:
for element in sublist:
return element
>>> nested = [[1, 2],[3, 4], [5]]
>>> for num in flatten(nested):
print (num)
traceback (most recent call last):
file "", line 1, in
for num in flatten(nested):
typeerror: 'int' object is not iterable
程式報錯,說 flatten(nested) 是不可迭代的,所以來看一下 flatten(nested) 到底輸出了什麼。
>>> nested = [[1, 2],[3, 4], [5]]
>>> flatten(nested)
1>>> flatten(nested)1
發現原來 flatten(nested) 只輸出了乙個 int 型別的數,即當函式 flatten 在對列表 nested 進行迴圈的時候,第一遍採集到數字 1 時,就 return 了,函式就結束了。
看一下yield
>>> def flatten(nested):
for sublist in nested:
for element in sublist:
yield element
>>> nested = [[1, 2],[3, 4], [5]]
>>> for num in flatten(nested):
print (num)12
345
>>> list(flatten(nested))
[1, 2, 3, 4, 5]
可以看到,此時 flatten(nested) 返回的是乙個列表,可迭代輸出。即當函式 flatten 對 nested 進行迴圈的時候,採集到第乙個值 1 的時候,函式即凍結,啟用後仍會繼續執行雙迴圈,而不是結束函式。
二、八皇后問題
要求:在 8 * 8 的棋盤上,8 個皇后不在同行、同列、同對角線。
(1)定義衝突
>>> def conflict(state, nextx):
nexty = len(state)
for i in range(nexty):
if abs(state[i] - nextx) in (0, nexty - i):
return true
return false
其中,nextx 指下乙個皇后將要放置的橫座標,也就是列。nexty 指下乙個皇后將要放置的縱座標,即行。state是乙個列表,列表內存放著已經放置好的皇后的位置,即存放著元組 (x , y) ,state[ i ] = j 指第(i + 1)行的皇后在第(j + 1)列。
注: if abs(state[i] - nextx) in (0, nexty - i): 中的 (0, nexty - i): 指前面的數是否為 0 或者 nexty - i 兩者中的乙個,並不是指處在某個範圍裡面。
(2)放置皇后
>>> def queens(num = 8, state = ()):
for pos in range(num):
if not conflict(state, pos):
if len(state) == num - 1:
yield (pos,)
else:
for result in queens(num, state + (pos,)):
yield (pos,) + result
注:程式分為
if len(state) == num - 1: 和
else: 兩部分,是因為,遞迴都需要有乙個遞迴結束的點,否則,遞迴就會無止境的不斷進行下去。
其中, for pos in range(num): 這一行,指的是給將要放置的新皇后,她的縱座標已固定(由定義衝突裡的 nexty = len(state) 來固定的),所以,需要在8個列位置上,給她進行選擇放置的位置。
如果放置 4 個皇后,則有 2 種放置方法:
>>> list(queens(4))
[(1, 3, 0, 2), (2, 0, 3, 1)]
應用 print 可以把不同的放置方法,一行一行列印出來。
(3)打包輸出
輸出簡易的放置了皇后的棋盤。
>>> def prettyprint(solution):
def line(pos, length = len(solution)):
return '.
' * (pos) + 'x
' + '.
' * (length - pos - 1)
for pos in solution:
#依次取出隨機挑選的方案裡的每個數,即每位皇后在自己的行中坐所在的列。
print (line(pos))
>>> import random
>>> prettyprint(random.choice(list(queens(8))))
#在queens(8) 的方案裡隨機挑選乙個
. .
x .
. . . .
. .
. .
. x . .
. .
. .
. . . x
. x
. .
. . . .
. .
. x
. .
. .
x .
. .
. . . .
. .
. .
. . x .
. .
. .
x . . .
20190915學習PYTHON 八皇后問題
20190915學習python 八皇后問題 剛剛開始學習python。先試完成乙個經典的深度優先演算法,就是八皇后問題。一邊學一邊查,完成了 python八皇后問題求解 2019 9 15 n 8 數量 nsolve 0 解的個數 a 0 n 用於儲存各行上皇后的位置,使用列表 檢查乙個位置第p行...
菜鳥學習之python八皇后問題學習
state 表示元祖 這裡表示乙個回溯問題 在八皇后問題每一次遞迴的層面是一行 defconflict state,nextx nexty len state fori in range nexty if abs state i nextx in 0,nexty i return true retu...
學習框架之 八問
我們先介紹八大問,然後來看怎麼使用它來挖掘知識的連線點。八大問是乙個提問的框架,將針對資訊 觀點 事件 經歷等的提問,分為 前 因 後 果,適 用 邊 界 八類。這八類問題,可用來分析或整理資訊,把資訊變成知識,並找到知識的連線點。八大問又可以分為兩組,前因後果和適用邊界,前因後果用於分析資訊,適用...