對於python新手來說,寫**很少考慮**的效率和簡潔性,因此容易造成**冗長、執行慢,這些都是需要改進的地方。本文是想通過幾個案列給新手一點啟發,怎樣寫python**更優雅。
標準庫itertools和collections仍然很少被初學者使用
如果你看到下面的任務:
list1 = range(1,10)
list2 = range(10,20)
for item1 in list1:
for item2 in list2:
print(item1*item2)
這是乙個巢狀迴圈操作,為提高**效率,完全可以用product()函式替代巢狀迴圈:
from itertools import product
list1 = range(1,10)
list2 = range(10,20)
for item1,item2 in product(list1, list2):
print(item1*item2)
這兩段**的結果完全一樣,但使用標準庫函式明顯更加簡潔高效。itertools還有很多方便操作迭代物件的函式,比如:
新手對python集合模組了解的可能並不多,你可能會遇到這樣的情形:
consolidated_list = [('a',1),('b',2),('c',3),('b',4)]
items_by_id = {}
for id_, item in consolidated_list:
if id_ not in items_by_id:
items_by_id[id_] =
if id_ in items_by_id:
上面**構建了乙個字典,依次向字典中新增資訊,如果某個鍵已經存在,則以某種方式修改該鍵的值;如果某個鍵不存在,則新增對應鍵值對。
這種演算法非常常見,你可以用collects模組的defaultdict()函式來實現同樣效果:
from collections import defaultdict
items_by_id = defaultdict(list)
consolidated_list = [('a',1),('b',2),('c',3),('b',4)]
for id_, item in consolidated_list:
在此列中,defaultdict()接受乙個list作為引數,當鍵不存在時,則返回乙個空列表作為對應值。
有時候我們會遇到統計詞頻的案例,比如:
# 統計詞頻
colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
result = {}
for color in colors:
if result.get(color)==none:
result[color]=1
else:
result[color]+=1
print (result)
# 輸出
完全可以用defaultdict()函式實現上面的計數功能:
colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
d = defaultdict(int)
for color in colors:
d[color] += 1
print(d)
更簡單的方法用collections模組的counter()函式:
from collections import counter
colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
c = counter(colors)
print (dict(c))
對於備份檔案,新人往往會用system模組:
from os import system
system("xcopy e:\\sample.csv e:\\newfile\\")
其實shutil模組更好用:
import shutil
shutil.copyfile('e:\\q.csv', 'e:\\movie\\q.csv')
因為shutil會很詳細地報告錯誤和異常。
除非你的list十分複雜,並且頻繁呼叫,否則都建議使用生成器,因為它非常節省記憶體,舉個例子:
def powers_of_two(max=20000):
i = 0
powers =
while 2**i < max:
i += 1
return powers
對於使用次數少、佔據大量記憶體、且容易生成的資料,可以用生成器替代列表儲存:
from itertools import count, takewhile
def powers_of_two(max=20000):
for index in takewhile(lambda i: 2**i < max, count(start=0)):
yield 2**index
本文部分內容節選自tony flury在quora的回答 如何培養優秀思維
1.目標導向 為達目標而努力 很多人忘了自己的目標而不能堅持 2.利他 利他的人眼光更遠,利他是為了更好和利己 3.迭代 要改變,優化自己 4.用忙碌打敗無聊 無聊 忙碌 忙得有意義 既然運動,就能夠產生可能性與意義 優秀的人,都是忙出來的。5.整合 從外部資訊裡提取對自己有價值的東西 很少是排斥外...
工程思維的培養
我們應當注重對工程思維的培養,在很多方面需要對工程思維的投入。事實上,從二十拼裝玩具的娛樂開始,人類的工程思維能力就得到了鍛鍊和發展。工程思維設計改造世界的活動,為了改善生活,人們應用工程思維及所掌握的或觀察到的事物 技術及方法去想象和重建人類的世界。通常就工程思維與創造性活動相聯絡,工程思維涉及尋...
計算思維的培養
由啟蒙書 計算思維導論 討論開來.1 計算機技術下生成的各種產品風靡當代,人們對文盲的定義不僅僅是文化知識的匱乏,在一定程度上,對計算機知識的掌握程度也成為衡量乙個人能力水平的標準。而對乙個計算機專業的大一學生來說,若只是滿足於熬過了 機盲 比起文盲,機盲可能更貼切一點兒 這個過程,那就大錯特錯了。...