Python裡面這些點,據說80%的新手學習都會一臉懵逼

Python雖然語法簡單,通俗易懂,但是再簡單它也是一門語言,

就像一棵大樹,總有一些樹枝是彎彎繞繞的,讓新手看完之後一臉懵逼,今天我們就來說說這幾個點,反正我學的時候是很困惑的!

01.函數里面的 *args

1).可變參數

這個是什麼鬼,尤其是有其他c,c++語言基礎的人,看到這個點,一定懵逼了,難道是指針,兩個**又是什麼鬼?

其實這個Python裡面的函數入參的幾種形式,假如你來設計一個語言,一個函數fun(),裡面要傳參數進來,要考慮擴展性:變量會有很多種形態,有可能是變量,也可能是數組,也可能是結構體,或者是哈希數組。

Python資料獲取方式 :轉發文章+關注私信【Python】

比如你有一個累加功能的函數:

Python裡面這些點,據說80%的新手學習都會一臉懵逼

每次調用函數都要傳一個列表或者元組進去,非常死板,不靈活,如果我要傳多個列表,多個變量,我又不想改接口,但是改成下面這樣就靈活很多:

Python裡面這些點,據說80%的新手學習都會一臉懵逼

*args:表示可變參數,就是傳入的參數個數是可變的,可以是1個、2個到任意個或者0個,其實就是把一堆參數當作一個數組(Python列表或者元組傳遞進來)。

02.關鍵字參數 **kwargs

關鍵字參數可以讓你輸入0或者多個含參數名的參數,並且自動組裝為一個字典

Python裡面這些點,據說80%的新手學習都會一臉懵逼

你函數的接口設定為**kwargs,這樣的好處,一個是靈活,擴展性好,也就是說我預留的了擴展的接口,你程序調用的時候可以根據自己的需求傳1個,多個或者不傳都可以。

另外:不用太糾集args和kwargs這些英語單詞,只是大家約定這麼叫而已

03.臉萌的@property

有其他經驗的程序員,看到這個奇奇怪怪的@加一個關鍵字,一定是一臉懵逼,這其實是Python類裡面的一些封裝。這些都是類的內置裝飾器,有一些特殊的用途!

1).裝飾器@property

我們大部分人都比較熟悉比如Java的get/set方法,比如:

Python裡面這些點,據說80%的新手學習都會一臉懵逼

2).但是這樣寫比較麻煩,需要通過函數get/set 來訪問屬性

有木有直接對屬性進行操作的同時就可以對屬性進行處理,比如我們調用student.score=88,這一個時候會自動調用set_score函數,這樣就非常靈活和簡便!

Python裡面為了簡潔和優雅,設計了@property

Python裡面這些點,據說80%的新手學習都會一臉懵逼

對於外邊訪問的屬性score,我們通過Python類中的property裝飾器對它進行升級,改造,讓它能變的更加靈活和強大!

其實它就是綁定了一些方法(fget,fset和fdel).尤其是你對屬性進行升級功能而不改變外邊代碼的時候,這一招就非常有用!

04.傻傻分不清@classmethod和@staticmethod

看完了上面的property,剛剛回過神,現在又來了兩個更大的傢伙是啥,其實這個兩個類裝飾器都是類裡面的概念!

只要是寫代碼最後一定會走到類而類的封裝和擴展是必須要掌握的,如何能有更好的封裝性呢,classmethod和staticmethod就派上用場了!

1).假如有一個場景,計算日期的類

Python裡面這些點,據說80%的新手學習都會一臉懵逼

2).更改需求,如果我們傳入的類初始化是字符串型日期

我們目前的類的init函數是一個三個參數的,如果我們希望我們傳入一個字符串性的日期"2018-10-8",然後返回像上面的日期2018/10/8,怎麼辦呢?

傳統的做法:

Python裡面這些點,據說80%的新手學習都會一臉懵逼

這樣的做法會導致每次初始化的時候,都要先分割成3個參數再導入類,非常麻煩!

@staticmethod(類的靜態方法就派上場)

Python裡面這些點,據說80%的新手學習都會一臉懵逼

通過靜態函數,直接內置了分割的功能,會簡潔很多,而且封裝性也好很多!

3).但是靜態方法也有弊端

因為靜態方法是硬編碼,如果我們修改了Date這個類的名字,比如叫MyDate這樣的話,會導致我們寫的format_date裡面的代碼也要改,因為我們直接是return Date()... ,

好這個時候類方法classmethod上場了

Python裡面這些點,據說80%的新手學習都會一臉懵逼

我們申明瞭一個類方法format_date2,裡面有一個非常關鍵的變量cls,其實它就是類本身,這樣無論我們把類的名字改成什麼,都沒有關係,因為我們返回的就是cls(...),這樣代碼的柔性就強了很多!

有同學看到這裡會問,那靜態函數還有什麼用處,類方法都能代替了!在做一些類的預處理,或者條件判斷的時候,靜態函數還是很有用的!

05.super是啥

都說Python語言跟英語很類似,語法簡單,通俗易懂,但是看到super這樣關鍵字的時候,會有點懵懂!

其實只要是面向對象的語言,都有類的繼承啊,組合等等。Python當然也有這樣的設計,其實如果學過Java會非常好理解!比如子類要調用父類的方法,或者覆蓋父類的方法都會用到super().

1).調用父類的方法

Python裡面這些點,據說80%的新手學習都會一臉懵逼

有的同學說我是不是可以直接調用A.say_hello(self),最好不要,涉及多重繼承的時候就會有問題

2).初始化父類的__init__方法

Python裡面這些點,據說80%的新手學習都會一臉懵逼

06.ABC模塊

新手有的時候看到下面的代碼會很懵,有點丈二和尚摸不著頭腦的趕腳:

Python裡面這些點,據說80%的新手學習都會一臉懵逼

C++裡面有抽象基類的概念,Python裡面的類在設計的時候,也考慮到了這一點,但是由於Python本身的特性是一切皆對象,大部分的時候都依賴鴨子類型。

為了完成抽象基類的功能,藉助了第三方模塊abc(abc是抽象類的縮寫,不是英語abc的意思)

b=Bird()

TypeError: Can't instantiate abstract class Bird with abstract methods fly

Bird繼承ABC,也就是說Bird是一個抽象類,不能被初始化,比如你初始化一下,會報錯的。

這個類的目的就是讓繼承它的子類一定要實例化fly函數,否則子類也永遠無法實例化

Python裡面這些點,據說80%的新手學習都會一臉懵逼

其實當你完全熟悉這些用法之後,你要開始思考Python為啥要這麼設計,慢慢的你就會領悟Python這門語言的設計思想,而不是隻是看它的招式,當你明白裡招式背後的含義,恭喜你,你的功力又大漲了!

2019年最新Python教程

如果你處於想學Python或者正在學習Python,Python的教程不少了吧,但是是最新的嗎?

2019Python自學教程全新升級為《Python+數據分析+機器學習》,九大階段能力逐級提升,打造技能更全面的全棧工程師。

Python裡面這些點,據說80%的新手學習都會一臉懵逼

Python裡面這些點,據說80%的新手學習都會一臉懵逼

Python裡面這些點,據說80%的新手學習都會一臉懵逼

以上這Java和python自學教程小編已經為大家打包準備好了,希望對正在學習的你有所幫助!

獲取方式:轉發此文+關注 並 私信小編 “ 資料”,即可免費獲取哦


分享到:


相關文章: