選擇你自己的 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 方法
help(D.get)- 試試
- 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')。預測將會發生什麼,並解釋原因。
- dict(a=1)
- dict('a'=1)
- dict(class=1)
- 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 建構函式只要條件為真就執行迴圈的主體。
這是一個示例
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] 的函式,我們可以使用它。
import time
def countdown(n, wait=1):
while n >= 1:
print n
time.sleep(wait)
n = n -1
print "liftoff"
countdown(5,.5)
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