天天看點

Python入門(18)

Python入門(18/18)

第十八節 與衆不同

大家好!今天來到這裡,我要恭喜各位,因為,當你看到今天的課程,意味着你已經學習甚至掌握了 Python 技術的大部分基礎知識。

你擁有的這些知識,如果你恰好又能夠勤奮練習,那麼,它們就不僅存在于你的頭腦中,而且還變成了你手上的技能,這樣,你才算真正的擁有了Python這門技術。

在你豪情萬丈,準備勇闖江湖,一顯身手之前,俺還是要提醒你:天外有天,人外有人,強中自有強中手 ... 哎呀,這個扯遠了。我是想說,你學會的基礎知識,估計絕大多數人也可能學會了。那麼,問題是,人就是有時候忍不住想顯擺一下,那怎樣才能顯得與衆不同呢?

對,就是這個意思,

是不是說到你心坎上去了。

哈哈!别不好意思,

其實,

大家都在這麼想 ...

OK,那我們今天就來分享一些與衆不同的東西。

1、傳遞元組

我們一直在使用函數,而且,絕大多數時候,我們的函數時有傳回值的。但是,大家有沒有注意到,我們得到的傳回值通常隻有一個。

那麼問題來了,假如我希望函數的代碼塊執行完畢以後,能夠傳回2個甚至2個以上的值,那該怎麼辦?效率最高的方法又是什麼?

答案是:你隻需要把它們放置在一堆圓括号之中就行了。

天啦,就這麼簡單?是的。不信,你編寫和運作下面的代碼試試:

Python入門(18)

提醒:請注意 a, b = <some expression> 的用法會将表達式的結果解釋為具有兩個值的一個元組。這也意味着在 Python 中交換兩個變量的最快方法是:

Python入門(18)

還可以這樣?實在是很爽啊!

2、魔法方法

我們知道,Python的一些序列類資料類型,比如字典,能夠按鍵索引。那麼,如果,我們自己自定義某個類,也希望它能夠具有類似按鍵索引的能力,可以不可以呢?可以的!

下面就推薦一個這樣的魔法方法:如果你希望自定義的類也具有按鍵索引的功能(如清單、元組中使用的x[key]那樣),那麼,你隻需要在你的類中添加 __getitem__() 方法即可。其實, Python 對 list 清單類就是幹了這件事情!

Python入門(18)

3、Lambda 表達式

很多進階程式設計語言中都有lambda,lambda就是用來定義一個匿名函數的。

既然是定義匿名函數,如果還硬是要給他一個名字的話,就會顯得有點畫蛇添足。是以,我們通常是直接使用lambda函數。如下所示:

Python入門(18)

上面的代碼,就通過使用lambda建立了一個匿名函數,這個函數擁有兩個變量x和y,函數的代碼塊就是一個算式:x+y,我們把它作為一個對象通過“等式(指派)”符号,指派給add。這時候add實際上就成了一個函數對象。是以,隻要給它傳遞2個實參,就能計算出它們的和。

這個用法,看起來是不是很酷?!沒感覺出來?我去...那再看看下面這個例子吧。

Python入門(18)

PS:通常在函數式程式設計中,我們會用到lambda表達式。Python提供了很多函數式程式設計的特性,如:map、reduce、filter、sorted等這些函數都支援函數作為參數。

4、清單推導

清單推導(List Comprehension)用于從一份現有的清單中得到一份新清單。

想象一下,現在你已經有了一份數字清單,你想得到一個相應的清單,需求是将其中大于 2 的數字乘以 2 得到一個新清單。怎麼搞?

代碼如下:

Python入門(18)

感覺怎麼樣?Python,你牛逼!

兄弟,驚呆了吧,别光傻笑啊,光看不練假把式,建議這個代碼趕緊随手寫十遍!

寫十遍!

寫十遍!

寫着寫着,

印象就深刻了,

忘不了了。

5、在函數中傳遞可變數量的參數

想象一下,如果我們有一個函數,它有多個形參,它的代碼塊能夠實作一些我們需要的功能。問題是,當參數的個數不确定時,函數代碼塊運算的結果可能不一樣。遇上這樣的情況,蛋刀我們需要為每一種可能去寫一個類似的函數嗎?

當然不需要,Python總有辦法搞定它。

它有這樣一種特殊的方法,即分别使用 * 或 ** 參數的字首,來實作彈性參數的傳遞。我們看下面的示例,當我們傳遞3個參數和2個參數時,函數都能執行,但結果不一樣。

Python入門(18)

因為我們在 args 變量前添加了一個 * 字首,這樣函數的所有其它的額外參數都将傳遞到 args 中,并作為一個元組予以儲存。如果采用的是 ** 字首,則額外的參數将被視為字典的鍵值配對。

6、assert 語句

assert 語句用以斷言(Assert)某事是真的。例如說你非常确定你正在使用的清單中至少包含一個元素,并想确認這一點,如果判斷失誤,就抛出一個錯誤,assert 語句就是這種情況下的理想選擇。當語句斷言失敗時,将會抛出 AssertionError類的異常(馬上介紹異常) 。

我們應該明智地選用 assert 語句。在大多數情況下,它好過捕獲異常,也好過定位問題或向使用者顯示錯誤資訊然後退出。

Python入門(18)

7、異常

跟程式的bug不同,有時,我們在編寫代碼的時候,無法預料此處的代碼處理是否會出現例外情形,而一旦出現例外,程式就會終止和報錯。這種情形被稱之為發生異常(Exception)。

Python入門(18)

Python通過使用 try...except 來處理異常狀況。

try語句按照如下方式工作:

(1)首先,執行try子句(在關鍵字try和關鍵字except之間的語句)

(2)如果沒有異常發生,忽略except子句,try子句執行後結束。

(3)如果在執行try子句的過程中發生了異常,那麼try子句餘下的部分将被忽略。如果異常的類型和 except 之後的名稱相符,那麼對應的except子句将被執行。

(4)最後執行 try 語句之後的代碼。如果一個異常沒有與任何的except比對,那麼這個異常将會傳遞給上層的try中。

一個 try 語句可能包含多個except子句,分别來處理不同的特定的異常。從官方文檔可以查詢更多的标準異常類。

學會處理異常,是一個程式員變得成熟的标志。

8、标準庫

最後,我們來介紹一下标準庫。Python 标準庫(Python Standrad Library)中包含了大量有用的子產品,它也是Python 安裝包中的一部分。

熟悉 Python 标準庫十分重要,這絕對是一個寶庫!因為你越熟悉它,你就越發現許多問題的輕松解決之道。如下列舉部分标準庫的常用子產品:

os:作業系統接口子產品

sys :系統内置函數子產品

glob:提供了一個函數用于從目錄通配符搜尋中生成檔案清單的子產品

re:為進階字元串處理提供正規表達式的工具子產品

math:數學運算子產品

random:提供生成随機數的工具子產品

date:日期時間子產品

zlib,gzip,bz2,zipfile,以及 tarfile:直接支援通用的資料打包和壓縮格式的子產品

我們需要強調的是,特别對于一個新手來說,當你尋求一個解決方案的時候,你不要總是苦兮兮的企圖自己手寫代碼來解決問題,很多時候,Python的标準庫已經為我們提供了非常完美的解決方案,至少可能提供解決方案的一大部分。是以,你要習慣于嘗試去更多的了解和熟悉Python的标準庫,知道它那裡面到底藏着多少寶貝,需要的時候,你隻需要導入子產品即可使用,這也是Python程式設計效率高的一個重要原因。

備注:你能在你的 Python 安裝包中附帶的文檔中查找到所有子產品的全部細節。

小結

我們在本章中介紹了有關 Python 的更多功能,但還是遠遠沒有涵蓋到 Python 的全部。不過,經過入門階段的學習,我們已經涉獵了大多數你将在實踐中遇到的東西,這足以讓你能夠開始編寫任何你所期望的程式。

到此,我們的Python入門課程就全部結束了。如果大家由此寫出了什麼好的代碼,記得過來分享哦。

總有人意猶未盡,是吧?

那好,還沒有散場的同學,悄悄告訴:課程的後面還有彩蛋哦!沒錯,聰明如你,明天繼續關注。