2013-12-11 42 views
2

在練習考試問題,我們給出如下:打印出給定的字母字母序列 - 蟒蛇

ALPHABET = "ABCD" # letters to use in sequences 
seq = 3 * [ "" ] 
letterSeqs = [ ] # list of all the letter sequences 

for seq[0] in ALPHABET: 
    for seq[1] in ALPHABET: 
     for seq[2] in ALPHABET: 
      letterSeqs.append("".join(seq)) 

我們應該估計條目列表letterSeqs總數以及第一和最後的條目。任何人都可以解釋代碼如何工作?

謝謝!

+0

沒有它運行後,他們都沒有。 – abarnert

+0

您是否嘗試過運行它?也許可以加入一些'print'語句來查看哪些值是在哪裏? – CDspace

+0

什麼,具體來說,你不清楚? –

回答

5

這是奇怪的代碼,但法律......

第一:

seq = 3 * [ "" ] 

...創建一個空字符串,列表包含三個引用空字符串。

後來,你這樣做:

for seq[0] in ALPHABET: 

那是有點棘手。它在ALPHABET上循環,依次將這4個字母中的每一個分配給seq[0]。通常情況下,您使用變量作爲循環變量,而不是像這樣的複雜目標。事實上,我猜老師做這件事是爲了拋棄你。然而,它確實變成有用的,排序。

,然後爲每個4次迭代的,你這樣做:

for seq[1] in ALPHABET: 

這再次循環4次,每次外環,所以這是一個總的16箇中循環。然後,爲每個16的,你這樣做:

 for seq[2] in ALPHABET: 

這再次循環4次,每次環路中間,共計64個內部循環。

然後,對每個人,你這樣做:

  letterSeqs.append("".join(seq)) 

在這一點上,seq永遠是3單字符字符串列表。這是使用seq[0]作爲循環變量的收益。這就是說,有更好的方法來做同樣的事情。只需使用for i,for jfor k,而這可能是i+j+k。 (如果你想泛化到3個字符串以外的東西,靜態嵌套循環結構是困難的部分,而不是單獨的變量...)

因此,它會將join轉換爲單個3個字符的字符串。然後將其添加到空列表中。

因此,最後,您已經有64個3字符字符串的列表。

+0

我是一無所知的事實''target_list''項目在for循環的定義中:「expression_list」中的「target_list」的「for_stmt :: =」:「suite」可以是列表中的索引元素。然而,文檔中的句子,**每個項目依次使用標準分配規則分配給目標列表**涵蓋了這種情況,但我認爲它應該更清楚,或者更清楚。該文件在這一點上是不好的。你怎麼看待這件事 ?你在這個問題之前是否知道這個特點? – eyquem

2
for _ in container: 

將運行len(container)次。由於您嵌套三深,它運行

len(container) ** 3 == 4 ** 3 == 64 

次。每次添加一個str對象時,"".join(seq),所以最後的長度將是64。

當第一個項目被追加時,seq中的所有位置的第一個值爲ALPHABET,因此該項目爲"AAA"。最後,他們都有從ALPHABET的最後一個值,所以最後一個項目將是"DDD"