python中比較pythonic的地方

  • 變量交換
>>> a, b = b, a
  • 循環遍歷區間元素
>>>for i in range(10):
...    print (i)

返回的是生成器對象,生成器比列表更加節省內存

  • 帶索引位置的循環遍歷
>>>colors = ['red', 'green', 'blue', 'yellow']

>>>for i, color in enumerate(colors):
...    print (i, 'mapping', color)
  • 字符串連接
>>>colors = ['red', 'green', 'blue', 'yellow']
>>>print( ', ', join( colors ) )

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

  • 打開/關閉文件
 >>>with open('data.txt') as f:
 ...   data = f.read()
  • 列表推導式
 result = []
for i in range( 10 ):
    s = i * 2
    result.append( s )

應該寫成:

[ i * 2 for i in range( 10 ) ]
  • 裝飾器

    裝飾器可以把與業務邏輯無關的代碼抽離出來,讓代碼保持乾淨清爽,而且裝飾器還能被多個地方重複利用。比如一個爬蟲網頁的函數,如果該 URL 曾經被爬過就直接從緩存中獲取,否則爬下來之後加入到緩存,防止後續重複爬取。

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.request

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()
  • 列表的操作

列表對象(list)是一個查詢效率高於更新操作的數據結構,比如刪除一個元素和插入一個元素時執行效率就非常低,因爲還要對剩下的元素進行移動

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 是一個雙向隊列的數據結構,刪除元素和插入元素會很快

  • 序列解包
p = 'vttalk', 'female', 30, '[email protected]'

name = p[0]
gender = p[1]
age = p[2]
email = p[3]

pythonic

name, gender, age, email = p

參考資料:知乎
鏈接:https://zhuanlan.zhihu.com/p/25518608

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