最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何更優(yōu)雅地寫python代碼

 更新時間:2019年07月02日 10:12:15   作者:FOOFISH-PYTHON之禪  
這篇文章主要介紹了如何更優(yōu)雅地寫python代碼,我們寫代碼,往往還是按照其它語言的思維習(xí)慣來寫,那樣的寫法不僅運(yùn)行速度慢,代碼讀起來也費(fèi)盡,給人一種拖泥帶水的感覺,需要的朋友可以參考下

前言

Python 這門語言最大的優(yōu)點之一就是語法簡潔,好的代碼就像偽代碼一樣,干凈、整潔、一目了然。但有時候我們寫代碼,特別是 Python 初學(xué)者,往往還是按照其它語言的思維習(xí)慣來寫,那樣的寫法不僅運(yùn)行速度慢,代碼讀起來也費(fèi)盡,給人一種拖泥帶水的感覺,過段時間連自己也讀不懂。

《計算機(jī)程序的構(gòu)造和解釋》的作者哈爾·阿伯爾森曾這樣說:“Programs must be written for people to read, and only incidentally for machines to execute.”

要寫出 Pythonic(優(yōu)雅的、地道的、整潔的)代碼,還要平時多觀察那些大牛代碼,Github 上有很多非常優(yōu)秀的源代碼值得閱讀,比如:requests、flask、tornado,筆者列舉一些常見的 Pythonic 寫法,希望能給你帶來一點啟迪。

1、變量交換

大部分編程語言中交換兩個變量的值時,不得不引入一個臨時變量:

>>> a = 1
>>> b = 2
>>> tmp = a
>>> a = b
>>> b = tmp

pythonic

>>> a, b = b, a

2、循環(huán)遍歷區(qū)間元素

for i in [0, 1, 2, 3, 4, 5]:
(print i)
# 或者
for i in range(6):
(print i)

pythonic

for i in xrange(6):
(print i)

xrange 返回的是生成器對象,生成器比列表更加節(jié)省內(nèi)存,不過需要注意的是 xrange 是 python2 中的寫法,python3 只有 range 方法,特點和 xrange 是一樣的。

3、帶有索引位置的集合遍歷

遍歷集合時如果需要使用到集合的索引位置時,直接對集合迭代是沒有索引信息的,普通的方式使用:

colors = ['red', 'green', 'blue', 'yellow']
for i in range(len(colors)):
print (i, '--->', colors[i])

pythonic

for i, color in enumerate(colors):
print (i, '--->', color)

4、字符串連接

字符串連接時,普通的方式可以用 + 操作

names = ['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie']
s = names[0]
for name in names[1:]:
s += ', ' + name
print (s)

pythonic

print (', '.join(names))

join 是一種更加高效的字符串連接方式,使用 + 操作時,每執(zhí)行一次+操作就會導(dǎo)致在內(nèi)存中生成一個新的字符串對象,遍歷8次有8個字符串生成,造成無謂的內(nèi)存浪費(fèi)。而用 join 方法整個過程只會產(chǎn)生一個字符串對象。

5、打開/關(guān)閉文件

執(zhí)行文件操作時,最后一定不能忘記的操作是關(guān)閉文件,即使報錯了也要 close。普通的方式是在 finnally 塊中顯示的調(diào)用 close 方法。

f = open('data.txt')
try:
data = f.read()
finally:
f.close()

pythonic

with open('data.txt') as f:
data = f.read()

使用 with 語句,系統(tǒng)會在執(zhí)行完文件操作后自動關(guān)閉文件對象。

6、列表推導(dǎo)式

能夠用一行代碼簡明扼要地解決問題時,絕不要用兩行,比如

result = []
for i in range(10):
s = i*2
result.append(s)

pythonic

[i*2 for i in xrange(10)]

與之類似的還有生成器表達(dá)式、字典推導(dǎo)式,都是很 pythonic 的寫法。

7、善用裝飾器

裝飾器可以把與業(yè)務(wù)邏輯無關(guān)的代碼抽離出來,讓代碼保持干凈清爽,而且裝飾器還能被多個地方重復(fù)利用。比如一個爬蟲網(wǎng)頁的函數(shù),如果該 URL 曾經(jīng)被爬過就直接從緩存中獲取,否則爬下來之后加入到緩存,防止后續(xù)重復(fù)爬取。

def web_lookup(url, saved={}):
if url in saved:
return saved[url]
page = urllib.urlopen(url).read()
saved[url] = page
return page

pythonic

import urllib #py2
#import urllib.request as urllib # py3
def cache(func):
saved = {}
def wrapper(url):
if url in saved:
return saved[url]
else:
page = func(url)
saved[url] = page
return page
return wrapper
@cache
def web_lookup(url):
return urllib.urlopen(url).read()

用裝飾器寫代碼表面上感覺代碼量更多,但是它把緩存相關(guān)的邏輯抽離出來了,可以給更多的函數(shù)調(diào)用,這樣總的代碼量就會少很多,而且業(yè)務(wù)方法看起來簡潔了。

8、合理使用列表
列表對象(list)是一個查詢效率高于更新操作的數(shù)據(jù)結(jié)構(gòu),比如刪除一個元素和插入一個元素時執(zhí)行效率就非常低,因為還要對剩下的元素進(jìn)行移動

names = ['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie']
names.pop(0)
names.insert(0, 'mark')

pythonic

from collections import deque
names = deque(['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie'])
names.popleft()
names.appendleft('mark')

deque 是一個雙向隊列的數(shù)據(jù)結(jié)構(gòu),刪除元素和插入元素會很快

9、序列解包

p = 'vttalk', 'female', 30, 'python@qq.com'
name = p[0]
gender = p[1]
age = p[2]
email = p[3]

pythonic

name, gender, age, email = p

10、遍歷字典的 key 和 value

方法一速度沒那么快,因為每次迭代的時候還要重新進(jìn)行hash查找 key 對應(yīng)的 value。

方法二遇到字典非常大的時候,會導(dǎo)致內(nèi)存的消耗增加一倍以上

# 方法一
for k in d:
print (k, '--->', d[k])
# 方法二
for k, v in d.items():
print (k, '--->', v)

pythonic

for k, v in d.iteritems():
print (k, '--->', v)

iteritems 返回迭代器對象,可節(jié)省更多的內(nèi)存,不過在 python3 中沒有該方法了,只有 items 方法,等值于 iteritems。

​當(dāng)然還有很多 pythonic 寫法,在此不再一一列舉。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python使用tkinter實現(xiàn)搖骰子小游戲功能的代碼

    Python使用tkinter實現(xiàn)搖骰子小游戲功能的代碼

    這篇文章主要介紹了Python使用tkinter實現(xiàn)的搖骰子小游戲功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Python Numpy中數(shù)組的集合操作詳解

    Python Numpy中數(shù)組的集合操作詳解

    這篇文章主要為大家詳細(xì)介紹了Python Numpy中數(shù)組的一些集合操作方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下
    2022-08-08
  • 解決pytorch 交叉熵?fù)p失輸出為負(fù)數(shù)的問題

    解決pytorch 交叉熵?fù)p失輸出為負(fù)數(shù)的問題

    這篇文章主要介紹了解決pytorch 交叉熵?fù)p失輸出為負(fù)數(shù)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 解決使用export_graphviz可視化樹報錯的問題

    解決使用export_graphviz可視化樹報錯的問題

    今天小編就為大家分享一篇解決使用export_graphviz可視化樹報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python Django實戰(zhàn)之歌曲搜索功能實現(xiàn)

    python Django實戰(zhàn)之歌曲搜索功能實現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了如何利用python Django實現(xiàn)歌曲搜索功能,文中的示例代碼講解詳細(xì),具有一定的參考價值,有需要的小伙伴開業(yè)了解下
    2023-10-10
  • Django+vue+vscode前后端分離搭建的實現(xiàn)

    Django+vue+vscode前后端分離搭建的實現(xiàn)

    本文以一個非常簡單的demo為例,介紹了利用django+drf+vue的前后端分離開發(fā)模式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2023-08-08
  • python實現(xiàn)從字典中刪除元素的方法

    python實現(xiàn)從字典中刪除元素的方法

    這篇文章主要介紹了python實現(xiàn)從字典中刪除元素的方法,涉及Python中del方法的使用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-05-05
  • python中IO流和對象序列化詳解

    python中IO流和對象序列化詳解

    大家好,本篇文章主要講的是python中IO流和對象序列化詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • python等待10秒執(zhí)行下一命令的方法

    python等待10秒執(zhí)行下一命令的方法

    在本篇文章里小編給大家整理的是關(guān)于python等待10秒執(zhí)行下一命令的方法及實例,需要的朋友們可以參考下。
    2020-07-07
  • python中子類繼承父類的__init__方法實例

    python中子類繼承父類的__init__方法實例

    這篇文章主要給大家詳細(xì)介紹了python中子類如何繼承父類的__init__方法,文中給出了詳細(xì)的示例代碼,相信對大家的理解和學(xué)習(xí)具有一定參考價值,有需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-12-12

最新評論

衡南县| 达州市| 独山县| 体育| 阿巴嘎旗| 祁东县| 炎陵县| 安徽省| 阳东县| 东明县| 田林县| 高邮市| 临汾市| 琼中| 福贡县| 东兴市| 镇江市| 马边| 卢氏县| 应用必备| 且末县| 乐安县| 玉树县| 天长市| 堆龙德庆县| 阜新| 贵港市| 江城| 永定县| 汉源县| 香港| 大城县| 遂溪县| 阜阳市| 洛隆县| 安阳市| 新龙县| 吐鲁番市| 宁国市| 商河县| 广州市|