Python難點解析---高級篇2.Pythonic

何爲Pythonic

在《The Zen of Python》中,有以下說明Python的禪意的內容:

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!

文中的句子一直在指引我們寫出更美的Python代碼,更加Pythonic的代碼。Pythonic在這裏可以理解成更加符合Python風格的優雅的代碼,Python中提供了非常多的語法糖,合理使用的話我們可以讓整個代碼可讀性更強性能更好維護成本更低,這樣也就達到了我們所謂的Pythonic

如何做到Pythonic

寫出Pythonic的代碼需要我們在瞭解Python的語法特性的基礎上也瞭解其底層的實現,否則一個看似美麗的代碼可能存在非常大的性能危機,例如列表操作,若每次進行查詢的時候都新建一份數據,將會是一個惡夢。

最近瀏覽Youtube的時候看到了這樣的一個視頻,其中講述了關於如何寫出Pythonic代碼的技巧。

1.字典查找優化

使用字典進行查找性能優化

通過使用字典,我們的查詢時間可以縮小到O(1),因爲字典底層用的Hash,但這是個以空間換時間的做法,需要視情況而定。

2.使用__slots__進行內存優化

使用__slots__進行優化
__slots__可以用來限制class能添加的屬性,他主要是告訴Python不要使用字典,而使用一個固定量的內存來保存所有的屬性,這樣能達到減輕內存負擔的目的,通過使用這種方法,內存可以減少**30%~50%**的佔用。
具體可以看以下這篇文章

參考:

3.合併字典

合併字典

圖中這種方式是不Pythonic的,可讀性並不是特別好,以下提供了一種更經典的Pythonic的處理方式。他通過字典的update方法來更新字典內容。
經典方式

另一種方式是通過字典表達式:

字典表達式

4.使用yield

通過yield我們可以得到內存友好的生成器,在需要的時候才返回我們需要的值,而不是一次性生成在內存中,是一種lazy的做法。
具體可以看此文中的生成器:[Python難點解析—初級篇3.迭代(可迭代、迭代器、生成器)]

5.Lambda表達式

使用Lambda表達式我們可以來創建匿名函數,對於一些簡單的函數,我們不是很必要使用def關鍵字來定義函數,通過Lambda表達式我們可以很簡潔的得到函數,例如我們有一個得到奇數的函數,我們可以這樣定義:

oddfunc = lambda x : x % 2 == 0
#可以用於過濾列表之類的~

6.給自定義類型添加迭代

可以通過實現__iter__方法來實現迭代,實例如下:

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

具體可參考這個文章:[Python難點解析—初級篇3.迭代(可迭代、迭代器、生成器)](http://www.jianshu.com/p/211955d5e8e6)

7.使用列表解析式

列表解析式是Python提供的用於生成列表的語法糖,通過添加限制條件和循環我們可以得到符合我們條件的列表數據。
例如我們要得到一組超過10的列表數據:

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

通過簡潔的語法即可得到符合條件的列表,是一種非常Pythonic的方式。

8.列表切片操作

關於列表的切片操作,基本的規則可以這樣表示:list[start:end::step]

  • start表示開始
  • end表示結束的索引
  • step表示索引的步長

最重要的一點是,索引值是>=start而<end的,例如list[1:3],則返回列表的索引值爲1 2
參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章