那些數學不好的程序員,最後都怎麼樣了?

網上曾流傳着這樣的段子,戲說程序員中的等級:

一流程序員靠數學,二流靠算法,三流靠邏輯,四流靠SDK,五流靠Google和StackOverFlow,六流靠百度和CSDN。低端的看高端的就是黑魔法!

玩笑裏藏的是殘忍的現實,異步君不禁流下淚水。雖然整個大學就在被高等數學、離散數學、微積分、線性代數等數學課支配的恐懼中度過,但還是總在掛科的邊緣徘徊,根本沒有重視數學。

在管理學上有一個著名的“木桶理論”,是指用一個木桶來裝水,如果組成木桶的木板參差不齊,那麼、這個木桶能裝多少水,只能由這個木桶中最短的木板決定。

對普通編程來說,高中數學成績不錯就可以了。但涉及到高端編程就吃力了,比如算法、深度學習等。不得不說,數學這塊“木板”往往決定了程序員能否往更高層次進階。

年少不知數學重要,長大方悔沒學好。

當然,只要肯學習,未來一切皆有可能。今天異步君給大家分享幾個數學計算程序,幫助大家理解數學在編程中的應用。

生成乘法表

考慮三個數字 a、b 和 n,其中 n 是整數,使得 a×n = b。此處我們可以說,b是 a 的第 n 個倍數。例如,4 是 2 的第二個倍數,1024 是 2 的第 512 個倍數。

一個數字的乘法表列出了該數字的所有倍數。例如,2 的乘法表是這樣的(這裏給出了 2 的前三個倍數):

2×1=2

2×2=4

2×3=6

我們的下一個程序就是爲用戶輸入的任何數字生成最大到乘數 10 的乘法表。

在這個程序中,我們將使用 format()函數與 print()函數來使程序的輸出看起來更友好、更可讀。下面簡要介紹一下它的工作原理。

format()函數可以插入標籤並對其進行設置,以獲得一個友好的、可讀的字符串

輸出。例如,假設我們有在雜貨店購買的所有水果的名稱,併爲每種水果創建了單獨的標籤,現在想輸出一個連貫的句子,可以使用 format()函數:

>>> item1 = 'apples'
>>> item2 = 'bananas'
>>> item3 = 'grapes'
>>> print('At the grocery store, I bought some {0} and {1} and {2}'.format(item1, item2, item3))
At the grocery store, I bought some apples and bananas and grapes

首先,我們創建了三個標籤(item1、item2 和 item3),每個標籤指代不同的字符串(蘋果、香蕉和葡萄)。然後,在 print()函數中,我們鍵入字符串,它包含了三個在大括號中的佔位符,分別爲{0}、{1}和{2}。接下來是.format(),它的參數爲之前創建的三個標籤,這會告訴 Python 按照列出的順序,用這些標籤保存的值來填充這三個佔位符,因此,在 Python 的輸出文本中,第一個標籤的內容替換了{0},第二個標籤的內容替換了{1},依此類推。

使用標籤指向我們要輸出的值並非必要,我們可以在.format()中直接鍵入值,
如下例所示:

>>> print('Number 1: {0} Number 2: {1} '.format(1, 3.578)) Number 1: 1 Number 2: 3.578 

請注意,佔位符的數量和標籤(或鍵入值)的數量必須相等。
瞭解了 format()的工作原理之後,接下來讓我們看看生成乘法表的程序:

Multiplication table printer
def multi_table(a):
? for i in range(1, 11):
print('{0} x {1} = {2}'.format(a, i, a*i))
if __name__ == '__main__':
a = input('Enter a number: ')
multi_table(float(a))
multi_table()函數實現程序的主要功能,它將輸出 a 的乘法表(a 也是參數)。

因爲我們要輸出從 1 到 10 的乘法表,所以在?處有一個 for 循環,它將迭代這些數字中的每一個數字,輸出它本身和數字 a 的乘積。
當你執行程序時,它會讓你輸入一個數字,然後該程序輸出其乘法表:

Enter a number : 5
5.0 x 1 = 5.0
5.0 x 2 = 10.0
5.0 x 3 = 15.0
5.0 x 4 = 20.0
5.0 x 5 = 25.0
5.0 x 6 = 30.0
5.0 x 7 = 35.0
5.0 x 8 = 40.0
5.0 x 9 = 45.0
5.0 x 10 = 50.0

看到這張清晰又有秩序的乘法表了嗎?這正是我們使用了.format()函數,根據
可讀、統一的模板輸出的內容。
你可以使用 format()函數來進一步控制數字輸出的形式。例如,如果希望數字
只有兩位小數,可以參考下面的例子:

Enter a number : 5
>>> '{0}'.format(1.25456)
'1.25456'
>>> '{0:.2f}'.format(1.25456)
'1.25'

第一個 format 語句將我們輸入的數字原封不動地輸出。在第二個語句中,我們
將佔位符修改爲{0:.2f},這意味着我們只需要小數點後面的兩個數字,其中 f 表示一個浮點數。如你所見,在下一個輸出中,小數點後只有兩個數字。請注意,如果數字小數點後的位數多於你指定的位數,則該數字將四捨五入,例如:

>>>'{0:.2f}'.format(1.25556)
'1.26'

在這裏,1.25556 向上取整到最接近的百分位,並輸出爲 1.26。如果將.2f 應用
到整數上,則會在小數點後面添加零:

>>>'{0:.2f}'.format (1 )
'1.00'

添加兩個零是因爲我們指定在小數點後輸出兩個數字。

計算整數因子

當非零整數 a 除另一個整數 b,餘數爲 0 時,a 稱爲 b 的因子。例如,2 是所有 偶數整數的因子。我們可以編寫下面的函數來確定非零整數 a 是否是另一個整數 b 的因子:

>>> def is_factor(a, b):
         if b % a == 0:
             return True
         else:
             return False 

我們使用%運算符來計算餘數。如果你發現自己在問“4 是不 是 1024 的因子”這類問題,可以使用 is_factor()函數得到答案:

is_factor(4, 1024)
True
對於任何正整數 n,如何找到其所有的正因子?對於 1 和 n 之間的每個整數, 我們檢查 n 除以該整數後的餘數。如果餘數爲 0,那麼這個整數就是一個因子。使 用 range()函數來編寫一個程序,它將遍歷 1 到 n 之間的每個數字。

在編寫完整的程序之前,先來看看 range()如何工作。range()函數的典型用法如下所示:

>`i in range(1, 4):
         print(i)
 1
 2
 3

在這裏,我們設置了一個 for 循環,並給 range()函數傳入了兩個參數。range() 函數從第一個整數參數(起始值)開始,一直到第二個整數參數(停止值)截止。 在這個例子中,我們告訴 Python 輸出該範圍內的數字,從 1 開始,到 4 停止。注意, 這意味着 Python 不會輸出 4,所以後輸出的數字是停止值之前的數字 3。同時也 要注意,range()函數只接收整數作爲參數。

你也可以不指定 range()函數的起始值,在這種情況下,起始值被假定爲 0。 例如:

>>> for i in range(5):
         print(i) 
0 
1
2
3 
4

由 range()函數產生的兩個連續整數之間的差稱爲步長值(step value)。默認情 況下,步長值爲 1。要定義其他的步長值,請將其指定爲第三個參數(這時,需指 定起始值)。例如,下面的程序將輸出 10 以下的奇數:

>>> for i in range(1,10,2):
         print(i) 
1 
3 
5 
7 
9 

我們已經瞭解了 range()函數是如何工作的,接下來考慮一個因子計算程序。因 爲我們將要編寫一個相當長的程序,所以在 IDLE 編輯器裏編寫,而不是在交互式 的 IDLE 界面中。你可以在 IDLE 中選擇 File->New Window(或者 New File)來啓 動編輯器。請注意,我們首先用三個單引號(’)來註釋代碼,這些引號之間的文本 不會被 Python 作爲程序的一部分執行,它們只是我們對程序的註釋。

‘’’
Find the factors of an integer
‘’’

def factors(b):

 for i in range(1, b+1):
        if b % i == 0:
          print(i) 

if name == ‘main’:

   b = input('Your Number Please: ')
   b = float(b) 

 if b > 0 and b.is_integer():
         factors(int(b))
    else:
         print('Please enter a positive integer') 

factors()函數定義了一個 for 循環,在n處,該循環使用 range()函數對 1 和輸入 的數字之間的每個整數迭代一次。這裏,我們要迭代到用戶輸入的整數 b,所以停 止值被設置爲 b+1。對於每個整數 i,程序檢查輸入數字 b 除以 i 後是否沒有餘數, 如果沒有餘數,就輸出 i。

當你運行此程序(選擇 Run->Run Module)時,它會要求你輸入一個數字。如 果你輸入的數字是正整數,程序會輸出其因子,例如:

Your Number Please: 25
1
5
25
如果輸入的是非整數或負整數,程序會輸出一條錯誤信息,並要求你輸入一 個正整數:

Your Number Please: 15.5
Please enter a positive integer
在這個例子中,我們通過檢查程序的無效輸入,使程序對用戶更加友好。因爲 我們的程序僅用於查找正整數的因子,所以要檢查輸入的數字是否大於 0 並且 使用 is_integer()函數檢查輸入的數是否是整數,以確保輸入有效。

如果輸入的數不是正整數,程序將輸出一個用戶友好的指令,而不是一長串的錯誤信息。

-END-

最後,異步君給大家推薦一本書,可以將程序設計和數學巧妙地結合起來,從簡單的項目開始,應用Python解決高中和大學低年級的數學問題,比如幾何、概率、統計以及微積分等,爲進一步學習更復雜的數學內容以及Python編程語言打下堅實的基礎。

本書也可作爲Python初學者的入門讀物,通過學習書中的示例程序和完成那些編程挑戰,讀者可以提高自己的編程能力和技巧。

關注“異步圖書”微信公衆號,回覆“52271”領取本書配套源代碼;

回覆 “VIP” 免費領取VIP會員卡,暢讀近千門電子書。

今日福利

《Python數學編程》

阿米特·薩哈(Amit Saha) 著

許楊毅,劉旭華 譯

在這裏插入圖片描述

如何獲得:關注公衆號:異步圖書,在看+參與話題留言+轉發本文至朋友圈,2月20日,異步君將抽取2名讀者贈送《Python數學編程》。

今日互動話題:

“你認爲數學對編程有哪些好處呢?”

發佈了520 篇原創文章 · 獲贊 292 · 訪問量 88萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章