2016-12-29 22 views
-13

前幾天我買了一本叫做「Python for Kids(For Dummies)」的書。 在47頁有一個簡單的代碼塊的例子:基本代碼誤區

a = 2 
while a < 10: 
    a = a + 1 
    print (a) 

這導致順序:

3 4 5 6 7 8 9 10 

我覺得這個結果不正確,因爲:

  • 「儘管在代碼的第一行中聲明,但「2」仍未打印出來。
  • '10'被打印出來,即使10與自身相等(違反條件a < 10)。

即使我使'while'條件a <= 10,它打印出數字3到11,這又是不正確的。

我覺得應該是正確的代碼如下:

a = 2 
while a < 10: 
    print (a) 
    a = a + 1 

,導致:

2 3 4 5 6 7 8 9 

這是我從代碼期待。我玩了一些代碼,有趣的是,Python允許一些奇怪的安排,可執行沒有錯誤,但完全不正確!例如:

a = 2 
while a < 30: 
    a = a + 5 
print (a) 

這會導致只有數字'32',這似乎是不正確的。

如果我縮進print (a)由4個空格,我得到:

7 12 17 22 27 32 

這也似乎是不正確的。你能向我解釋爲什麼我會得到這些輸出嗎?

+3

代碼逐行執行。打開while循環,你會很容易地看到增量和打印是在檢查下一個條件之前完成的 –

+7

你真的不應該認爲除了你之外的每個人都是錯的。 – user2357112

+1

歡迎來到計算機編程的奇怪世界:) –

回答

2

在第一個代碼中,請注意print語句之前的行:在任何打印完成之前,它將a加1。當然,如果您更改了代碼,結果可能會有所不同。所以除非你的書聲稱應該產生的輸出與實際產生的不同,否則這本書沒有錯。

而不是假設Python是錯誤,也許你應該考慮你誤解Python的工作原理的可能性。

4

這正是應該發生的事情。 的條件,而對於循環被測試只有在循環的頂部;循環操作期間沒有測試。因此,您可以在循環體中儘可能多地更改循環控制變量(在此例中爲a),並且子句只有在返回到循環頂部時纔會反應。等效代碼到你的最後一個例子是這樣的:

a = 2 
while True: 
    if not a < 30: 
     break 
    a = a + 5 

print (a) 

循環不會退出,直到一個收到違反條件的值。如果您在之後打印一個已更新,您的保證最後一個值a將違反該條件。

1

我將通過這個例子的執行步驟,一次一個說法,所以你可以看到:

(1) a = 2 
(2) while a < 10: 
(3)  a = a + 1 
(4)  print (a) 
  • 線路1:設置a爲2
  • 2號線:測試是否a小於10.它是!所以我們進入while循環體:
  • 線路3:1。a增加a現在是3
  • 4號線:打印a(也就是3)。
  • 第2行:返回循環頂部以測試循環條件:測試a是否小於10.它是!第二次輸入while循環體。
  • 第3行:增加a由1 a現在是4.
  • 4行:打印a(這是4)。
  • 第2行:測試循環條件:a仍然小於10.繼續執行循環體。
  • 第3行:增加a由1 a現在是5
  • 4行:打印a(即5)。
  • 第2行:測試循環條件:a仍然小於10.繼續執行循環體。
  • 第3行:增加a由1 a現在是6.
  • 4行:打印a(它是6)。
  • 第2行:測試循環條件:a仍然小於10.繼續執行循環體。
  • 第3行:增加a由1 a現在是7.
  • 4行:打印a(這是7)。
  • 第2行:測試循環條件:a仍然小於10.繼續執行循環體。
  • 第3行:增加a由1 a現在爲8
  • 4行:打印a(它是8)。
  • 第2行:測試循環條件:a仍然小於10.繼續執行循環體。
  • 第3行:增加a由1 a現在是9
  • 4行:打印a(它是9)。
  • 第2行:測試循環條件:a仍然小於10.繼續執行循環體。
  • 線路3:1。a增加a現在是10
  • 4行:打印a(其爲10)。
  • 第2行:測試循環條件:a不小於10.循環結束。循環後繼續執行下一條語句。如果什麼都沒有,程序結束。

我希望你能從中看到Python工作正常,輸出並不奇怪。

如果移動print (a)上述a = a + 1那麼它只會增加它之前打印的價值,因此,爲什麼它給出了2到9,而不是3的輸出到10

Python允許一些奇怪的安排,是可執行文件沒有錯誤但完全不正例如:

a = 2 
    while a < 30: 
     a = a + 5 
    print (a) 

這會導致只有數字'32',這似乎是不正確的。

電腦完全按照你告訴他們的,這是他們的優點和缺點。在你的修改代碼中,a在小於30時增加了5,因此它從2→7→12→17→22→27→32增加。然後退出該循環,因爲32不小於30。它打印a,它是32.因爲print語句沒有縮進,所以它在循環外部,所以直到循環結束後纔會執行它。