1. 程式人生 > >給大家整理了19個pythonic的程式設計習慣

給大家整理了19個pythonic的程式設計習慣

開發十年,就只剩下這套架構體系了! >>>   

python學習好習慣

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」,獲取由騰訊架構師整理的大資料學習資源包全套!!! Pyth   
 
 </div> 
 <div class=

相關推薦

大家整理19pythonic程式設計習慣

開發十年,就只剩下這套架構體系了! >>>   

大家整理19pythonic的編程習慣

jpeg 大數 enum middle 大數據學習 product last 字典 eth Python最大的優點之一就是語法簡潔,好的代碼就像偽代碼一樣,幹凈、整潔、一目了然。 要寫出 Pythonic(優雅的、地道的、整潔的)代碼,需要多看多學大牛們寫的代碼,githu

整理19pythonic的編程習慣,入門更優雅!

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入門你學習資料! 乾

我們整理20Python專案,送給正在求職的你

關注「實驗樓」,每天分享一個專案教程   職場中一貫有“金三銀四”、“金九銀十”的說法。如果你是

大家推薦:五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