37 題的其他符號有關的內容大多數之前都是學習過的,所以就不在發文來說了,而 38 讀代碼 更是一個需要自己線下完成的內容,因此也沒必要單獨拿出來寫答案。
於是乎,一下子就來到了 39 題。
題目
本題的練習應該歸類爲複習和實踐,在 32: 循環和列表 中我們瞭解了列表包含的方法,知道了 append
方法可以做到什麼事情,Zed 建議我們複習之後進行本題的練習。
另外,他還爲我們介紹了當執行 mystuff.append('hello')
時發生了什麼:
- Python 看到你用到了
mystuff
,於是就去找到這個變量。也許它需要倒着檢查看你有沒有在哪裏用 = 創建過這個變量,或者檢查它是不是一個函數參數,或者看它是不是一個全局變量。不管哪種方式,它得先找到mystuff
這個變量才行。- 一旦它找到了
mystuff
,就輪到處理句點.
(period) 這個操作符,而且開始查看mystuff
內部的一些變量了。由於mystuff
是一個列表,Python 知道mystuff
支持一些函數。- 接下來輪到了處理
append
。Python 會將 “append” 和mystuff
支持的所有函數的名稱一一對比,如果確實其中有一個叫 append 的函數,那麼 Python 就會去使用這個函數。- 接下來 Python 看到了括號
(
(parenthesis) 並且意識到, “噢,原來這應該是一個函數”,到了這裏,它就正常會調用這個函數了,不過這裏的函數還要多一個參數才行。- 這個額外的參數其實是……
mystuff
! 我知道,很奇怪是不是?不過這就是Python 的工作原理,所以還是記住這一點,就當它是正常的好了。真正發生的事情其實是append(mystuff, 'hello')
,不過你看到的只是mystuff.append('hello')
。
對於這個過程的瞭解會有助於理解 python 的錯誤信息。雖然我們還沒有學習“類”(class),不過我們知道了函數會有兩個參數之後就不難理解下面這個錯誤信息
>>> class Thing(object):
... def test(hi):
... print(hi)
...
>>> a = Thing()
>>> a.test("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: test() takes exactly 1 argument (2 given)
錯誤信息說 test()
只接受 1 個參數,然而實際上卻傳入了 2 個。也就證明 a.test("hello")
實際上正是被 python 翻譯爲 test(a, "hello")
才導致了錯誤的發生。
加分練習
- 將每一個被調用的函數以上述的方式翻譯成 python 實際執行的動作。例如
' '.join(things)
其實是join(' ', things)
。 - 將這兩種方式翻譯爲自然語言。例如
' ".join(things)
可以翻譯成 “用 ’ ’ 連接(join) things”,而join(' ', things)
的意思是 “爲 ’ ’ 和 things 調用 join 函數”。 - 在網上閱讀一些關於 “面向對象編程 (Object Oriented Programming)” 的資料。不要怕看着暈,其實大家開始都暈,而《笨辦法學 python》 會教給我們足夠的知識逐步掌握它
- 瞭解 Python 的 class 是什麼東西。一定是 Python 的哦
- 瞭解
dir(something)
和something
的 class 有什麼關係? - Zed 建議,如果實在皋懂 面向對象編程(OOP)可以學習以下 “函數編程 (functional programming)”
我的答案
39.0 基礎練習
ten_things = "Apples Oranges Crows Telephone Light Sugar"
print("Wait there's not 10 things in that list, let's fix that.")
# 字符串的 split 方法會把字符串按照參數隔開生成一個列表
stuff = ten_things.split(' ')
more_stuff = ["Day", "Night", "Song", "Frisbee", "Corn", "Banana", "Girl", "Boy"]
# 不斷從 more_stuff 中取出元素加入 stuff 中直到
# stuff 的長度等於10,確認 while 循環會正確結束
while len(stuff) != 10:
next_one = more_stuff.pop()
print("Adding:", next_one)
stuff.append(next_one)
print("There's %d items now." % len(stuff))
print("There we go:", stuff)
print("Let's do some things with stuff.")
print(stuff[1])
print(stuff[-1])
print(stuff.pop())
print(' '.join(stuff))
print('#'.join(stuff[3:5]))
39.1 + 39.2 翻譯函數語句
stuff = ten_things.split(' ')
翻譯: ten_things
使用空格 分割爲列表
實際執行 stuff = split(ten_things, ' ' )
翻譯: 爲 ten_things
和 調用
split
函數
next_one = more_stuff.pop()
翻譯:more_stuff
使用 拋出方法
實際執行 pop(more_stuff)
翻譯:調用 pop
函數,參數是 more_stuff
stuff.append(next_one)
翻譯:爲 stuff
末尾添加 next_one
實際執行 append(stuff, next_one)
翻譯:爲 stuff
和 next_one
調用 append
方法
stuff.pop()
翻譯: 爲 sutff
調用 pop
方法
實際執行 pop(suff)
翻譯:調用 pop
函數,參數 suff
39.3 + 39.4 Python 面向對象編程
這裏推薦兩篇文章來理解和學習 python 的面向對象編程是怎麼會是
《Python 面向對象(初級篇)》
武沛齊老師所著,這篇文章寫作時間比較早一點使用的 python2 作爲代碼示例,但是非常的簡潔清晰,唯一遺憾是對多態的介紹比較專業一些,新手不太容易理解到什麼是 python 的多態。
Python3 教程 —— 面向對象編程
大家學習 python 肯定都知道廖雪峯老師吧,廖老師教程對於多態的介紹更詳細一些
dir()
函數
dir(something)
會列出 something
所擁有的屬性和函數。而當我們使用 class 創建一個類的時候,其中的屬性和函數都可以通過 dir
列出來。