python基礎課程 第5章 奇妙的內建函數

2020-12-03 紙飛機編程

從我最早立志於成為程式設計師寫第一行代碼開始,經常在書本裡和前輩嘴裡了解了這麼一句話 「不要重複你自己 (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原則

「不要和別人爭論某種語言好壞」原則

下一章的教程我們會講到循環,好玩極了,大家期待吧。

相關焦點

  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    總目錄 零基礎全能篇(4套課程) 實用編程技巧進價(1套課程) 數據分析與挖掘(8套課程) 辦公自動化(3套課程) 機器學習與人工智慧(7套課程) 開發實戰篇(4套課程) 量化投資(2套課程) 網絡爬蟲(6套課程) 資料庫操作(1套課程) python
  • python入門基礎之lambda匿名函數詳解
    python入門基礎之lambda匿名函數詳解剛開始學習python的時候很多人可能對於lambda函數不了解,感覺和def很混亂,下面我來介紹一下lambda函數我從一下幾個方面來介紹lambda:1、lambda簡介2、lambda與def不同之處3、lambda的使用方法1、lambda簡介先來看一段代碼示例:第一行是
  • 《第3章 Python 運算符與表達式》3.1.1 算術運算符!
    《高中信息技術 Python編程》 教學案 《第3章 Python 運算符與表達式》3.1.1 算術運算符!3.1.1、算術運算符: 常規: + - * / 編程實例:原始碼:python = 95 # 定義變量,存儲Python的分數english = 92 # 定義變量,存儲English的分數c = 89
  • 複變函數論(鍾玉泉第四版)1-9章作業習題+答案,已更新至第6章
    總第149期December 13, 2020
  • 實變函數精品課程
    , 就接手"實變函數"課程的教學, 至今7年有餘.今後也將繼續在已有的設備上加以創新, 不斷完善. 20190913 課件; 作業; 作業講解; 作業參考解答; 實變函數的開創者 Lebesgue (勒貝格) 之傳記; 國防科大的數學專業考研初試要求; 微信公眾號中用 Latex 輸入數學公式; 微信公眾號內不能輸入數學公式時的方法第3章總複習題; 第
  • 302頁吳恩達Deeplearning.ai課程筆記,詳記基礎知識與作業代碼
    近日,來自重慶大學的 Wan Zhen 製作了一份深度學習專項課程筆記,該筆記從神經網絡與深度學習基礎、提升深度神經網絡性能和卷積神經網絡三門課程出發詳細解釋了關鍵概念與作業代碼。本文概括性地介紹了這三課的主要內容,並選擇每個課程主題比較有意思的知識點進行介紹。
  • Python基礎教程(一) - 函數和函數式編程
    前面使用過很多print()來進行列印,這是python提供的內建函數,你也可以自己創建函數,這叫做用戶自定義函數。創建函數你可以定義一個由自己想要功能的函數,用def語句來創建,標題行由def關鍵字,函數的名字,以及參數的集合(如果有的話)組成。
  • 「Python爬蟲與文本實例技術與應用」培訓班通知
    Python這門程式語言包羅萬象,可以說掌握了python,除了一些特殊環境和高度的性能要求,你可以用它做任何事。模塊、基本用法,熟悉函數,類設計,包的使用及基本的編程方法;    2.理解python數據挖掘與分析技術在當代各種大數據相關產品中的應用,並掌握該領域最關鍵技術的原理以及技術應用過程;   3.
  • 《實變函數與泛函分析基礎》第三版 程其襄 張奠宙 課後答案(全)
    我走過的彎路                   願對你有幫助程其襄 張奠宙 著高等教育出版社《實變函數與泛函分析基礎》第三版 程其襄 第1、2、3章答案《實變函數與泛函分析基礎》第三版 程其襄 第4、5、6章答案《實變函數與泛函分析基礎》第三版 程其襄 第7、8、9章答案《實變函數與泛函分析基礎》第三版 程其襄 第10、11章答案
  • 資源|用Python和NumPy學習《深度學習》中的線性代數基礎
    對於初學者而言,《深度學習》(Ian Goodfellow、Yoshua Bengio、Aaron Courville)中的理論基礎部分可能過於簡略。作者按照這本書的第二章的線性代數內容來逐一介紹機器學習中的線性代數基礎,讀者可以在原書、中譯版或中文筆記中查看每個小節的基礎介紹,或直接參考該博客的推導部分。作者除了對部分概念進行詳細推導之外,還添加了多個示例,並給出了 python/numpy 的實現代碼。
  • 《第3章 Python 運算符與表達式》3.1.3 比較(關係)運算符!
    《高中信息技術 Python編程》 教學案 《第3章 Python 運算符與表達式》3.1.3 比較(關係)運算符!># 輸出3個變量的值print("python = " ,python ,"english = " ,english, "c = " ,c, "\n")print("python < english的結果:" ,python < english) # 小於操作print("python > english的結果:" ,python
  • 使用Python玩轉高等數學(5):三角函數
    安裝matplotlib最簡單的方法就是在作業系統的命令行窗口分別輸入並執行下面的命令:python -m pip install -U pip setuptoolspython -m pip install -U matplotlib使用matplotlib繪圖,會用到Numpy庫,Numpy庫主要用於科學計算。
  • 程其襄等編《實變函數與泛函分析基礎》(第四版)第四章習題詳解
    在第三章可測集的基礎上, 這一章我們討論可測函數. 可測函數就是實變函數論中研究的主要函數, 比數學分析中研究的連續函數要寬泛的多.下面開始講習題.第 1,2,3,6 題考查函數可測的充分必要條件.第 11 題告訴我們, 函數列的依測度收斂性與每個函數在零測集上的取值無關. 即改變函數列中的每個函數在零測集上的取值, 不改變函數列的依測度收斂性.
  • 機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用...
    尹老師,數據科學家,浙江大學物理學博士,浙江某高校數據科學專業負責人,兼任某網絡科技上市公司大數據總監,受聘擔任多家大數據教學機構主講教師,開發多套python高級編程、機器學習、網絡爬蟲與文本挖掘系列課程,10+年python軟體開發數據產品經驗,熟悉R Java等多種程式語言,具有豐富的python統計建模、數據挖掘、大數據技術教學經驗,先後為中國交通銀行,平安保險公司等數十家知名機構主講
  • Python學習第40課-Lambda表達式創建匿名函數
    【每天幾分鐘,從零入門python編程的世界!】之前我們學習了使用def關鍵字來創建自定義函數,這種方式創建的函數都是有函數名的,我們也可以創建沒有函數名的函數,這種函數叫做匿名函數。Python中可以使用Lambda表達式來創建匿名函數。
  • python隨機函數random分配應用,隨機分配8名老師到3個教室中
    羽憶教程最近遇到一個問題,要隨機分配8名老師到3個辦公室中,這時小編想要了python中的隨機函數random來進行分配工作,感覺小編像個月老一樣。python隨機函數python隨機函數在python中,想要生成隨機數
  • 成都Python培訓周期多久
    不同的培訓學校有不同的教學理念和教學方法,所以一定要選擇適合自己的,python基礎和進階基本可以把你教會,但是項目發展就因人而異了,並不是培訓完就一定可以找到工作。成都python培訓機構魚龍混雜,沒有熟人的推薦,很容易會陷入一個只管招不管教的假機構裡。因此,大家一定要擦亮眼睛。推薦你去成都千鋒教育,千鋒教育在信息技術培訓行業工作十多年,教學質量有擔保。
  • python高階函數:map、filter、reduce的替代品
    什麼是高階函數?高階函數是一種將函數作為參數,或者把函數作為結果返回的函數,map函數、sorted函數就是高階函數的典型例子。map函數在小編以前的文章中做過相應的知識分享。sorted函數是python的內置函數,它的可選參數key用於提供一個函數,它可以將函數應用到各個元素上進行排序。
  • 成都學習Python開發哪家好
    那麼成都python培訓機構有哪些好呢?成都市不同規模的python培訓機構有什麼不同?沒有任何一家機構所有的課程都是牛逼的,它和人一樣有優點和缺點,除非它只專注於教1-2門課程。大多數培訓機構都不願意這樣做。畢竟有那麼多程式語言,太過於專注會流失掉大量學生,從而造成營收減少的結果。建議您選擇信譽好的老牌Python培訓機構。
  • Python學習步驟
    我們創造性的在基礎課程中就加入了如何編寫一個自己的神經網絡,為踏入神經網絡的大門打下「堅實基礎」。【基礎篇】Python基礎 【提高篇】Python深入和擴展【擴展篇】網絡編程、多線程、擴展庫【高手篇】算法、Python源碼、函數式編程、手工實現神經網絡第一階段python開發基礎和核心特性