幾種實用的pythonic文法執行個體代碼,pythonic文法

來源:互聯網
上載者:User

幾種實用的pythonic文法執行個體代碼,pythonic文法

前言

python 是一門簡單而優雅的語言,可能是過於簡單了,不用花太多時間學習就能使用,其實 python 裡面還有一些很好的特性,能大大簡化你代碼的邏輯,提高代碼的可讀性。

所謂Pythonic,就是極具Python特色的Python代碼(明顯區別於其它語言的寫法的代碼)

關於 pythonic,你可以在終端開啟 python,然後輸入 import this,看看輸出什麼,這就是 Tim Peters 的 《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!

使用產生器 yield

產生器是 python 裡面一個非常有用的文法特性,卻也是最容易被忽視的一個,可能是因為大部分能用產生器的地方也能用列表吧。

產生器可以簡單理解成一個函數,每次執行到 yield 語句就返回一個值,通過不停地調用這個函數,就能擷取到所有的值,這些值就能構成了一個等效的列表,但是與列表不同的是,這些值是不斷計算得出,而列表是在一開始就計算好了,這就是 lazy evaluation 的思想。這個特性在資料量特別大的情境非常有用,比如大資料處理,一次無法載入所有的檔案,使用產生器就能做到一行一行處理,而不用擔心記憶體溢出

def fibonacci(): num0 = 0 num1 = 1 for i in range(10):  num2 = num0 + num1  yield num2  num0 = num1  num1 = num2for i in fibonacci(): print(i)

用 else 子句簡化迴圈和異常

if / else 大家都用過,但是在 python 裡面,else 還可以用在迴圈和異常裡面

# pythonic 寫法for cc in ['UK', 'ID', 'JP', 'US']: if cc == 'CN':  breakelse: print('no CN')# 一般寫法no_cn = Truefor cc in ['UK', 'ID', 'JP', 'US']: if cc == 'CN':  no_cn = False  breakif no_cn: print('no CN')

else 放在迴圈裡面的含義是,如果迴圈全部遍曆完成,沒有執行 break,則執行 else 子句

# pythonic 寫法try: db.execute('UPDATE table SET xx=xx WHERE yy=yy')except DBError: db.rollback()else: db.commit()# 一般寫法has_error = Falsetry: db.execute('UPDATE table SET xx=xx WHERE yy=yy')except DBError: db.rollback() has_error = Trueif not has_error: db.commit()

else 放到異常裡面可以表示,如果沒有異常發生需要執行的操作

用 with 子句自動管理資源

我們都知道,開啟的檔案需要在用完之後關閉,要不就會造成資源流失,但是實際編程的時候經常會忘記關閉,特別是在一些邏輯複雜的情境中,更是如此,python 有一個優雅地解決方案,那就是 with 子句

# pythonic 寫法with open('pythonic.py') as fp: for line in fp:  print(line[:-1])# 一般寫法fp = open('pythonic.py')for line in fp: print(line[:-1])fp.close()

使用 with as 語句後,無需手動調用 fp.close() , 在範圍結束後,檔案會被自動 close 掉,完整的執行過如下:

  • 調用 open('pythonic.py') ,返回的一個對象 obj,
  • 調用 obj.__enter__() 方法,返回的值賦給 fp
  • 執行 with 中的代碼塊
  • 執行 obj.__exit__()
  • 如果這個過程發生異常,將異常傳給 obj.__exit__() ,如果 obj.__exit__() 返回 False, 異常將被繼續拋出,如果返回 True,異常被掛起,程式繼續運行

列表推導與產生器運算式

列表推導

[expr for iter_var in iterable if cond_expr]

產生器運算式

(expr for iter_var in iterable if cond_expr)

列表推導和產生器運算式提供了一種非常簡潔高效的方式來建立列表或者迭代器

# pythonic 寫法squares = [x * x for x in range(10)]# 一般寫法squares = []for x in range(10): squares.append(x * x)

用 items 遍曆 map

python 裡面 map 的遍曆有很多種方式,在需要同事使用 key 和 value 的場合,建議使用 items() 函數

m = {'one': 1, 'two': 2, 'three': 3}for k, v in m.items(): print(k, v)for k, v in sorted(m.items()): print(k, v)

參考連結

Google python 語言規範: http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_language_rules/

《編寫高品質代碼:改善 Python 程式的91個建議》

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對幫客之家的支援。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.