幾種實(shí)用的pythonic語法實(shí)例代碼
前言
python 是一門簡單而優(yōu)雅的語言,可能是過于簡單了,不用花太多時間學(xué)習(xí)就能使用,其實(shí) python 里面還有一些很好的特性,能大大簡化你代碼的邏輯,提高代碼的可讀性。
所謂Pythonic,就是極具Python特色的Python代碼(明顯區(qū)別于其它語言的寫法的代碼)
關(guān)于 pythonic,你可以在終端打開 python,然后輸入 import this,看看輸出什么,這就是 Tim Peters 的 《The Zen of Python》,這首充滿詩意的詩篇里概況了 python 的設(shè)計哲學(xué),而這些思想,其實(shí)在所有語言也基本上是通用的
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 里面一個非常有用的語法特性,卻也是最容易被忽視的一個,可能是因?yàn)榇蟛糠帜苡蒙善鞯牡胤揭材苡昧斜戆伞?/p>
生成器可以簡單理解成一個函數(shù),每次執(zhí)行到 yield 語句就返回一個值,通過不停地調(diào)用這個函數(shù),就能獲取到所有的值,這些值就能構(gòu)成了一個等效的列表,但是與列表不同的是,這些值是不斷計算得出,而列表是在一開始就計算好了,這就是 lazy evaluation 的思想。這個特性在數(shù)據(jù)量特別大的場景非常有用,比如大數(shù)據(jù)處理,一次無法加載所有的文件,使用生成器就能做到一行一行處理,而不用擔(dān)心內(nèi)存溢出
def fibonacci(): num0 = 0 num1 = 1 for i in range(10): num2 = num0 + num1 yield num2 num0 = num1 num1 = num2 for i in fibonacci(): print(i)
用 else 子句簡化循環(huán)和異常
if / else 大家都用過,但是在 python 里面,else 還可以用在循環(huán)和異常里面
# pythonic 寫法
for cc in ['UK', 'ID', 'JP', 'US']:
if cc == 'CN':
break
else:
print('no CN')
# 一般寫法
no_cn = True
for cc in ['UK', 'ID', 'JP', 'US']:
if cc == 'CN':
no_cn = False
break
if no_cn:
print('no CN')
else 放在循環(huán)里面的含義是,如果循環(huán)全部遍歷完成,沒有執(zhí)行 break,則執(zhí)行 else 子句
# pythonic 寫法
try:
db.execute('UPDATE table SET xx=xx WHERE yy=yy')
except DBError:
db.rollback()
else:
db.commit()
# 一般寫法
has_error = False
try:
db.execute('UPDATE table SET xx=xx WHERE yy=yy')
except DBError:
db.rollback()
has_error = True
if not has_error:
db.commit()
else 放到異常里面可以表示,如果沒有異常發(fā)生需要執(zhí)行的操作
用 with 子句自動管理資源
我們都知道,打開的文件需要在用完之后關(guān)閉,要不就會造成資源泄露,但是實(shí)際編程的時候經(jīng)常會忘記關(guān)閉,特別是在一些邏輯復(fù)雜的場景中,更是如此,python 有一個優(yōu)雅地解決方案,那就是 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 語句后,無需手動調(diào)用 fp.close() , 在作用域結(jié)束后,文件會被自動 close 掉,完整的執(zhí)行過如下:
- 調(diào)用
open('pythonic.py'),返回的一個對象 obj, - 調(diào)用
obj.__enter__()方法,返回的值賦給 fp - 執(zhí)行 with 中的代碼塊
- 執(zhí)行
obj.__exit__() - 如果這個過程發(fā)生異常,將異常傳給
obj.__exit__(),如果obj.__exit__()返回 False, 異常將被繼續(xù)拋出,如果返回 True,異常被掛起,程序繼續(xù)運(yùn)行
列表推導(dǎo)與生成器表達(dá)式
列表推導(dǎo)
[expr for iter_var in iterable if cond_expr]
生成器表達(dá)式
(expr for iter_var in iterable if cond_expr)
列表推導(dǎo)和生成器表達(dá)式提供了一種非常簡潔高效的方式來創(chuàng)建列表或者迭代器
# 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() 函數(shù)
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 語言規(guī)范: http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_language_rules/
《編寫高質(zhì)量代碼:改善 Python 程序的91個建議》
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
PyTorch中Tensor的數(shù)據(jù)統(tǒng)計示例
今天小編就為大家分享一篇PyTorch中Tensor的數(shù)據(jù)統(tǒng)計示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Django的URLconf中使用缺省視圖參數(shù)的方法
這篇文章主要介紹了Django的URLconf中使用缺省視圖參數(shù)的方法,Django是最著名的Python的web開發(fā)框架,需要的朋友可以參考下2015-07-07
Django實(shí)現(xiàn)一對多表模型的跨表查詢方法
今天小編就為大家分享一篇Django實(shí)現(xiàn)一對多表模型的跨表查詢方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
Python?Haul利器簡化數(shù)據(jù)爬取任務(wù)提高開發(fā)效率
Haul?是一個專門為數(shù)據(jù)爬取任務(wù)而設(shè)計的?Python?庫,它提供了一系列的工具和功能,幫助我們輕松處理數(shù)據(jù)爬取中的重復(fù)工作和復(fù)雜問題2024-01-01
使用 python 實(shí)現(xiàn)單人AI 掃雷游戲
這篇文章主要介紹了使用 python 實(shí)現(xiàn)單人AI 掃雷游戲,今天我們用 Python 完成這個小程序,并且用AI來學(xué)習(xí)并實(shí)現(xiàn)它,需要的朋友可以參考下2021-08-08

