給大家整理了19個pythonic的程式設計習慣
Python最大的優點之一就是語法簡潔,好的程式碼就像虛擬碼一樣,乾淨、整潔、一目瞭然。
要寫出 Pythonic(優雅的、地道的、整潔的)程式碼,需要多看多學大牛們寫的程式碼,github 上有很多非常優秀的原始碼值得閱讀,比如:requests、flask、tornado,下面列舉一些常見的Pythonic寫法。
0. 程式必須先讓人讀懂,然後才能讓計算機執行。
“Programs must be written for people to read, and only incidentally for machines to execute.”
1. 交換賦值
##不推薦
temp = a
a = b
b = a
##推薦
a, b = b, a # 先生成一個元組(tuple)物件,然後unpack
2. Unpacking
##不推薦 l = ['David', 'Pythonista', '+1-514-555-1234'] first_name = l[0] last_name = l[1] phone_number = l[2] ##推薦 l = ['David', 'Pythonista', '+1-514-555-1234'] first_name, last_name, phone_number = l # Python 3 Only first, *middle, last = another_list
3. 使用操作符in
##不推薦
if fruit == "apple" or fruit == "orange" or fruit == "berry":
# 多次判斷
##推薦
if fruit in ["apple", "orange", "berry"]:
# 使用 in 更加簡潔
4. 字串操作
##不推薦 colors = ['red', 'blue', 'green', 'yellow'] result = '' for s in colors: result += s # 每次賦值都丟棄以前的字串物件, 生成一個新物件 ##推薦 colors = ['red', 'blue', 'green', 'yellow'] result = ''.join(colors) # 沒有額外的記憶體分配
5. 字典鍵值列表
##不推薦
for key in my_dict.keys():
# my_dict[key] ...
##推薦
for key in my_dict:
# my_dict[key] ...
# 只有當迴圈中需要更改key值的情況下,我們需要使用 my_dict.keys()
# 生成靜態的鍵值列表。
6. 字典鍵值判斷
##不推薦
if my_dict.has_key(key):
# ...do something with d[key]
##推薦
if key in my_dict:
# ...do something with d[key]
7. 字典 get 和 setdefault 方法
##不推薦
navs = {}
for (portfolio, equity, position) in data:
if portfolio not in navs:
navs[portfolio] = 0
navs[portfolio] += position * prices[equity]
##推薦
navs = {}
for (portfolio, equity, position) in data:
# 使用 get 方法
navs[portfolio] = navs.get(portfolio, 0) + position * prices[equity]
# 或者使用 setdefault 方法
navs.setdefault(portfolio, 0)
navs[portfolio] += position * prices[equity]
8. 判斷真偽
##不推薦
if x == True:
# ....
if len(items) != 0:
# ...
if items != []:
# ...
##推薦
if x:
# ....
if items:
# ...
9. 遍歷列表以及索引
##不推薦
items = 'zero one two three'.split()
# method 1
i = 0
for item in items:
print i, item
i += 1
# method 2
for i in range(len(items)):
print i, items[i]
##推薦
items = 'zero one two three'.split()
for i, item in enumerate(items):
print i, item
10. 列表推導
##不推薦
new_list = []
for item in a_list:
if condition(item):
new_list.append(fn(item))
##推薦
new_list = [fn(item) for item in a_list if condition(item)]
11. 列表推導-巢狀
##不推薦
for sub_list in nested_list:
if list_condition(sub_list):
for item in sub_list:
if item_condition(item):
# do something...
##推薦
gen = (item for sl in nested_list if list_condition(sl) \
for item in sl if item_condition(item))
for item in gen:
# do something...
12. 迴圈巢狀
##不推薦
for x in x_list:
for y in y_list:
for z in z_list:
# do something for x & y
##推薦
from itertools import product
for x, y, z in product(x_list, y_list, z_list):
# do something for x, y, z
13. 儘量使用生成器代替列表
##不推薦
def my_range(n):
i = 0
result = []
while i < n:
result.append(fn(i))
i += 1
return result # 返回列表
##推薦
def my_range(n):
i = 0
result = []
while i < n:
yield fn(i) # 使用生成器代替列表
i += 1
# 儘量用生成器代替列表,除非必須用到列表特有的函式。
14. 中間結果儘量使用imap/ifilter代替map/filter
##不推薦
reduce(rf, filter(ff, map(mf, a_list)))
##推薦
from itertools import ifilter, imap
reduce(rf, ifilter(ff, imap(mf, a_list)))
# lazy evaluation 會帶來更高的記憶體使用效率,特別是當處理大資料操作的時候。
15. 使用any/all函式
##不推薦
found = False
for item in a_list:
if condition(item):
found = True
break
if found:
# do something if found...
##推薦
if any(condition(item) for item in a_list):
# do something if found...
16. 屬性(property)
##不推薦
class Clock(object):
def __init__(self):
self.__hour = 1
def setHour(self, hour):
if 25 > hour > 0: self.__hour = hour
else: raise BadHourException
def getHour(self):
return self.__hour
##推薦
class Clock(object):
def __init__(self):
self.__hour = 1
def __setHour(self, hour):
if 25 > hour > 0: self.__hour = hour
else: raise BadHourException
def __getHour(self):
return self.__hour
hour = property(__getHour, __setHour)
17. 使用 with 處理檔案開啟
##不推薦
f = open("some_file.txt")
try:
data = f.read()
# 其他檔案操作..
finally:
f.close()
##推薦
with open("some_file.txt") as f:
data = f.read()
# 其他檔案操作...
18. 使用 with 忽視異常(僅限Python 3)
##不推薦
try:
os.remove("somefile.txt")
except OSError:
pass
##推薦
from contextlib import ignored # Python 3 only
with ignored(OSError):
os.remove("somefile.txt")
19. 使用 with 處理加鎖
##不推薦
import threading
lock = threading.Lock()
lock.acquire()
try:
# 互斥操作...
finally:
lock.release()
##推薦
import threading
lock = threading.Lock()
with lock:
# 互斥操作...
關注公眾號:「Python專欄」,後臺回覆「騰訊架構資源1」,獲取由騰訊架構師整理的大資料學習資源包全套!!!
相關推薦
給大家整理了19個pythonic的程式設計習慣
開發十年,就只剩下這套架構體系了! >>>
給大家整理了19個pythonic的編程習慣
jpeg 大數 enum middle 大數據學習 product last 字典 eth Python最大的優點之一就是語法簡潔,好的代碼就像偽代碼一樣,幹凈、整潔、一目了然。 要寫出 Pythonic(優雅的、地道的、整潔的)代碼,需要多看多學大牛們寫的代碼,githu
整理了19個pythonic的編程習慣,入門更優雅!
incident read 學習者 內存 tool 實戰 17. 閱讀 execute Python最大的優點之一就是語法簡潔,好的代碼就像偽代碼一樣,幹凈、整潔、一目了然。 要寫出 Pythonic(優雅的、地道的、整潔的)代碼,需要多看多學大牛們寫的代碼,github
給大家整理了一篇Pycharm2018永久破解的方法
Pycharm2018永久破解方法 有效期到2099年12月31日,適用於JetBrains的所有開發工具(如:IDEA、webstorm、phpstorm、pycharm等等) 下面以Pycharm為例: 第一步:下載補丁檔案 如果是2017.2以上版
Go.js 沒有中文文檔 也沒有中文demo 學起來很費勁 給大家整理一個算是詳細的文檔
必須 SM iam rtl odi 文檔 文本 ping 用戶 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="viewport" content="wi
給大家帶來了最新的簽證時間調整~~
英國現在調整了Tier4學生簽證的計點積分制系統,簽證中規則日子費規範行進,倫敦區域現在為1265英鎊一個月,非倫敦區域的現在為1015英鎊/月。在英國滿一年後再續簽只需要交2個月日子費這個規則在新政策中撤消了。雅思考試精度的行進出國留學言語要求是很高的。英國撤消託福和PTE的認可,把雅思分為日子雅思、學術雅
19個綜合程式設計學習教程網站
綜合程式設計學習教程網站: 1.[菜鳥教程](http://www.runoob.com/) 介紹:對新手很友好的學習各類程式語言的免費網站,可能是新手用的最多的。 評分:❤❤❤❤❤ 2.[極客學院wiki](http://wiki.jikexueyuan.com/) 介紹:這個wiki比菜
今天為大家整理了十張動圖GIFS,有助於認識迴圈、遞迴、二分檢索等概念的具體執行情況。程式碼例項以Python語言編寫。
一、迴圈 GIF 1:最簡單的 while 迴圈 GIF 2:帶 if/else 的迴圈 二、遞迴 GIF 3:遞迴概念的直接演示 GIF 4:遞迴的程式碼示例 GIF 5:遞迴求斐波那契數列 GIF 6:遞迴求階乘(圖裡縮排有點問題,請忽
一個月能入門Python嗎?月薪25K的大佬給我整理了函式和模組資料
函式 在這裡相信有許多想要學習Python的同學,大家可以+下Python學習分享裙:叄零肆+零伍零+柒玖玖,即可免費領取一整套系統的 Python學習教程 103456743 4、內建函式 模組 一、模組簡介
給大家推薦:五個Python小專案,Github上的人氣很高的
1.深度學習框架 Pytorch https://github.com/pytorch/pytorch PyTorch 是一個 Torch7 團隊開源的 Python 優先的深度學習框架,提供兩個高階功能: ● 強大的 GPU 加速 Tensor 計算(類似 numpy) ● 構建基於 tape 的自
乾貨:Python的19個高效程式設計技巧(附習題)
初識Python語言,覺得python滿足了我上學時候對程式語言的所有要求。python語言的高效程式設計技巧讓我們這些大學曾經學了四年c或者c++的人,興奮的不行不行的,終於解脫了。高階語言,如果做不到這樣,還扯啥高階呢? 進群:943752371獲取Python入門你學習資料! 乾
我們整理了20個Python專案,送給正在求職的你
關注「實驗樓」,每天分享一個專案教程 職場中一貫有“金三銀四”、“金九銀十”的說法。如果你是
給大家推薦:五個Python小項目,Github上的人氣很高的!
team ofo .com 簡單的 ref capi shape 高級功能 mas 1.深度學習框架 Pytorch https://github.com/pytorch/pytorch PyTorch 是一個 Torch7 團隊開源的 Python 優先的深度學習框架,提
整理了八個開源的 Spring Boot 學習資源
Spring Boot 算是目前 Java 領域最火的技術棧了,鬆哥年初出版的 《Spring Boot + Vue 全棧開發實戰》迄今為止已經加印了 3 次,Spring Boot 的受歡迎程度可見一斑。經常有人問鬆哥有沒有推薦的 Spring Boot 學習資料?當然有!買鬆哥書就對了,哈哈。除了書呢?當
程式設計師偷偷深愛的 9 個不良程式設計習慣
哈哈,這篇文章還是非常能說明問題的,實際開發中必須要注意的地方! 下面這9個編碼習慣,雖然在程式設計規則中是被駁斥的,但我們很多人就是會不由自主地使用它們。 我們曾經都做過這樣的事情:當媽媽不注意的時候,偷偷地吃糖果零食,然後導致有了蛀牙。同樣的,我們都違背過一些程式設計的基本規則,並且都會堅定地表示這種行為
整理了近期阿里攜程的面試題,分享給大家(後期會慢慢完善)
理解事件原理 事件捕獲/冒泡 DOM事件流 DOM2級事件規定事件包括三個階段: ① 事件捕獲階段 ② 處於目標階段 ③ 事件冒泡階段 stopPropagation ES6 let const ()=> 模板字串 解析結構 函式預設引數 展開運算子 物件字面量 與 class、
百度T7阿里P8資深架構師,整理了最新架構師學習體系,分享給大家!
不管是開發、測試、運維,每個技術人員心裡都有一個成為技術大牛的夢,畢竟“夢想總是要有的,萬一實現了呢”!正是對技術夢的追求,促使我們不斷地努力和提升自己。 然而“夢想是美好的,現實卻是殘酷的”,很多同學在實際工作後就會發現,夢想是成為大牛,但做的事情看起來跟大牛都不沾邊
十幾位資深架構師,整理了最新架構師學習體系,分享給大家!
不管是開發、測試、運維,每個技術人員心裡都有一個成為技術大牛的夢,畢竟“夢想總是要有的,萬一實現了呢”!正是對技術夢的追求,促使我們不斷地努力和提升自己。 然而“夢想是美好的,現實卻是殘酷的”,很多同學在實際工作後就會發現,夢想是成為大牛,但做的事情看起來跟大
今天學習js做了些總結,分享給大家
要求 js文件 優先 encode mas src 全局變量 nan span 一、1.javascript的作用 是基於對象和事件驅動的語言,應用於客戶端 基於對象:提供好了很多對象,可以直接拿過來使用,不需要創建 事件驅動: html做網站靜態效果,jav