【Think Python】Python筆記(七)迭代

  • 迭代:即重複運行某個代碼塊的能力;之前的介紹中已經有兩種方法實現迭代:遞歸和for循環;
  • 接下來介紹另一種方法:while循環;

(一)重新賦值

  • 對變量多次賦值是合法的;
  • 給變量賦值非常有用,但是需要小心;對變量的頻繁賦值,會造成代碼可讀性的下降,不容易調試;
  • =與數學中的符號並不是相同的:
  1. 數學上,相等是一種對稱關係,但是賦值並不是一個對稱的關係;
  2. 數學中的相等命題,不是對就是錯,但是在python中,賦值可以使得兩個變量相等,但是這兩個變量並不一定必須保持這個關係;

(二)更新變量

變量賦值中一種常見的形式是更新:

x = x + 1
  • 試圖更新一個不存在的變量會出現錯誤;
  • 所以在更新之前需要進行初始化;

(三)while語句

計算機經常被用來自動處理重複性的任務。計算機很擅長無紕漏地重複相同或者相似的任務, 而人類在這方面做的不好。在計算機程序中,重複也被稱爲迭代(iteration)

def countdown(n):
    while n > 0:
        print(n)
        n = n -1
    print('Blastoff')
  • while語句的執行過程:

    • 判斷條件是真還是假;
    • 如果爲false,退出while循環,執行接下來的句子;
    • 如果爲true,運行while循環語句的主題,運行結束返回第一步;
  • 循環主體應該改變一個或者多個變量的值,這樣才能讓條件判斷最終爲false,否則,循環將得不到終止;

(四)break

break可以跳出一層循環;

while循環的這種寫法很常見,因爲你可以在循環的任何地方判斷條件 (而不只是在循環開始),而且你可以積極地表達終止條件(“當出現這個情況是終止”), 而不是消極地表示(“繼續運行直到出現這個情況”)

(五)平方根

循環常用於計算數值的程序中,這種程序一般從一個概略的值開始,迭代地進行計算;

牛頓法計算平方根

這個方法,可以用來計算a的平方根

>>> a = 4
>>> x = 3
>>> y = (x + a/x) / 2
>>> y
2.166666666667

可以看出第一次計算已經比較接近4的平方根,即2,再次計算

>>> x = y
>>> y = (x + a/x) / 2
>>> y
2.00641025641

可以看出,隨着迭代的次數增加,越來越接近真實的值;

  • 一般來說,我們並不知道應該計算幾次才能得到正確的答案,但是當估計值不再變化的時候,就獲得了正確答案
    • x == y的時候,可以停止計算;
    • 但是直接讓兩個浮點數相等是比較危險的,因爲浮點數只能大約表示,有些現實中的數字是不能用浮點數精確表示的,所以需要有一個決定其精度的epsilon來作爲閾值;
while True:
    print(x)
    y = (x + a/x) / 2
    if abs(y - x) < epsilon:
        break
    x = y

(六)算法(Algorithm)

算法是什麼:

什麼不是算法:
  • 在學習一位數乘法時, 可能背出了乘法表。實際上,你只是記住了100個確切的答案。這種知識並不是算法性的;
什麼是算法:
  • 如果你比較 “懶”,你可能就會找到一些訣竅。比如說爲了計算 n 和 9 的乘積,你可以把 n−1 作爲乘積的第一位數,再把 10−n 作爲第二位數,從而得到它們的乘積。這個訣竅是將任意個位數 與 9 相乘的 **普遍解法 **。這就是一種算法;
  • 算法的特點之一 就是不需要過多的腦力計算。算法是一個機械的過程,每一步都是依據一組簡單的規則跟着上一步來執行的;
  • 執行算法很是乏味,但是設計算法是何有挑戰性的,是計算機科學的核心;

(七)調試

當你開始寫更爲複雜的程序時,你會發現大部分時間都花費在調試上。更多的 代碼意味着更高的出錯概率,並且會有更多隱藏bug的地方;

  • 減少調試時間的一個方法是對分調試,即:

    • 如果程序有100行,你一次檢查一行,就需要100步;
    • 試着將問題拆爲兩半。在代碼中間部分或者附近的地方,尋找一個可以檢查的中間值。加上一行 print 語句(或是其他具有可驗證效果的代碼),然後運行程序;
    • 判斷出錯的地方在上半部分還是下半部分;隨後進行類似的操作;
    • 這樣每次可以排除一半的代碼;對於100行的代碼,最多需要6步即可定位響應出錯的行;
  • 在實踐中,可能並不能很好的確定程序的 “中間部分” 是什麼,也有可能並不是那麼好檢查。 計算行數並且取其中間行是沒有意義的。相反,多考慮下程序中哪些地方比較容易出問題,或者 哪些地方比較容易進行檢查。然後選定一個檢查點,在這個斷點前後出現bug的概率差不多;====

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章