從我最早立志於成為程式設計師寫第一行代碼開始,經常在書本裡和前輩嘴裡了解了這麼一句話 「不要重複你自己 (Don't Repeat Yourself )」,也就是所謂的DRY原則,並以此作為自己的程式設計師準則之一。
DRY原則的意思是指不要為一個相同的功能或者類似的功能重複編寫兩份代碼。我覺得談戀愛結婚也大概可以如此,大家如果能遵循 「不要重複你自己」 的原則,也就不會有那麼高的離婚率,天下也就沒有那麼多單親家庭了。
然而人生遠遠比計算機世界複雜,我們可以用python在計算機中實現這個原則,卻很難在人生中實現它。有人說工程師相對比較單純也是如此吧,工作久了,難免受機器的一些影響。
畢竟作為高級動物的我們內心世界太過複雜和敏感,到現在為止甚至未來的很長的時間裡也沒辦法被人工智慧所取代。如果有一天我們被人工智慧製造出來的物體取代,那麼我相信它一定也是一臺內心豐富的電腦。
今天我們來講講 python 的常用內建函數,以便於大家在日常編程過程中遇到類似的場景可以直接拿來使用,不用再重複自己了。
python 內建函數(python自帶的函數) 數量加起來大概有70多個,今天我們主要講常用的一些,至於更多的內容可以在以後的基礎教程裡慢慢學到。
除了DRF原則之外,用 python 的內建函數還有另一個好處,那就是它通常比我們自己實現得更好,更合理。
因為python語言本身是基於C語言實現的,而大部分內建函數均是基於C語言編寫並編譯成二進位的,所以在運算效率上比我們用 python 再實現一遍要高很多。
當然python語言中還有更多非計算密集型的函數和模塊是基於python語言本身實現的,在這裡我們只需要明白內建函數通常在計算密集型的情況下性能更好即可。
關於計算密集型的概念在本文末尾會有一個簡單的解釋(坦白地講,其實現在還有不少 「程式設計師」 對這個概念都模糊不清)。
舉個簡單的例子,我們設計一個函數,讓計算機幫我們進行數字累加,從1+2+3+4+n 一直加到1億。這對於人類來說已經是一個天文數字了,但是在計算機的世界裡僅僅是一眨眼的時間即可完成的。
看到了嗎,簡單的說,內建函數的性能比自定義函數高很多,並且實現上也更加的優雅,通常可以用在需要提高計算性能以及精簡冗餘代碼的地方。
迭代對象(iterable):這個東西的簡單解釋為可以用來進行循環取值的一個對象,例如python中的(列表、元組、字典等)本文後面會大量說到可迭代對象這個詞,特在此做一個解釋。
sum函數
官方解釋: 從 start 開始,從左到右對迭代對象中的元素求和。 start 默認是 0,迭代的 item 通常是數字,並且不允許 start 的值為字符串。
人話解釋: sum函數用於求和,統計列表裡數值累加的總和。
這類題目讓我想起了小學的數學題和暑假生活課本上的習題。
type函數
官方解釋: type函數有一個參數時,返回 object 的類型。返回值是一個類型對象,通常與 object.class返回的對象相同。
人話解釋: type函數用於返回某個對象的數據類型,也可以用它創建一個對象。
我們可以用type檢查對象的類型,以便於做出下一步選擇。
print函數
官方解釋:將 objects 列印到文本流 file 中,以 sep 分隔,然後以 end 結尾。必須將 sep,end,file 和 flush(如果存在)作為關鍵字參數給出。
人話解釋:用於在屏幕上顯示內容。
這大概是我們在整個教程裡出現頻率最高的內建函數了,在這裡就不多做解釋了,print一切吧。
print函數經常用在內容輸出上,用它能做一個簡單的命令行程序界面。實際上到最後我們經常用它來調試代碼(不是最佳方案)。
len函數
官方解釋:返回對象的長度(條目數量)。參數可以是一個序列(如 string、bytes、tuple、list 或 range)或集合(如字典、set 或 frozenset)
人話解釋:len函數通常用來判斷對象的長度(字符串、列表、字典等等)
例如我要統計一篇文章的長度,同樣可以用len函數來完成。
在上面這段代碼裡我用到了open函數打開一個本地文本文件,不過在今天的教程裡我不打算介紹它,留著日後再說吧。
max函數
官方解釋: 返回迭代對象中的最大項或兩個或更多個參數中最大的項。
人話解釋: 返回迭代對象裡的最大值,或者返回兩個可迭代對象中數字加起來最大的那一個迭代。
以上代碼用於返回年齡列表(age_list)中年齡最大的值。
以上代碼用於返回兩個年齡列表中加起來數值最大的那一個列表。
min函數
官方解釋:返回迭代對象中的最小項或兩個或更多個參數中的最小項。
人話解釋:返回迭代對象裡的最小值,或者返回兩個可迭代對象中數字加起來最小的那一個迭代。
min函數和max恰好相反,求最小值。
abs函數
官方解釋:返回一個數字的絕對值。參數可以是整數或浮點數。如果參數是一個複數,則返回它的模。
人話解釋:負數可以變成正數,正數不會變化。也可以求複數模(複數在本章不做理解)
絕對值的定義我記得在初中就學過,abs函數通常用於數值計算。
round函數
官方解釋:返回在小數點後捨入到精度 ndigits 的 number 。如果 ndigits 被省略或者是 None,它將返回最接近的整數表示。
人話解釋:對數字進行四捨五入,可以包含指定位數的小數點。
python的round函數有時候不一定能得到精確的結果,這跟浮點數的計算規則有關,如果用於精確計算的場合,建議用 decimal 這個庫來處理,在這裡不做詳細展開。
sorted函數
官方解釋:從迭代對象中的元素中返回一個新的排序列表。有兩個可選參數,必須將其指定為關鍵字參數。
人話解釋:對列表、元組、字典進行排序,可以從小到大,也可以從大到小,默認從小到大。
應用場景:sorted可以用於對班級成績、人員年齡、編號等做排名。
reversed函數
官方解釋:返回一個反向迭代器。seq 必須是具有 reversed() 方法或支持序列協議( len() 方法和整數參數從 0 開始的 getitem() 方法)的對象。
人話解釋 : 反轉一個序列(列表,元組)的順序。
range函數
官方解釋:range 嚴格來說不是一個函數,它實際上是一個不可變的序列類型。
人話解釋:range可以為我們生成一個可迭代(循環)的對象,並且它是一個不可變的數據類型。
需要注意的是在第一個range對象裡我生成了10個數字,默認從0開始,所以最後的數字範圍是從0-9,如果我們想要得到1-10,那麼可以改為 range(1,10)
all函數
官方解釋:如果迭代對象所有元素均為True(或者iterable為空),則返回True, 否則為False。
人話解釋:如果某個序列中的值全部為真或者為空就返回真(True),否則返回假(False)。
需要注意的是python的邏輯判斷時均認為 數字零 (0、0.0) 、 空字符串(單引號、雙引號、三引號)、空列表 []、空元組 ()、空字典 {} 的值都是False。反之都是True。
這個函數通常可以用到判斷某個邏輯判斷結果集合裡是否全部為真,而不用遍歷每一個結果,挨個判斷。
比如下面這段代碼我們要判斷10個人裡性別是否都為女性,第1到第6行代碼僅僅作為數據生成和展示,不用關心具體語法,我們只需要看明白第8行代碼即可。
any函數
官方解釋:如果迭代對象中有任何一個元素為 True則返回 True。如果 iterable 為空或者全部為False,返回 False。
人話解釋:any函數和all函數作用類似,不過條件不一樣,all函數要求是全部為True才行,any要求是只要有一個是True就行,另外兩者在處理空的時候邏輯相反。
同樣來一個判斷性別判斷的列子。
int函數
官方解釋:返回一個由數字或字符串 x 構造的整數對象,如果沒有給出參數,則返回 0。
人話解釋:將包含整數數字內容的字符串轉換為整數類型。
str函數
官方解釋 :返回一個字符串對象
人話解釋:差不多,可以將任意內容轉換為字符串
id函數
官方解釋:返回一個對象的 「身份」。它是一個整數,它在其生命周期中保證對這個對象唯一且恆定。具有非重疊生命周期的兩個對象可能具有相同的 id() 值。
人話解釋:用於獲取對象的內存地址標誌,我記得在上一章值傳遞和引用傳遞中,可變對象和不可變對象講到過。
大家可能會注意到,當我們對不可變對象(整型數字)取內存地址時,不管是取變量還是取跟變量相同的值,它的地址都是一樣的,除非它的值發生了改變。
但是當我們對可變對象 (列表和字典)取內存地址時,它的變量和另一個相同的值的內存地址都不一樣。
記住這個特性,至於為什麼python要這麼設計,我們將在以後的高級課程中講到。
補充說明
計算密集型: 消耗CPU資源進行運算,比如計算圓周率、對視頻進行高清解碼、對圖片進行人臉識別等。
IO密集型(Input Output): 消耗硬碟和內存資源進行讀寫操作,比如文件的讀寫操作。
python語言本身適合IO密集型的應用,並不適合計算密集型的應用,所以牽扯到計算密集型的操作儘量都用內建函數或模塊甚至別的語言完成。
當然諸位日常編程幾乎很難遇到所謂的性能瓶頸,即使遇到了也可以有很多辦法去解決,如果以後有人對本文的讀者說「python語言性能差」之類的話時,諸位不用急著爭辯,問問對方清不清楚python語言性能差在哪?哪些適合,哪些不適合。
最後給大家普及一下程式設計師的「三大美德」,由Perl語言創始人拉裡.沃爾(Larry Wall)所提出。
1、懶惰
是這樣一種品質,它使得你花大力氣去避免消耗過多的精力。它敦促你寫出節省體力的程序,同時別人也能利用它們。為此你會寫出完善的文檔,以免別人問你太多問題。
2、急躁
是這樣一種憤怒——當你發現計算機懶洋洋地不給出結果。於是你寫出更優秀的代碼,能儘快真正的解決問題。至少看上去是這樣。
3、傲慢
極度的自信,使你有信心寫出(或維護)別人挑不出毛病的程序。
當然可以再加上另外兩大美德:
DRY原則
「不要和別人爭論某種語言好壞」原則
下一章的教程我們會講到循環,好玩極了,大家期待吧。