1. 程式人生 > >你有多懂Python?看完這6道題差不多能算清楚了!

你有多懂Python?看完這6道題差不多能算清楚了!

你有多懂Python?看完這6道題差不多能算清楚了!

Python在設計上堅持了清晰劃一的風格,這使得Python成為一門易讀、易維護,並且被大量使用者所歡迎的、用途廣泛的語言。設計者開發時總的指導思想是,對於一個特定的問題,只要有一種最好的方法來解決就好了。


                學習Python中有不明白推薦加入交流群
                號:516107834
                群裡有志同道合的小夥伴,互幫互助,
                群裡有不錯的學習教程!

最近覺得 Python 太“簡單了”,於是在老司機面前放肆了一把:“我覺得 Python 是世界上最簡單的語言!”。於是老司機給我了一份滿分 100 分的6道題,下面是題目的錯誤實錄:

1、你恐怕不會留意到的列表生成器

檢查一下下面的程式碼會報錯的原因,並說出來?

你有多懂Python?看完這6道題差不多能算清楚了!

 

列表生成器的正解答案如下:

你有多懂Python?看完這6道題差不多能算清楚了!

 

你有多懂Python?看完這6道題差不多能算清楚了!

 

或者答案可以是這樣

你有多懂Python?看完這6道題差不多能算清楚了!

 

此內容的再補充

你有多懂Python?看完這6道題差不多能算清楚了!

 

你有多懂Python?看完這6道題差不多能算清楚了!

 

2、據說是最難得裝飾器描述:按照實際情況來寫一個類裝飾器用來度量函式/方法執行時間,你看怎麼實現?

你有多懂Python?看完這6道題差不多能算清楚了!

 

此類裝飾器能夠執行在普通函式上:

你有多懂Python?看完這6道題差不多能算清楚了!

 

此類裝飾器執行在方法上會報錯,為什麼?

你有多懂Python?看完這6道題差不多能算清楚了!

 

如果堅持使用類裝飾器,應該如何修改?

此問題的答案是

你有多懂Python?看完這6道題差不多能算清楚了!

 

你有多懂Python?看完這6道題差不多能算清楚了!

 

3、Python 呼叫機制看你會不會

描述:Python開發者們知道 __call__ 方法可以用來過載圓括號呼叫,其實問題根本不是這個。

你有多懂Python?看完這6道題差不多能算清楚了!

 

現在大家可以看到 a() 似乎等價於 a.__call__() ,好的,現在我們寫出瞭如下的程式碼

你有多懂Python?看完這6道題差不多能算清楚了!

 

你有多懂Python?看完這6道題差不多能算清楚了!

 

你有多懂Python?看完這6道題差不多能算清楚了!

 

你有多懂Python?看完這6道題差不多能算清楚了!

 

4、描述符你會犯錯嗎?

描述:如果要寫一個 Exam 類,其屬性 math 為 [0,100] 的整數,若賦值時不在此範圍內則丟擲異常,你是否決定用描述符來實現這個需求。

你有多懂Python?看完這6道題差不多能算清楚了!

 

看起來一切正常。不過嘗試說明是什麼問題,改寫 Grade 描述符試一下:

你有多懂Python?看完這6道題差不多能算清楚了!

 

不過這樣會導致更大的問題,請問該怎麼解決這個問題?

答案

你有多懂Python?看完這6道題差不多能算清楚了!

 

兩種方法

第一種:

你有多懂Python?看完這6道題差不多能算清楚了!

 

你有多懂Python?看完這6道題差不多能算清楚了!

 

你有多懂Python?看完這6道題差不多能算清楚了!

 

5、Python 繼承機制的坑

描述:

試求出以下程式碼的輸出結果。

你有多懂Python?看完這6道題差不多能算清楚了!

 

答案:輸出是 36 ,具體可以參考 New-style Classes , multiple-inheritance

6、Python 的特殊方法的使用模式

描述:寫了一個通過過載 new 方法來實現單例模式的類。

你有多懂Python?看完這6道題差不多能算清楚了!

 

現在有一堆類要實現為單例模式,打算照著寫一個元類,這樣可以讓程式碼複用:

你有多懂Python?看完這6道題差不多能算清楚了!

 

報錯啊,下面這段程式碼能夠捕獲一切屬性呼叫並列印引數

你有多懂Python?看完這6道題差不多能算清楚了!

 

試解釋為什麼給 getattribute 打補丁成功,而 new 打補丁失敗。

如果堅持使用元類給 new 打補丁來實現單例模式,應該怎麼修改?

答案:

  • 其實這是最氣人的一點,類裡的 __new__ 是一個 staticmethod 因此替換的時候必須以 staticmethod 進行替換。答案如下:

你有多懂Python?看完這6道題差不多能算清楚了!

 

結語:

Python這門語言還是博大精深的,如果你現在剛剛學不久就以為很好了,小心這裡面其實有很多坑。