python小技巧

来源:https://www.cnblogs.com/ITXiaoAng/archive/2019/10/13/11669033.html
-Advertisement-
Play Games

[TOC]   在python中,實際書寫代碼還有很多需要註意的東西,有時候會讓代碼的執行效率提高,下麵就讓我們來學習PEP 8風格以及Python編程慣例的一些知識吧。 一:PEP 8風格   PEP是Python Enhancement Proposal的 ...


目錄

  在python中,實際書寫代碼還有很多需要註意的東西,有時候會讓代碼的執行效率提高,下麵就讓我們來學習PEP 8風格以及Python編程慣例的一些知識吧。


一:PEP 8風格

  PEP是Python Enhancement Proposal的縮寫,通常翻譯為“Python增強提案”。其中的第8號增強提案(PEP 8)是針對Python語言編訂的代碼風格指南。


  在實際開發中,採用一致的風格書寫出可讀性強的代碼是每個專業的程式員應該做到的事情,也是每個公司的編程規範中會提出的要求,這些在多人協作開發一個項目(團隊開發)的時候顯得尤為重要。

  官方鏈接:https://www.python.org/dev/peps/pep-0008/


  下麵只介紹關鍵部分:

   1.空格的使用

  (1)使用空格來表示縮進而不要用製表符(Tab):這是由於。但是如果喜歡用Tab的話,就需要把使用的編輯器的Tab鍵設定為四個空格。

  (2)每行的字元數不要超過79個字元。

  (3)如果表達式因太長而占據了多行,除了首行之外的其餘各行都應該在正常的縮進寬度上再加上4個空格。

  (4)函數和類的定義,代碼前後都要用兩個空行進行分隔。

  (5)在同一個類中,各個方法之間應該用一個空行進行分隔。

  (6)二元運算符的左右兩側應該保留一個空格,而且只要一個空格就好。

   2.標識符的命名

  PEP 8倡導用不同的命名風格來命名Python中不同的標識符,以便在閱讀代碼時能夠通過標識符的名稱來確定該標識符在Python中扮演了怎樣的角色。

  (1)變數、函數和屬性應該使用小寫字母來拼寫,如果有多個單詞就使用下劃線進行連接。

  (2)類中受保護的實例屬性,應該以一個下劃線開頭。

  (3)類中私有的實例屬性,應該以兩個下劃線開頭。

  (4)類和異常的命名,應該每個單詞首字母大寫。

  (5)模塊級別的常量,應該採用全大寫字母,如果有多個單詞就用下劃線進行連接。

  (6)類的實例方法,應該把第一個參數命名為self以表示對象自身。

  (7)類的類方法,應該把第一個參數命名為cls以表示該類自身。

   3.表達式和語句

  (1)採用內聯形式的否定詞,而不要把否定詞放在整個表達式的前面。例如if a is not b就比if not a is b更容易讓人理解。

  (2)不要用檢查長度的方式來判斷字元串、列表等是否為None或者沒有元素,應該用 if not x 這樣的寫法來檢查它。

  (3)就算if分支、for迴圈、except異常捕獲等中只有一行代碼,也不要將代碼和if、for、except等寫在一起,分開寫才會讓代碼更清晰。

  (4)import語句總是放在文件開頭的地方。

  (5)引入模塊的時候,from math import sqrt比import math更好。

  (6)如果有多個import語句,應該將其分為三部分,從上到下分別是Python標準模塊、第三方模塊和自定義模塊,每個部分內部應該按照模塊名稱的字母表順序來排列。


二:Python編程慣例

  由於Python跟其他很多編程語言在語法和使用上還是有比較顯著的差別,因此作為一個Python開發者如果不能掌握一些慣例,就無法寫出"Pythonic"(python風格,pythonic code,就是說你寫的代碼要帶有濃厚的python規範和python風格)的高效代碼。


1.讓代碼既可以被導入又可以被執行。

if __name__ == '__main__':

2.用下麵的方式判斷邏輯“真”或“假”。

if x:
if not x:

# 實例
name = 'jackfrued'
fruits = ['apple', 'orange', 'grape']
owners = {'1001': 'a', '1002': 'b'}
# 好的代碼
if name and fruits and owners:
    print('I love fruits!')
# 不好的代碼
if name != '' and len(fruits) > 0 and owners != {}:
    print('I love fruits!')

3.善於使用in運算符。

if x in items: # 包含
for x in items: # 迭代

# 實例
name = 'Hao LUO'
# 好的代碼
if 'L' in name:
    print('The name has an L in it.')
# 不好的代碼
if name.find('L') != -1:
    print('This name has an L in it!')

4.不使用臨時變數交換兩個值。

a, b = b, a

5.用序列構建字元串。

chars = ['j', 'a', 'c', 'k', 'f', 'r', 'u', 'e', 'd']
# 好的代碼
name = ''.join(chars)
print(name)  # jackfrued
# 不好的代碼
name = ''
for char in chars:
    name += char
print(name)  # jackfrued

6.EAFP優於LBYL。

d = {'x': '5'}
# 好的代碼
try:
    value = int(d['x'])
    print(value)
except (KeyError, TypeError, ValueError):
    value = None
# 不好的代碼
d = {'x': '5'}
if 'x' in d and isinstance(d['x'], str) \
        and d['x'].isdigit():
    value = int(d['x'])
    print(value)
else:
    value = None

7.使用enumerate進行迭代。

fruits = ['orange', 'grape', 'pitaya', 'blueberry']
# 好的代碼
for index, fruit in enumerate(fruits):
    print(index, ':', fruit)
# 不好的代碼
index = 0
for fruit in fruits:
    print(index, ':', fruit)
    index += 1

8.用生成式生成列表。

data = [7, 20, 3, 15, 11]
# 好的代碼
result = [num * 3 for num in data if num > 10]
print(result)
# 不好的代碼
result = []
for i in data:
    if i > 10:
        result.append(i * 3)
print(result) 

9.用zip組合鍵和值來創建字典。

keys = ['1001', '1002', '1003']
values = ['a', 'b', 'c']
# 好的代碼
d = dict(zip(keys, values))
print(d)
# 不好的代碼
d = {}
for i, key in enumerate(keys):
    d[key] = values[i]
print(d)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • "洛谷題目頁面傳送門" & "CodeForces題目頁面傳送門" 給定一棵樹$T=(V,E),|V|=2^n 2,|E|=2^n 3$,輸出所有的$x$,使得存在一棵滿二叉樹$T'$,將$T'$中節點$x$的一個兒子刪除並把這個兒子的所有兒子接到$x$下後等於$T$。升序輸出。 $n\le17$。 ...
  • 預設下載安裝完的vscode並不能準確提示和檢測PHP的語法錯誤,需要手動指定一下本機的PHP程式路徑。按下麵的操作配置完後就能在文件保存的時候檢測語法有無錯誤。打開文件->首選項->setting,把PHP的執行路徑填進去,前提是本機已經安裝了PHP程式{ "workbench.sideBar.l ...
  • "洛谷題目頁面傳送門" & "CodeForces題目頁面傳送門" 給定一個$n$個單詞的文本,第$i$個單詞的長度為$len_i$,要求截取文本的一段(單詞必須取整的),分若幹行放,同行詞語用空格分隔,使得每行的長度不超過$m$,最多放$s$行。求截取的單詞數最多的截法。 $n\in[1,10^6 ...
  • 關於spring bean的生命周期,是深入學習spring的基礎,也是難點,本篇文章將採用代碼+圖文結論的方式來闡述spring bean的生命周期, 本篇文章將闡述清楚下圖。 一 項目結構及源碼 1.程式目錄結構 2.applicationContext.xml 3.UserDao.java 二 ...
  • django預設是有一個admin的後臺管理模塊,但是醜,功能也不齊全,但是大神給我們已經集成好了xadmin後臺,我們拿來用即可,但是呢,django已經升級到2.1版本了,xadmin貌似跟不上節奏,那麼在集成過程中咱就一步一步填坑吧,這也是一種學習的過程,遇到錯誤,找到錯誤的地方,看看djan ...
  • 下列代碼都是以自己的項目實例講述的,相關的文本內容很少,主要說明全在代碼註釋中 自製圖形驗證碼 這裡所說的圖形驗證碼都是自製的圖形,通過畫布、畫筆、畫筆字體的顏色繪製而成的。將驗證碼封裝成一個類比較好管理,代碼里有絕對詳細的註釋,當然大家可以直接複製。 裡面涉及的字體都是從系統電腦上自帶的,大家直接 ...
  • 一、面向對象簡介 1、面向對象不是所有的情況都適用2、面向對象編程 a.定義類 class 類名: def 方法1(self, 參數名): 方法體 b.根據類創建對象,使用對象去執行類中的方法 obj = 類名() obj.方法名3、self,形參,python內部傳遞 4、函數式編程與面向對象式編 ...
  • 有些小伙伴可能不知道,亞馬遜AWS對新用戶有個免費體驗一年的活動。如果希望體驗免費亞馬遜AWS雲伺服器產品,或者看看他們後臺面板長什麼樣,體驗產品的速度和性能,又或者準備搭建一個免費梯子,可以 註冊玩玩。 很簡單,全程基本都是中文,不用擔心看不懂英文。 我是2018年6月30號註冊的賬號,在EC2面 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...