Python難點(diǎn)解析---高級(jí)篇2.Pythonic

何為Pythonic

在《The Zen of Python》中性昭,有以下說(shuō)明Python的禪意的內(nèi)容:

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than right now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

文中的句子一直在指引我們寫(xiě)出更美的Python代碼岩馍,更加Pythonic的代碼。Pythonic在這里可以理解成更加符合Python風(fēng)格的優(yōu)雅的代碼蚕捉,Python中提供了非常多的語(yǔ)法糖,合理使用的話(huà)我們可以讓整個(gè)代碼可讀性更強(qiáng)性能更好啃匿,維護(hù)成本更低,這樣也就達(dá)到了我們所謂的Pythonic

如何做到Pythonic

寫(xiě)出Pythonic的代碼需要我們?cè)诹私釶ython的語(yǔ)法特性的基礎(chǔ)上也了解其底層的實(shí)現(xiàn)溯乒,否則一個(gè)看似美麗的代碼可能存在非常大的性能危機(jī)夹厌,例如列表操作,若每次進(jìn)行查詢(xún)的時(shí)候都新建一份數(shù)據(jù)裆悄,將會(huì)是一個(gè)惡夢(mèng)矛纹。

最近瀏覽Youtube的時(shí)候看到了這樣的一個(gè)視頻,其中講述了關(guān)于如何寫(xiě)出Pythonic代碼的技巧光稼。

1.字典查找優(yōu)化

使用字典進(jìn)行查找性能優(yōu)化

通過(guò)使用字典或南,我們的查詢(xún)時(shí)間可以縮小到O(1),因?yàn)樽值涞讓佑玫?strong>Hash艾君,但這是個(gè)以空間換時(shí)間的做法采够,需要視情況而定。

2.使用slots進(jìn)行內(nèi)存優(yōu)化

使用__slots__進(jìn)行優(yōu)化

__slots__可以用來(lái)限制class能添加的屬性冰垄,他主要是告訴Python不要使用字典蹬癌,而使用一個(gè)固定量的內(nèi)存來(lái)保存所有的屬性,這樣能達(dá)到減輕內(nèi)存負(fù)擔(dān)的目的虹茶,通過(guò)使用這種方法逝薪,內(nèi)存可以減少30%~50%的占用。
具體可以看以下這篇文章蝴罪。

參考:

3.合并字典

合并字典

圖中這種方式是不Pythonic的董济,可讀性并不是特別好,以下提供了一種更經(jīng)典的Pythonic的處理方式要门。他通過(guò)字典的update方法來(lái)更新字典內(nèi)容虏肾。

經(jīng)典方式

另一種方式是通過(guò)字典表達(dá)式:

字典表達(dá)式

4.使用yield

通過(guò)yield我們可以得到內(nèi)存友好的生成器,在需要的時(shí)候才返回我們需要的值暂衡,而不是一次性生成在內(nèi)存中询微,是一種lazy的做法。
具體可以看此文中的生成器Python難點(diǎn)解析---初級(jí)篇3.迭代(可迭代狂巢、迭代器撑毛、生成器)

5.Lambda表達(dá)式

使用Lambda表達(dá)式我們可以來(lái)創(chuàng)建匿名函數(shù),對(duì)于一些簡(jiǎn)單的函數(shù)唧领,我們不是很必要使用def關(guān)鍵字來(lái)定義函數(shù)藻雌,通過(guò)Lambda表達(dá)式我們可以很簡(jiǎn)潔的得到函數(shù),例如我們有一個(gè)得到奇數(shù)的函數(shù)斩个,我們可以這樣定義:

oddfunc = lambda x : x % 2 == 0
#可以用于過(guò)濾列表之類(lèi)的~

6.給自定義類(lèi)型添加迭代

可以通過(guò)實(shí)現(xiàn)__iter__方法來(lái)實(shí)現(xiàn)迭代胯杭,實(shí)例如下:

class ShoppingCart:
    def __init__(self):
        self.items = []

    def add_item(self, it):
        self.items.append(it)

    # def __iter__(self):
    #     return self.items.__iter__()

    def __iter__(self):
        for i in sorted(self.items, key=lambda x: -x.price):
            yield i


class CartItem:
    def __init__(self, name, price):
        self.price = price
        self.name = name

具體可參考這個(gè)文章:Python難點(diǎn)解析---初級(jí)篇3.迭代(可迭代、迭代器受啥、生成器)

7.使用列表解析式

列表解析式是Python提供的用于生成列表的語(yǔ)法糖做个,通過(guò)添加限制條件和循環(huán)我們可以得到符合我們條件的列表數(shù)據(jù)鸽心。
例如我們要得到一組超過(guò)10的列表數(shù)據(jù):

list_comperhension = [x for x in range(20) if x > 10]
print(list_comperhension)

通過(guò)簡(jiǎn)潔的語(yǔ)法即可得到符合條件的列表,是一種非常Pythonic的方式居暖。

8.列表切片操作

關(guān)于列表的切片操作顽频,基本的規(guī)則可以這樣表示:list[start:end::step]

  • start表示開(kāi)始
  • end表示結(jié)束的索引
  • step表示索引的步長(zhǎng)

最重要的一點(diǎn)是,索引值是>=start而<end的太闺,例如list[1:3]糯景,則返回列表的索引值為1 2
參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末省骂,一起剝皮案震驚了整個(gè)濱河市蟀淮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钞澳,老刑警劉巖怠惶,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異略贮,居然都是意外死亡甚疟,警方通過(guò)查閱死者的電腦和手機(jī)仗岖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)逃延,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人轧拄,你說(shuō)我怎么就攤上這事揽祥。” “怎么了檩电?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵拄丰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我俐末,道長(zhǎng)料按,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任卓箫,我火速辦了婚禮载矿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烹卒。我一直安慰自己闷盔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布旅急。 她就那樣靜靜地躺著逢勾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪藐吮。 梳的紋絲不亂的頭發(fā)上溺拱,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天逃贝,我揣著相機(jī)與錄音,去河邊找鬼迫摔。 笑死秋泳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的攒菠。 我是一名探鬼主播迫皱,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辖众!你這毒婦竟也來(lái)了卓起?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凹炸,失蹤者是張志新(化名)和其女友劉穎戏阅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體啤它,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奕筐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了变骡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片离赫。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖塌碌,靈堂內(nèi)的尸體忽然破棺而出渊胸,到底是詐尸還是另有隱情,我是刑警寧澤台妆,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布翎猛,位于F島的核電站,受9級(jí)特大地震影響接剩,放射性物質(zhì)發(fā)生泄漏切厘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一懊缺、第九天 我趴在偏房一處隱蔽的房頂上張望疫稿。 院中可真熱鬧,春花似錦桐汤、人聲如沸而克。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)员萍。三九已至,卻和暖如春拣度,著一層夾襖步出監(jiān)牢的瞬間碎绎,已是汗流浹背螃壤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筋帖,地道東北人奸晴。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像日麸,于是被迫代替她去往敵國(guó)和親寄啼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容