- 程序員數學:用Python學透線性代數和微積分
- (美)保羅·奧蘭德
- 2632字
- 2022-01-10 14:44:07
1.3 用上你訓練有素的左腦
本書是為有經驗的程序員或在工作中熱衷于學習編程的人設計的。為程序員讀者寫關于數學的內容是極好的,因為如果你會寫代碼,就已經訓練了你的分析性左腦。我認為學習數學的最好方法是借助高級編程語言,并且預測在不遠的將來,這將是數學課堂的常態。
對于像你這樣的程序員,可以用幾種具體的方法來很好地學習數學。我在這里將其列舉出來不僅是為了奉承你,也是為了提醒你已經具備了哪些技能,可以在數學學習中利用起來。
1.3.1 使用正式的語言
當學習編程時,第一個痛苦的教訓就是,不能像寫簡單的英文一樣編寫代碼。如果你給朋友寫的紙條有少許拼寫或語法錯誤,他們可能還能理解你想說的內容,但代碼中的任何語法錯誤或拼寫錯誤都會導致程序運行失敗。在某些語言中,即使在原本正確的語句末尾漏掉一個分號,也會導致程序無法運行。作為另一個例子,看一下下面這兩個語句。
x = 5
5 = x
可以把二者都解讀為符號的值是5。但這在Python中并不準確,事實上,只有第一條可以如此解讀。Python語句
x = 5
是一個指令,會把變量的值設置為5。但是,不能將數字5設置為具有
的值。這可能看起來有些咬文嚼字,但你需要知道這一點才能寫出正確的程序。
另一個困擾新手程序員(有經驗的程序員也一樣)的問題是引用相等。如果定義了一個新的Python類,并創建了它的兩個相同的實例,那么它們是不相等的。
>>> class A(): pass
...
>>> A() == A()
False
你可能希望兩個相同的表達式是相等的,但這顯然不符合Python的規則。因為這兩個表達式是A
類的不同實例,所以它們是不相等的。
留意新的數學對象,它們看起來像你所熟知的對象,但行為方式卻不一樣。例如,如果字母和
代表數,那么
。但是,正如你將在第5章中學到的,如果
和
不是數,情況就不一定是這樣。如果
和
是矩陣,那么積
和
就是不同的。事實上,它們之中甚至有可能只有一個是合法的,或者兩者都不正確。
寫代碼的時候,僅僅寫出語法正確的語句是不夠的。語句所代表的思想需要是有意義的、合法的。如果寫數學語句時也同樣謹慎,你會更快發現錯誤。更棒的是,如果用代碼寫數學語句,計算機會幫你做輔助檢查。
1.3.2 構建你自己的計算器
計算器在數學課上很常見,因為可以用來檢查計算結果。雖然你需要知道在不借助計算器的情況下如何計算6乘以7,但能通過計算器來確認你的答案正確也挺好。一旦掌握了數學概念,計算器還能幫你節省時間。比如在計算三角函數時,你想知道3.141 59 / 6是多少,這可以用計算器很容易地算出來,于是你可以把精力花在思考結果的意義上。計算器能做的事情越多,理論上應該越有幫助。
但計算器有時太復雜了,很難用。當我上高中的時候,老師要求買一個圖形計算器。我買了一個TI-84,它有大約40個按鈕,每個按鈕有兩三種不同的模式。我只知道如何使用其中的20個左右。總之,這個工具使用起來相當煩瑣。當我在小學一年級拿到第一臺計算器時,情況也是一樣的。雖然它只有大約15個按鈕,但我不知道其中一些是干什么的。如果讓我為學生們發明第一臺計算器,我會把它做成如圖1-14所示的樣子。

圖1-14 幫學生學習計數的計算器
這個計算器只有兩個按鈕:一個按鈕可以將數值重置為1,另一個按鈕可以前進到下一個數。這樣“只滿足最基本需要”的工具,非常適合幫助孩子學習計數。(這個例子可能看起來很傻,但你確實可以買到這樣的計算器!它們通常是機械式的,被當作計數器售賣。)
掌握了如何計數,你就會想練習寫整數和做加法了。在這個學習階段,需要給計算器再加幾個按鈕(見圖1-15)。

圖1-15 能寫整數和做加法的計算器
在這個階段,不需要-、×或÷這樣的按鈕來妨礙你。當你做減法問題(如5-2)時,仍然可以通過這個計算器檢查答案(確認3+2=5)。同樣,你也可以通過累加來解決乘法問題。摸索完這個計算器后,就可以升級到一個能完成所有算術運算的計算器了。
我認為理想的計算器應該是可擴展的,這意味著可以按需添加更多的功能。例如,可以為你學習的每一個新的數學運算在計算器上添加一個新按鈕。當學到代數的時候,也許除了數,還可以讓它理解或
等符號。當你學了微積分時,可以更進一步,使其理解和處理數學函數。
可以處理多種類型數據的可擴展計算器似乎遙不可及,但這正是高級編程語言提供的能力。Python不僅自帶算術運算、math
模塊,還有眾多可以隨時引入的第三方數學庫,讓編程環境更加強大。因為Python是圖靈完備的,所以你(原則上)可以計算任何可以計算的東西,需要的只是一臺足夠強大的計算機、一個足夠巧妙的程序實現,或者兩者兼備。
本書用可復用的Python代碼來實現每個新的數學概念。自己動手實現可以很好地加深你對一個新概念的理解。最終,你的工具箱里會多出一個新工具。在自己嘗試之后,如果愿意,也可以隨時換上一個經過打磨的主流庫。無論采用哪種方式,你構建或導入的新工具都為探索更復雜的概念奠定了基礎。
1.3.3 用函數建立抽象概念
我剛才所說的過程在編程里叫作抽象。例如,當你厭倦了重復計數時,就可以創建針對加法的抽象;當你厭倦了做重復的加法時,就可以創建針對乘法的抽象;以此類推。
在編程里的所有抽象方式中,可以延續到數學中的最重要的一種方式是函數。在Python中,函數是一種重復執行任務的方法,可以接收一個或多個輸入,產生一個輸出。例如:
def greet(name):
print("Hello %s!" % name)
這段代碼可以讓人用有表現力的簡短代碼發出多個問候語,比如:
>>> for name in ["John","Paul","George","Ringo"]:
... greet(name)
...
Hello John!
Hello Paul!
Hello George!
Hello Ringo!
這個函數很實用,但它不像數學函數。數學函數總是接收輸入值,并總是返回沒有副作用的輸出值。
在編程中,我們把行為像數學函數的函數稱為純函數。例如,平方函數接收一個數并返回這個數與自己的乘積。執行
時,結果是9。這并不意味著數3現在已經變成了9,而是意味著9是函數
在輸入為3時的相應輸出。可以把這個平方函數想象成一臺機器,它在輸入槽中接收數,在輸出槽中產生結果(數),如圖1-16所示。

圖1-16 函數就像一臺有輸入槽和輸出槽的機器
這是一個簡單實用的心智模型,整本書中都會用到它。我最喜歡它的一點是,你可以把函數當成一個對象來處理。在數學中,就像在Python中一樣,函數是可以獨立處理的數據,甚至可以將其傳遞給其他函數。
數學的抽象性會讓人望而生畏。但是,就像在任何優秀軟件中一樣,引入抽象是有原因的:它可以幫助你組織和交流更宏大、更強有力的思想。當你掌握了這些思想并將其轉化為代碼時,就會開啟更多令人興奮的可能性。
如果你還沒有做到這一點,我希望你已經相信,軟件開發中有許多令人興奮的數學應用。作為一名程序員,你已經有了正確的思維方式和工具來學習一些新的數學思想。本書中的思想豐富了我的職業生涯、提升了我的個人素養,希望對你也有所幫助。讓我們開始吧!
- 極簡算法史:從數學到機器的故事
- 微服務與事件驅動架構
- C# 從入門到項目實踐(超值版)
- .NET 4.0面向對象編程漫談:基礎篇
- Java程序設計:原理與范例
- 單片機應用與調試項目教程(C語言版)
- UVM實戰
- Scala for Machine Learning(Second Edition)
- QGIS Python Programming Cookbook(Second Edition)
- JavaScript機器人編程指南
- 區塊鏈項目開發指南
- 深度實踐KVM:核心技術、管理運維、性能優化與項目實施
- Application Development with Parse using iOS SDK
- Learning Kotlin by building Android Applications
- 數據結構:Python語言描述