python楊輝三角代碼過程看不懂?

def triangles():
b = [1]
while True:
yield b
b = [1] + [b[i] + b[i+1] for i in range(len(b)-1)] + [1]
n = 0
for t in triangles():
print(t)
n = n + 1
if n == 10:
break
#b = [1] + [b[i] + b[i+1] for i in range(len(b)-1)] + [1]
#這一句是怎麼循環的啊,小白看了一下午還是雲里霧裡


b = [1] + [b[i] + b[i+1] for i in range(len(b)-1)] + [1]

左右兩邊的[1]不解釋了。我們看這個↓

[b[i] + b[i+1] for i in range(len(b)-1)]

No.1

b = [1], len(b) =&> 1,
range(len(b)-1) =&> None 所以是空的,
加上前後的[1],b變成了[1,1]

No.2

b = [1,1], len(b) =&> 2,
range(len(b)-1) =&> range(1) =&> (0)
=&> 中間的列表生成了b[0] + b[1]這個元素,
其中b[0]是b列表的第一個元素即1,b[1]是b列表的第二個元素即1,
所以生成元素為1+1=2,由於range(1)=&>(0),
只有一個元素,生成的list為[2],加上左右的[1],得到[1,2,1]

No.3

b = [1,2,1], len(b) =&> 3,
range(len(b)-1) =&> range(2)
=&> (0,1) =&> 中間的列表先生成了b[0] + b[1]這個元素,
其中b[0]是b列表的第一個元素即1,b[1]是b列表的第二個元素即2,
所以生成元素為1+2=3,列表然後生成了b[1] + b[2]這個元素,
其中b[1]是b列表的第二個元素即2,b[2]是b列表的第三個元素即1,
所以生成元素為2+1=3,
由於range(2)生成的是長度為2的元組,for完成了0和1兩次循環後結束了,
所以生成的list為[3,3],加上左右的[1],得到[1,3,3,1]

No.4

...沒時間解釋了,快上車


python.楊輝三角.生成器

這是我總結的你可以看看,或許會有些啟發


貼一個很妙的代碼


那一句你看不懂主要是因為,在這一句中,+體現了兩種不同的用法。b[i]+b[i+1]是數的加法。而[1]+[...]是list的extend命令;同事[b[i] + b[i+1] for i in range(len(b)-1)]是一個列表解析的用法。

列表解析:

派森吧 - pythonpub.com


編程小白,勿噴。

還沒學會生成器,花了一個小時寫出來的複雜的代碼,邏輯應該是和用生成器的一樣的。

def triangle(a):

l=[1]

print(l)

n=0

while n&<a:

if
n==0:

l.append(1)

print(l)

else:

L=l[:]

for
i in range(1,len(l)):

l[i]=L[i-1]+L[i]

l.append(1)

print(l)

n=n+1

return

等我學會生成器了再寫一遍。


同為編程新手說下我的看法吧,我覺得你沒理解的可能是楊輝三角而不是代碼 = =!

仔細看代碼中b[i]+b[i+1]是列表中的元素相加,該方法的for循環目的是為了求出新一行的元素值,因為新的一行中除了首末位為1的元素之外,每一個元素都是上一行的當前位置i+1和前一位置i的和(這裡為什麼是i+1和i而不是i和i-1,因為求新一行的元素都是從第二個開始,按列表位置也就是b[1],而循環range(i)都是從i=0開始)

補充一下為什麼for循環是len(b)-1,這裡的b是新的一行,比如說第五行,len(b)是5,仔細看它除了首末位,中間的元素都變了,所以說要循環len(b)-2次才能得到這中間所有的元素值的list,而range(i)表示的是0到i-1個元素,那麼這裡的len(b)-1實際上就是len(b)-1 -1個元素。

把首位都對齊就很容易看出來了,看圖這裡4=1+3,同理依次往後看6=3+3,4=3+1,這是楊輝三角的一個理解方式,也是為什麼代碼要這麼寫的原因吧,至於列表推導式怎麼理解,列表的元素相加和列表相加的區別,其他答案都說的很明白了。

我好像越說越複雜了0.0


妙哉,看了代碼,再寫一寫,果然解惑


推薦閱讀:

這段python代碼的意思如何理解?
如何使用爬蟲監控一系列網站的更新情況?
python已正確安裝numpy但無法調用?
我數學很差,最近報了培訓班在學Python編程,上課都能聽懂,自己寫程序的時候感覺特別難是怎麼回事?
如何理解python的類與對象?

TAG:Python | 編程 | Python3x | Python入門 | python35 |