網上曾流傳著這樣的段子,戲說程序員中的等級:
一流程序員靠數學,二流靠算法,三流靠邏輯,四流靠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()函數的典型用法如下所示:
>>> for 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數學編程》。
今日互動話題:
“你認爲數學對編程有哪些好處呢?”