Python 是一門面向對象語言,因此我們有必要熟悉面向對象的一些設計原則 。
單一職責原則是指一個函數只做一件事,不要將多個功能集中在同一個函數中,不要大而全,要小而精 。這樣,當有需求變化時,我們只需要修改對應的部分即可,程序應對變化的能力明顯提升 。
開放封閉原則是指對擴展開放,對修改關閉 。
寫程序的都知道,甲方是善變的,今天說用這種方式實現,明天可能就變卦了,這太正常了 。所以我們寫程序時一定要注意程序的可擴展性,當甲方改動需求時,我們盡可能地少改動或者不改動原有代碼,而是通過添加新的實現類來擴展功能,這意味著你系統的原有功能是不會遭到破壞的,則穩定性有極大提升 。
接口隔離原則是指調用方不應該依賴其不需要的接口,接口間的依賴關系應當建立在最小功能接口原則之上 。
單一職責和接口隔離都是為了提高類的內聚性,降低他們之間的耦合性 。這是面向對象封裝思想的完美體現 。
0x02對文件對象使用with語句
當在一個項目上工作時,我們經常會對文件進行讀寫操作 。最常見的方法是使用open()函數打開一個文件,它會創建一個我們可以操作的文件對象,然后作為一個習慣的做法,我們應該使用close()關閉該文件對象 。
f = open(‘dataset.txt’, ‘w’)
f.write(‘new_data’)
f.close()
這很容易記住,但有時寫了幾個小時的代碼,我們可能會忘記用f.close()關閉f文件 。這時,with語句就派上了用場 。with語句將自動關閉文件對象f,形式如下:
with open(‘dataset.txt’, ‘w’) as f:
f.write(‘new_data’)
有了這個,我們可以保持代碼的簡短 。
你不需要用它來讀取CSV文件,因為你可以用pandas的 pd.read_csv()輕松地讀取,但在讀取其他類型的文件時,這仍然很有用 。例如,從pickle文件中讀取數據時經常使用它 。
import pickle
# 從pickle文件中讀取數據集
with open(‘test’, ‘rb’) as input:
data = https://www.tz-job.com/b/pickle.load(input)
0x03生成器
我們都知道通過列表生成式可以直接創建一個新的列表,但受機器內存限制,列表的容量肯定是有限的 。如果列表里面的數據是通過某種規律推導計算出來的,那是否可以在迭代過程中不斷地推算出后面的元素呢,這樣就不必一次性創建完整個列表,按需使用即可,這時候生成器就派上用場了 。

文章插圖
0x04迭代工具
和collections庫一樣,還有一個庫叫itertools,對某些問題真能高效地解決 。其中一個用例是查找所有組合,他能告訴你在一個組中元素的所有不能的組合方式
from itertools import combinations
teams = [“Packers”, “49ers”, “Ravens”, “Patriots”]
for game in combinations(teams, 2):
print game
>>> (‘Packers’, ’49ers’)
>>> (‘Packers’, ‘Ravens’)
>>> (‘Packers’, ‘Patriots’)
>>> (’49ers’, ‘Ravens’)
>>> (’49ers’, ‘Patriots’)
>>> (‘Ravens’, ‘Patriots’)
0x05使用列表理解法
清洗和處理數據的一個常見步驟是修改現有的列表 。比如,我們有以下需要大寫的列表:
words = [‘california’, ‘florida’, ‘texas’]
將words列表的每個元素大寫的典型方法是創建一個新的大寫列表,執行一次 for 循環,使用.title(),然后將每個修改的值附加到新的列表中 。
capitalized = []
for word in words:
capitalized.append(word.title())
然而,Pythonic的方法是使用列表理解來做到這一點 。列表理解有一種優雅的方法來制作列表 。
你可以用一行代碼重寫上面的for循環:
capitalized = [word.title() for word in words]
由此我們可以跳過第一個例子中的一些步驟,結果是一樣的 。
0x06從字典中獲取元素
我承認try/except代碼并不雅致,不過這里有一種簡單方法,嘗試在字典中查找key,如果沒有找到對應的alue將用第二個參數設為其變量值 。
data = https://www.tz-job.com/b/{‘user’: 1, ‘name’: ‘Max’, ‘three’: 4}
try:
is_admin = data[‘admin’]
except KeyError:
is_admin = False
替換成這樣
data = https://www.tz-job.com/b/{‘user’: 1, ‘name’: ‘Max’, ‘three’: 4}
is_admin = data.get(‘admin’, False)
0x07獲取列表的子集
有時,你只需要列表中的部分元素,這里是一些獲取列表子集的方法 。
x = [1,2,3,4,5,6]
#前3個
print x[:3]
>>> [1,2,3]
#中間4個
print x[1:5]
>>> [2,3,4,5]
#最后3個
print x[3:]
>>> [4,5,6]
#奇數項
print x[::2]
>>> [1,3,5]
#偶數項
print x[1::2]
>>> [2,4,6]
除了python內置的數據類型外,在collection模塊同樣還包括一些特別的用例,在有些場合Counter非常實用 。如果你參加過在這一年的Facebook HackerCup,你甚至也能找到他的實用之處 。
from collections import Counter
print Counter(“hello”)
>>> Counter({‘l’: 2, ‘h’: 1, ‘e’: 1, ‘o’: 1})
0x08多重賦值
你是否曾想減少用于創建多個變量、列表或字典的代碼行數?那么,你可以用多重賦值輕松做到這一點 。
# 原始操作
a = 1
b = 2
c = 3
# 替代操作
a, b, c = 1, 2, 3
# 代替在不同行中創建多個列表
data_1 = []
data_2 = []
data_3 = []
data_4 = []
# 可以在一行中創建它們的多重賦值
data_1, data_2, data_3, data_4 = [], [], [], []
# 或者使用列表理解法
data_1, data_2, data_3, data_4 = [[] for i in range(4)]
0x09盡量減少使用for循環
很難避免使用for循環 。但專家說,只要你有機會預防,你就會去做 。For循環在python中是動態的 。它的運行時間比while循環要長 。嵌套的for循環更耗時 。兩個嵌套的for循環將在一個for循環中占用時間的平方 。
#code1
for i in big_it:
m = re.search(r’d{2}-d{2}-d{4}’, i)
if m:
…
#code2
date_regex = re.compile(r’d{2}-d{2}-d{4}’)
for i in big_it:
m = date_regex.search(i)
if m:
…
在這種情況下,最好使用合適的替代品 。此外,如果不可避免要使用for循環,則將計算移出循環 。這樣可以節省很多時間 。我們可以從上面的例子中看到這一點 。在這里,第二個代碼比第一個代碼快,因為計算是在循環之外完成的 。
0x10計數時使用Counter計數對象
這聽起來顯而易見,但經常被人忘記 。對于大多數程序員來說,數一個東西是一項很常見的任務,而且在大多數情況下并不是很有挑戰性的事情——這里有幾種方法能更簡單的完成這種任務 。
Python的collections類庫里有個內置的dict類的子類,是專門來干這種事情的:
>>> from collections import Counter
>>> c = Counter(‘hello world’)
>>> c
Counter({‘l’: 3, ‘o’: 2, ‘ ‘: 1, ‘e’: 1, ‘d’: 1, ‘h’: 1, ‘r’: 1, ‘w’: 1})
>>> c.most_common(2)
[(‘l’, 3), (‘o’, 2)]
0x11使用內置庫和函數
Python有大量的庫函數和模塊 。它們是由專業的開發人員編寫的,并經過了多次測試 。因此,這些函數是非常高效的,并有助于加速代碼——如果函數在庫中已經可用,則不需要編寫代碼 。在這方面,我們舉一個簡單的例子 。
#code1
newlist = []
for word in oldlist:
newlist.append(word.upper())
#code2
newlist = map(str.upper, oldlist)
在這里,第二段代碼比第一段代碼快,因為使用了庫函數map() 。這些函數對初學者來說很方便 。誰不想編寫更快、更簡潔、更小的代碼呢?因此,盡可能多地使用庫函數和模塊 。
0x12正確的數據結構在正確的位置

文章插圖
【python內置的數據類型 怎么使用代碼】使用適當的數據結構將減少運行時 。在開始之前,您必須考慮將在代碼中使用的數據結構 。一個完美的數據結構會加快python代碼的速度,而其他人會把它搞砸 。你必須了解不同數據結構的時間復雜性 。Python有內置的數據結構,如列表(list)、元組(tuple)、set和字典(dictionary) 。人們習慣于使用列表 。但在某些情況下,元組或字典比列表工作得好得多 。
- 馬岱制勝絕技是什么 馬岱是怎么死的
- 幼兒英語好處與壞處 幼兒學英語的好處和重要性
- 突然吃姜吃到上癮是怎么回事
- 睡覺夢見死人好不好 為什么做夢總能夢見早以死去的人 夢見死人是什么意思
- 藏紅花泡水喝的正確方法和時間
- 燕窩燉出來是一根一根的嗎
- 燕窩燉完一絲一絲的好還是粘粘的好
- 燕窩燉出來是稀的還是粘稠的好
- 燕窩燉好后是脆的還是粘稠的
- 燕窩蒸好是什么樣子 吃燕窩的注意事項 燕窩蒸好是什么樣子
