Python語言程式設計之一--for迴圈中累加變數是否要清零
最近學到了Pyhton中迴圈這一章。之前也斷斷續續學過,但都只是到了函式這一章就停下來了,寫過的程式碼雖然儲存了下來,但是當時的思路和總結都沒有記錄下來,很可惜。這次我開通了部落格,就是要把這些珍貴的學習思考總結記錄下來。從現在開始。
關於這一章始終有幾個難點不懂。第一個就是每次迴圈過後,其中的累加變數是否要清零?這個問題困擾了我許久。很多次寫完程式碼執行時發現,計算結果和我想要的結果根本不同。比如在《Python語言程式設計》這本書裡,第5章習題第27題:
計算π的值:π =4 * (1 - 1/3 + 1/5 - 1/7 + 1/9 + … + (-1)i+1 / (2*i -1)),顯示當i=10000, 20000, ,,100000時π的值
題目不難,按公式寫就行了。由於希望顯示i在1萬、2萬,,時,π的值,所以用了兩層for迴圈。最開始的程式碼如下:
# 累加變數 sum = 0 for i in range(10000, 100001, 10000): print('i =', i, '時,π的值為:', end = '') for j in range(1, i+1): sum += ((-1) ** (j + 1)) / (2 * j - 1) pi = 4 * sum print(pi)
執行結果如下:
i = 10000 時,π的值為:3.1414926535900345 i= 20000 時,π的值為:6.283035307179826 i = 30000 時,π的值為:9.42459462743631 i = 40000 時,π的值為:12.566162281026036 i = 50000 時,π的值為:15.707734934615797 i = 60000 時,π的值為:18.849310921538994 i = 70000 時,π的值為:21.990889289414817 i = 80000 時,π的值為:25.13246944300482 i = 90000 時,π的值為:28.27405098548388 i = 100000 時,π的值為:31.415633639074002
很明顯,這個結果是錯的。只有第一個結果是計算正確的。開始我百思不得其解,我的迴圈變數感覺沒問題啊,迴圈步長也沒錯,計算公式也沒錯啊。怎麼會這樣?我想了想,第一個結果正確,但是從第二個結果就開始錯,那問題就出在迴圈上面。當第一次計算結束時,此時sum 已經不再是0,而是有了一個值,由於sum定義在迴圈外部,所以下一次迴圈時,sum將帶著第一次迴圈後的值進入下一次計算,相當於每迴圈一次,sum的值都在增加。
修改後的程式碼如下:
for i in range(10000, 100001, 10000): print('i =', i, '時,π的值為:', end = '') # 下面這句非常重要,每次計算完後累加變數要清零! sum = 0 for j in range(i + 1, 0, -1): sum += ((-1) ** (j + 1)) / (2 * j - 1) pi = 4 * sum print(pi)
執行結果如下:
i = 10000 時,π的值為:3.1414926535900345 i = 20000 時,π的值為:3.1415426535898248 i = 30000 時,π的值為:3.141559320256462 i = 40000 時,π的值為:3.1415676535897985 i = 50000 時,π的值為:3.1415726535897814 i = 60000 時,π的值為:3.141575986923102 i = 70000 時,π的值為:3.141578367875482 i = 80000 時,π的值為:3.1415801535897496 i = 90000 時,π的值為:3.1415815424786238 i = 100000 時,π的值為:3.1415826535897198
這樣才對嘛!隨著 i 的增大,計算結果只能是在小範圍內波動。
總結:迴圈變數是否要清零要看情況而定,但如果希望每次迴圈時,累加變數能以一個全新的值進入下一次迴圈那就要清零了。像這樣喜歡在程式碼前面定義變數並賦初值的習慣,是寫C留下的。但遇到迴圈時要小心,變數的作用域會在不知不覺間讓你犯錯。