官术网_书友最值得收藏!

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中一樣,函數是可以獨立處理的數據,甚至可以將其傳遞給其他函數。

數學的抽象性會讓人望而生畏。但是,就像在任何優秀軟件中一樣,引入抽象是有原因的:它可以幫助你組織和交流更宏大、更強有力的思想。當你掌握了這些思想并將其轉化為代碼時,就會開啟更多令人興奮的可能性。

如果你還沒有做到這一點,我希望你已經相信,軟件開發中有許多令人興奮的數學應用。作為一名程序員,你已經有了正確的思維方式和工具來學習一些新的數學思想。本書中的思想豐富了我的職業生涯、提升了我的個人素養,希望對你也有所幫助。讓我們開始吧!

主站蜘蛛池模板: 井研县| 阿拉善左旗| 瓦房店市| 正镶白旗| 海兴县| 屏山县| 凉城县| 莱西市| 湘西| 孝义市| 德格县| 建德市| 祁东县| 岐山县| 武清区| 常熟市| 明水县| 靖江市| 怀远县| 天等县| 涟源市| 阳新县| 余干县| 兰溪市| 浑源县| 大石桥市| 社会| 芷江| 象州县| 泰顺县| 阿巴嘎旗| 泾阳县| 南昌市| 嘉鱼县| 长乐市| 筠连县| 天镇县| 霍邱县| 九龙县| 杭州市| 鹤峰县|