跳轉到內容

選擇你自己的 Python 冒險/中期回顧

來自華夏公益教科書

好吧,它不是全部回顧。其中一部分是新的。其餘部分是回顧。

這些例子和問題應該很有挑戰性!參與進來,動手實踐!學習程式設計的唯一方法就是嘗試編寫程式碼。當代碼出現錯誤時

  • 深呼吸
  • 閱讀錯誤資訊。它們通常很有資訊量。
  • 檢查你的
    • 縮排
    • 匹配的括號/大括號/方括號/引號
    • 自尊心。我們都會犯錯!


如果你對這裡有任何困惑,請查詢更完整的 Python 參考,或在課堂上提出問題。


  • 字典將鍵與值關聯
  • 透過它們的鍵進行訪問
  • 沒有固有的順序
  • 練習:建立字典 D,我們將在整個練習中使用它。注意:我們也可以使用 dict() 函式來建立一個字典。
D = {'i':1, 'l': [1,2,3], 's': "my favorite string", d= dict(a=1,b=2)}

這裡哪裡錯了?現在試試這個。

D = {'i':1, 'l': [1,2,3], 's': "my favorite string", 'd': dict(a=1,b=2)}
  • D 的鍵是什麼?
答案

獲取所有鍵

   d.keys()  # this won't work since d isn't defined!
   D.keys()
  • 值是什麼?
答案

獲取值

   D.values()


  • 嘗試訪問 D 的值
答案

訪問

   D['i']
   D['d']
   D['c']  # what happens when it doesn't exist?
  • 嘗試從 D 中刪除鍵值對
答案

使用 del 刪除

   del D['i']
   del D['c']
  • 嘗試向 D 新增鍵值對:'newkey' -> True
答案

新增

   D['newkey'] = True
  • 檢查字典的get 方法
    1. help(D.get)
    2. 試試
      • D.get('i',"notfound")
      • D.get('c',"notfound")
答案

關於內建函式 get 的幫助

   get(...)
       D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.
       

基本上,如果 k 在 D 中,返回 D[k],否則返回 d。這可以避免我們在字典中沒有鍵時出現 KeyError 錯誤。

  • 額外練習: 嘗試 dict(1='a')。預測將會發生什麼,並解釋原因。
    1. dict(a=1)
    2. dict('a'=1)
    3. dict(class=1)
    4. help(dict)
答案

1 不是有效的 Python 變數名。dict() 函式期望有效的 Python 識別符號,如幫助中所述。


  • 額外練習: D 的第一個元素是什麼?


答案

這是一個陷阱問題!字典沒有固有的順序!它可能在不同的機器或不同的 Python 版本之間有所不同。無論如何,它不是應該依賴的東西。

列表、元組、字串

[編輯 | 編輯原始碼]

列表、元組和字串都是 Python 序列型別

  • 它們是有序的
  • 它們透過它們的索引 [0,..,n] 進行訪問,與字典不同,字典透過鍵進行訪問
  • 一些是可變的(意味著元素可以改變)
  • 字串具有額外的諸如 upper、lower、split 等方法
  • 序列支援切片(見下文)
  • 構造 L,t,s 如下
   L = [8,'a',[1,2,3],None,'b']
   t = ('hallway', "a creepy hallway!")
   s = "a few of my favoirite strings"


  • 嘗試訪問不同的元素。
   L[0]
   s[1]
   t[2]
   L['a'] 
答案

L['a'] 失敗,因為序列透過索引訪問,而不是透過名稱訪問。

  • 哪些是不可變的?
   L[0] = 1
   s[0] = 1
   t[0] = 1
   
答案

元組和字串是不可變的。元組意味著位置有意義,而列表可以追加、刪除等。


  • 額外練習 切片實驗
   L[:2]
   L[2:]
   L[-3]
   L[10]
   L[::-1]


  • 編寫這個函式
   yell_month(name,monthint) -> string

它的工作原理是這樣的

   >>> yell_month('gregg', 1)
   'January GREGG'
   >>> yell_month('mIRANda', 7)
   'July MIRANDA'
  • 嘗試使用字典和 if/elif/else 語句
答案

兩種方法

   # here's one method, using a dict. 
   def yell_month(name,monthint):
       months = {1: 'January', 2: 'February', }  # etc.
       name = name.strip().upper()
       return months.get(monthint, "MONTHUARY") + " " + name
   # another, using if/else
   def yell_month(name,monthint):
       month = "SMARCH"
       if monthint == 1:
           month = "January"
       elif monthint == 2:
           month = "February"
       ... # lots of omitted code
       else:
           month = "SMARCH"
       name = name.strip().upper()
       return month + " " + name
   
   # which do you think is easier?


有時我們想做一些事情不止一次。計算機不會厭煩重複工作,而且有無限的耐心。利用這一點!


迭代器

[編輯 | 編輯原始碼]

Python 有一種神奇的構造,稱為 for...in,它可以迭代資料結構。

   for element in thing:
       print element, type(element)

嘗試迭代我們的序列,將我們的朋友 D,s,t,L 代替 'thing'。

答案

迭代器示例

   for thing in (D,s,t,L): 
       print thing
       for element in thing:
           print element, type(element)


While 迴圈

[編輯 | 編輯原始碼]

while 建構函式只要條件為真就執行迴圈的主體。

這是一個示例

def countdown(n):
    while n >= 1:
        print n
        n = n -1
    print "liftoff"


  • 嘗試使用不同的 n 值,例如 0、1、-1、'a'、None
  • 編寫一個函式,它可以計數到一個數字。
  • final_countdown,儘管它的名字,但使用的是 for 迴圈
def final_countdown():
    ''' print a version  of Europe's 'The Final Countdown' '''
    phrases = [ 
            'do de do dooo',
            'do de do do dooo',
            'de do de do',
            'de do de do do de dooo'
            'do de doo', 
            'do de do',
            'do de do do deee dooooo',
            'WEEEEE WOOOOOOOO',
    ]
    for phrase in phrases:
        print phrase

額外練習: 製作倒計時等待

[編輯 | 編輯原始碼]

如果我們實際上希望該函式在迴圈之間等待一秒鐘怎麼辦?Python 中有一個名為 [time.sleep] 的函式,我們可以使用它。

展示 time.sleep 的示例
import time
def countdown(n, wait=1):
    while n >= 1:
        print n
        time.sleep(wait)
        n = n -1
    print "liftoff"

countdown(5,.5)

額外練習: breakcontinue

[編輯 | 編輯原始碼]
  • break 會退出迴圈
  • continue 會繼續執行迴圈中的重複部分
示例

包含 continue 和 break 的示例

   def cases_spaces_breaks(sentence):
       for letter in sentence:
           if letter == " ":
               break
           elif letter.islower():
               continue
           elif letter.isupper():
               print  letter, "is uppity!"
           else:
               print letter, "is middle cased?"
  • 嘗試使用各種輸入句子來執行它,以瞭解它的功能


標準庫

[編輯 | 編輯原始碼]

探索 標準庫.

  • 選擇一個函式或模組,並進行實驗。
  • 告訴大家你選擇了哪個!
  • 展示使用它的程式碼。
  • 描述它的輸入和輸出。


動手實踐!

[編輯 | 編輯原始碼]

檢視 標準異常(錯誤),看看你認出了哪些。嘗試編寫觸發這些錯誤的程式碼

  • SyntaxError
  • KeyError
  • NameError
  • TypeError(提示:int() 是一個很好的選擇!)
  • IndexError
  • ImportError
答案

生成一些錯誤

   a = '1 # SyntaxError
   {}['a'] # KeyError
   print fake_var # NameError
   int('a')  # TypeError
   [1,2,3][8]  # IndexError
   import fake # ImportError
華夏公益教科書