培養python思維(1)

2021-09-27 07:22:39 字數 2734 閱讀 8345

對於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 計算機技術下生成的各種產品風靡當代,人們對文盲的定義不僅僅是文化知識的匱乏,在一定程度上,對計算機知識的掌握程度也成為衡量乙個人能力水平的標準。而對乙個計算機專業的大一學生來說,若只是滿足於熬過了 機盲 比起文盲,機盲可能更貼切一點兒 這個過程,那就大錯特錯了。...