天天看點

編寫更多 pythonic 代碼(六)——編寫慣用的 Python

作者:SuperOps
編寫更多 pythonic 代碼(六)——編寫慣用的 Python

一、概述

本文對慣用 Python 的介紹。 現在,當人們談論或編寫Python代碼時,你可能聽說過Pythonic這個詞。慣用的Python和短語Pythonic本質上是相同的,也就是說,你正在以語言的編寫方式編寫Python。本文内容包括Python之禅、腳本設定以及語句寫法。您将學習Pythonic的真值測試、内置函數和方法的使用、變量交換技巧、字典預設值的應用、不重複自己原則在Python中的實踐,以及慣用的循環寫法。

二、 python之禅

在第一節中,我們将介紹Tim Peters的 Python之禅。通過輸入"import this"并按下Enter鍵,您可以在任何現代Python解釋器中獲得Tim Peters所寫的名為Python之禅的詩句作為控制台的列印輸出。這首詩表達了編寫Python代碼的一些思想。

你可以通過下面的導入通路Python之禅:

>>> import this

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.Although never is often better than right now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!           

您可能會經常看到其中的一些句子。例如,“簡單比複雜好”經常被引用,或者“應該隻有一種明顯的方法來做某事”,還有“可讀性很重要”。當有人提倡編寫Pythonic代碼時,您可能會遇到其中的一些句子,因為它們是來源。

這些句子都源自Tim Peters的《Python之禅》。這首詩像是一份關于如何編寫Python代碼的指南,但同時也帶着一點幽默,因為它以一種非常Pythonic的方式編寫了整個子產品。它捕捉了Python社群的氛圍,即你希望編寫可讀性強的代碼,同時享受編碼過程的樂趣。

正是由于這個原因,Python之禅廣受Python社群的喜愛,并經常被引用。現在你知道如何通路它了,隻需導入并列印出Python之禅即可。

我鼓勵你在學習過程中嘗試一下,閱讀并思考Python之禅中的一些句子,以及它們與後續課程的聯系。在接下來的課程中,您将學習一些關于Pythonic編寫代碼的方式,包括如何設定腳本以及如何處理語句。這就是Python之禅的精髓。

三、初始腳本設定和語句

在Python中,可以使用腳本和語句來編寫代碼。腳本是包含一系列Python語句的檔案,通常以.py為擴充名。這些腳本檔案可以通過解釋器運作,逐行執行其中的語句。

以下是一個簡單的Python腳本示例:

# 這是一個注釋,用于說明腳本的功能# 定義一個函數def greet(name):
    print("Hello, " + name + "!")

# 調用函數
greet("John")           

在上述腳本中,函數greet()被定義并且被調用,之後會列印出"Hello, John!"的輸出。

要運作一個Python腳本,可以在指令行中輸入以下指令:

python script.py           

其中script.py是你的腳本檔案名。

除了腳本外,Python還支援在互動式環境下執行單個語句。可以使用Python解釋器或者內建開發環境(IDE)來逐行執行代碼。例如,在Python解釋器中,可以直接輸入以下語句并按Enter鍵執行:

print("Hello, world!")           

這将列印出"Hello, world!"的輸出結果。

無論是腳本還是語句,都是Python中組織和執行代碼的方式。根據項目的需要選擇适合的方式進行程式設計。

四、真值測試

在Python中,可以使用條件語句來測試真值。通過将待檢測的值作為條件,可以判斷其是否被視為真值。以下是在Python中測試真值的幾種常見方法:

  1. 直接使用待檢測的值作為條件:
value = 10  # 待檢測的值if value:
    # value被視為真值的處理邏輯print("Value is true")
else:
    # value被視為假值的處理邏輯print("Value is false")           
  1. 使用布爾運算符進行真值測試:
value1 = 0
value2 = "Non-empty string"if value1 or value2:
    # 至少有一個值被視為真值的處理邏輯print("At least one value is true")
else:
    # 所有值都被視為假值的處理邏輯print("All values are false")           
  1. 使用bool()函數轉換值為布爾類型并測試真值:
value = "Non-empty string"if bool(value):
    # value被轉換為布爾類型後被視為真值的處理邏輯print("Value is true")
else:
    # value被轉換為布爾類型後被視為假值的處理邏輯print("Value is false")           

這些方法可以用來測試各種類型的真值,在編寫代碼時根據具體情況選擇适合的測試方式即可。希望對您有幫助!

五、内置函數和方法

在Python中使用内置的方法和函數有以下幾個優勢:

  1. 簡潔高效:Python的内置方法和函數經過優化和測試,能夠以高效的方式完成各種常見的任務。這些方法和函數是由Python開發團隊精心設計和實作的,相對于自行編寫代碼,使用内置方法和函數可以節省編碼時間和精力。
  2. 可靠性和穩定性:Python的内置方法和函數由開發團隊廣泛測試和驗證,是以具有較高的可靠性和穩定性。它們被廣泛使用,并經過持續的改進和修複來確定其正常運作和正确處理各種情況。
  3. 代碼可讀性和維護性:使用内置方法和函數可以使代碼更易于了解和閱讀。Python的内置方法和函數具有一緻的命名和用法約定,這使得其他開發人員能夠快速了解和維護你的代碼。此外,使用内置方法和函數還可以減少代碼中的重複和備援,提高代碼的可維護性。
  4. 廣泛支援和社群資源:Python的内置方法和函數是Python語言的核心功能,是以受到廣泛支援并有很多相關的技術資源。無論是官方文檔、教程還是線上論壇,都會提供大量關于内置方法和函數的使用說明、示例和解決方案。這可以幫助開發人員更好地學習和應用這些功能。

總之,使用Python的内置方法和函數能夠帶來簡潔高效的程式設計體驗,并使代碼具有可讀性和維護性。對于常見的任務和操作,建議首先嘗試使用内置方法和函數,以提高代碼品質和開發效率。

六、原地變量互換

在Python中,可以使用元組解包(tuple unpacking)來交換兩個變量的值。元組解包是一種将元組的元素配置設定給多個變量的方式。

以下是一個交換變量值的示例:

x = 10
y = 20# 使用元組解包交換變量值
x, y = y, x

print("x =", x)  # 輸出: x = 20print("y =", y)  # 輸出: y = 10           

在上述代碼中,首先定義了兩個變量x和y并分别指派為10和20。然後,通過在指派語句中使用元組解包的方式交換了變量的值,即x, y = y, x。最後,列印出交換後的變量值。

元組解包通過将右側的元組(y, x)的元素按順序配置設定給左側的變量(x, y),進而實作變量值的交換。這種方法簡潔高效,不需要引入額外的臨時變量。在Python中,元組解包還可以用于同時擷取函數傳回值、疊代器的元素等多種場景。

七、字典預設值

在通路字典中的值之前,可以使用in關鍵字來檢查字典中是否存在指定的鍵(key)。這樣可以避免在不存在的鍵上進行通路導緻的錯誤。以下是一種處理方式:

my_dict = {"key1": "value1", "key2": "value2"}

if "key3" in my_dict:
    value = my_dict["key3"]
    print(value)
else:
    print("Key does not exist in the dictionary.")           

在上述代碼中,我們首先定義了一個字典my_dict,其中包含了兩個鍵值對。然後,使用if語句和in關鍵字檢查字典中是否存在指定的鍵key3。如果存在,我們可以通過my_dict["key3"]來擷取相應的值。否則,列印出相應的提示資訊。

使用in關鍵字進行鍵的存在性檢查是一種安全的方式,可以避免因為通路不存在的鍵而導緻的KeyError錯誤。

八、DRY原則

DRY(Don't Repeat Yourself)原則是一種軟體開發原則,指導我們避免重複代碼的編寫。Python作為一門具有簡潔優雅風格的程式設計語言,有許多特性可以幫助我們編寫符合DRY原則的Pythonic代碼。

下面是一些常見的Pythonic技巧和方法,可以應用DRY原則:

  1. 函數封裝:将重複的代碼封裝為一個函數或方法,并通過參數傳遞不同的值來實作不同的功能。
  2. 清單推導式(List Comprehensions):使用清單推導式來生成新的清單,避免使用循環和臨時變量。
  3. 内置函數和方法:利用Python的内置函數和方法來完成常見的任務,避免自己重新實作相同的功能。
  4. 代碼複用:通過繼承、組合等方式實作代碼的重用,避免重複編寫相似的代碼。
  5. 使用子產品和庫:利用現有的子產品和庫來實作通用功能,避免重複開發。
  6. 參數化配置:将配置資訊抽離到配置檔案或全局變量中,通過修改配置來改變程式的行為,而不是直接修改代碼。
  7. 合理命名:給變量、函數和類起有描述性的命名,以便代碼的可讀性和維護性。
  8. 注釋和文檔:通過添加注釋和編寫文檔字元串來解釋代碼的目的、功能和用法,減少重複使用同樣代碼的困擾。

以上是一些常見的Pythonic技巧和方法,可以幫助我們應用DRY原則。根據具體的情況和需求,選擇合适的技巧和方法,編寫簡潔、高效、易于了解和維護的Python代碼。

九、慣用語 "for "循環

在Python中,使用for循環是一種常見的疊代操作。為了編寫Pythonic的for循環,可以考慮以下方法和技巧:

  1. 疊代可疊代對象:直接使用for element in iterable的文法,将每個元素逐個疊代出來。可疊代對象包括清單、元組、字典、集合等。
  2. 清單推導式(List Comprehensions):使用清單推導式可以簡潔地建立新的清單,并進行疊代。例如,result = [expression for item in iterable]。
  3. 使用enumerate()函數:enumerate()函數可以同時擷取索引和對應的值,使得在for循環中可以友善地同時處理索引和元素。
my_list = ['a', 'b', 'c']

# 傳統方式的for循環疊代for i in range(len(my_list)):
    print(i, my_list[i])

# 使用enumerate函數進行疊代for i, element in enumerate(my_list):
    print(i, element)           
  1. zip()函數:zip()函數可以将多個可疊代對象打包成一個元組序列,并進行并行疊代。
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]

# 并行疊代兩個清單for name, age in zip(names, ages):
    print(name, age)           
  1. 疊代字典:在疊代字典時,可以使用.items()方法同時擷取鍵和對應的值,或者隻疊代鍵或值。
my_dict = {'a': 1, 'b': 2, 'c': 3}

# 疊代字典的鍵和值for key, value in my_dict.items():
    print(key, value)

# 疊代字典的鍵for key in my_dict:
    print(key)

# 疊代字典的值for value in my_dict.values():
    print(value)           

通過使用以上方法和技巧,可以編寫出更加簡潔、易讀和Pythonic的for循環。選擇适當的方法取決于具體的需求和任務。

十、總結

希望這些内容對您有所啟發。關于如何編寫Pythonic代碼還有很多可以學習的内容,如果您想了解更多資訊,可以在描述中檢視一些連結。總之,我建議您持續閱讀Python、編寫Python代碼并不斷進步。祝您前程似錦!