Python 提供了豐富的工具和函式庫,非常適合用於資料處理和分析,這對於間諜任務至關重要。本文將介紹如何使用 Python 編寫指令碼,包含變數操作、數值計算、字串處理、例外處理、函式定義和檔案操作等方面。這些基礎知識可以幫助我們構建更強大的間諜工具,有效地收集和分析情報。從變數交換和增強指定開始,我們逐步深入到更進階的程式設計技巧,例如使用 Decimal 模組進行精確的貨幣計算,以及如何處理使用者輸入和可能發生的錯誤。此外,文章還介紹瞭如何使用 try-except 區塊來處理例外,避免程式當機,並使用迴圈來重複取得輸入直到有效。最後,我們討論了 Python 的字串處理能力,包括特殊字元、Unicode 字元、字串與數值之間的轉換,以及使用 format() 方法進行格式化輸出。這些技巧對於處理和分析情報資料非常重要,可以幫助我們從雜亂的資料中提取有價值的資訊。

我們的間諜工具箱:Python 程式設計基礎

在進行間諜任務時,蒐集和分析資料是我們的首要任務。雖然我們不會建立複雜的使用者介面(UI),但 Python 提供了強大的工具來幫助我們完成任務。在本章中,我們將介紹如何使用 Python 編寫指令碼並輸出結果。

變數交換與增強指定

在 Python 中,我們可以使用多重指定陳述式來交換兩個變數的值。例如:

length, width = Fraction(9, 4), Fraction(39, 8)
print("原始 length:", length)
print("原始 width:", width)
length, width = width, length
print("交換後 length:", length)
print("交換後 width:", width)

輸出結果:

原始 length: 9/4
原始 width: 39/8
交換後 length: 39/8
交換後 width: 9/4

內容解密:

  1. length, width = Fraction(9, 4), Fraction(39, 8):初始化 lengthwidth 兩個變數。
  2. length, width = width, length:使用多重指定陳述式交換 lengthwidth 的值。
  3. 右側的運算元會先被計算完畢,然後再指定給左側的變數。

此外,Python 也支援增強指定陳述式(Augmented Assignment Statements),例如 +=-=*=/= 等。這些陳述式可以簡化程式碼並提高可讀性。例如:

total = Decimal('0')
lunch_usd = Decimal('52.09')
bribe_usd = Decimal('201.94')
cab_usd = Decimal('23.50')

total += lunch_usd
total += bribe_usd
total += cab_usd
print("總計:", total)

輸出結果:

總計: 277.53

內容解密:

  1. total = Decimal('0'):初始化 total 變數為 0。
  2. total += lunch_usdtotal += bribe_usdtotal += cab_usd:使用增強指定陳述式將各項費用累加到 total 中。
  3. 最終輸出總計金額。

編寫指令碼與輸出結果

在大多數情況下,我們不會在 Python 的互動式環境中輸入每條指令,而是編寫指令碼並執行。指令碼是一種純文字檔案,可以使用任何文字編輯器建立。

以下是一個簡單的指令碼,用於生成一份收據:

from decimal import Decimal

PENNY = Decimal('.01')
grd_usd = Decimal('247.616')
lunch_grd = Decimal('12900')
bribe_grd = 50000
cab_usd = Decimal('23.50')

lunch_usd = (lunch_grd / grd_usd).quantize(PENNY)
bribe_usd = (bribe_grd / grd_usd).quantize(PENNY)

print("午餐", lunch_grd, "GRD", lunch_usd, "USD")
print("賄賂", bribe_grd, "GRD", bribe_usd, "USD")
print("計程車", cab_usd, "USD")
print("總計", lunch_usd + bribe_usd + cab_usd, "USD")

輸出結果:

午餐 12900 GRD 52.09 USD
賄賂 50000 GRD 201.94 USD
計程車 23.50 USD
總計 277.53 USD

內容解密:

  1. from decimal import Decimal:匯入 Decimal 模組,用於處理貨幣計算。
  2. PENNY = Decimal('.01'):定義一個常數 PENNY,用於四捨五入到小數點後兩位。
  3. grd_usd = Decimal('247.616'):定義匯率轉換因子。
  4. 使用 quantize() 方法將金額四捨五入到小數點後兩位。
  5. 使用 print() 函式輸出收據內容。

使用註解與變數命名

在程式碼中新增註解(Comments)可以幫助他人理解程式碼的用途。註解以 # 符號開頭,例如:

grd_usd = Decimal('247.616')  # Mihalis Bank 的匯率,日期:5/15/14

良好的變數命名可以提高程式碼的可讀性。例如,使用 lunch_grdlunch_usd 分別表示以 GRD 和 USD 為單位的午餐費用。

使用者輸入與例外處理

在開發應用程式時,經常需要從使用者那裡取得輸入。在 Python 中,可以使用 input() 函式來實作這一點。然而,使用者輸入的資料可能不符合預期,因此需要進行適當的處理。

取得使用者輸入

首先,讓我們看看如何使用 input() 函式來取得使用者輸入:

entry = input("GRD 轉換:")
grd_usd = Decimal(entry)

第一行程式碼會顯示提示訊息並等待使用者輸入。使用者輸入的內容會被指定給 entry 變數。然而,entry 是一個字串,不能直接用於算術運算。因此,需要將其轉換為合適的數值型別。

內容解密:

  1. input() 函式用於取得使用者輸入,傳回一個字串。
  2. Decimal(entry) 將使用者輸入的字串轉換為 Decimal 物件,以便進行精確的數值運算。

例外處理

如果使用者輸入的內容不能被轉換為有效的 Decimal 物件,就會引發例外。例如:

>>> entry = input("GRD 轉換:")
GRD 轉換123.%$6
>>> grd_usd = Decimal(entry)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]

在這種情況下,程式會當機並顯示錯誤訊息。

內容解密:

  1. decimal.InvalidOperation 例外是在 Decimal 物件無法解析輸入字串時引發的。
  2. 使用 try-except 區塊可以捕捉和處理例外,避免程式當機。

使用 try-except 區塊處理例外

可以使用 try-except 區塊來捕捉和處理例外:

entry = input("GRD 轉換:")
try:
    grd_usd = Decimal(entry)
except decimal.InvalidOperation:
    print("無效輸入:", entry)

在這個例子中,如果 Decimal(entry) 引發 decimal.InvalidOperation 例外,就會執行 except 區塊中的程式碼,輸出錯誤訊息。

內容解密:

  1. try 區塊包含可能引發例外的程式碼。
  2. except 區塊包含處理例外的程式碼。

重複取得輸入直到有效

可以使用迴圈來重複取得輸入,直到使用者輸入有效的數值:

grd_usd = None
while grd_usd is None:
    entry = input("GRD 轉換:")
    try:
        grd_usd = Decimal(entry)
    except decimal.InvalidOperation:
        print("無效輸入:", entry)
print(grd_usd, "GRD = 1 USD")

在這個例子中,程式會不斷提示使用者輸入,直到輸入有效的數值。

內容解密:

  1. while 迴圈用於重複執行程式碼,直到 grd_usd 不再是 None
  2. is 運算元用於檢查 grd_usd 是否為 None

字串處理

Python 提供了多種方式來處理字串。例如,可以使用不同的引號來定義字串:

>>> "short"
'short'
>>> 'short'
'short'
>>> """A multiple line,
... very long string."""
'A multiple line,\nvery long string.'
>>> '''another multiple line
... very long string.'''
'another multiple line\nvery long string.'

在這個例子中,展示瞭如何使用單引號、雙引號和三引號來定義字串。

內容解密:

  1. Python 中的字串可以用單引號、雙引號或三引號來定義。
  2. 三引號可以用於定義跨越多行的字串。

字串處理與格式化輸出

在 Python 中,字串是一種基本且重要的資料型別。我們可以使用單引號或雙引號來建立短字串,而使用三重引號或三重單引號來建立長字串。長字串可以跨越多行程式碼,這在撰寫複雜的文字輸出或檔案時非常有用。

字串中的特殊字元與轉義序列

Python 使用反斜線(\)作為跳脫字元,以表示某些特殊字元。例如,\n 表示換行字元。當 Python 回應字串時,會使用 \n 來表示換行。

>>> "Hello\nWorld"
'Hello\nWorld'
>>> print("Hello\nWorld")
Hello
World

內容解密:

  1. 特殊字元的使用:在字串中使用 \n 可以實作換行輸出。
  2. 跳脫字元的作用:反斜線(\)用於轉義特殊字元,使其具有特殊意義。
  3. 實際應用:在需要格式化輸出的場景中,合理使用跳脫字元可以提高程式碼的可讀性和輸出效果。

Unicode 字元的使用

當我們需要使用鍵盤上不存在的特殊字元時,可以使用 Unicode 編碼。Python 提供了兩種方式來表示 Unicode 字元:使用 \u 加上四位十六進位制數,或使用 \N{字元名稱}

>>> "\u2328"
'⌨'
>>> "\N{KEYBOARD}"
'⌨'

內容解密:

  1. Unicode 編碼的使用:透過 \u 和四位十六進位制數可以直接表示 Unicode 字元。
  2. 字元名稱的使用:使用 \N{字元名稱} 可以更直觀地表示特殊字元,無需記住具體的 Unicode 編碼。
  3. 實際應用:在需要顯示特殊符號的場景中,使用 Unicode 字元可以豐富輸出內容。

字串與數值之間的轉換

Python 提供了多種函式來實作字串與數值之間的轉換,例如 int(), float(), Decimal(), fractions.Fraction(), 和 complex()

>>> int('dead', 16)
57005
>>> int('0b1101111010101101', 2)
57005

內容解密:

  1. 不同進位制之間的轉換:使用 int() 函式可以將不同進位制的字串轉換為整數。
  2. int() 函式的靈活性:透過指定基數,可以處理二進位制、八進位制、十六進位制等不同進位制的字串。
  3. 實際應用:在處理不同進位制的資料時,這些轉換函式非常有用。

使用 format() 方法進行格式化輸出

format() 方法允許我們使用格式規範字串來定義輸出的格式,從而實作複雜的數值到字串的轉換。

>>> "{0:12s} {1:6.2f} USD {2:8.0f} GRD".format("lunch", 52.10, 12900)
'lunch        52.10 USD    12900 GRD'

內容解密:

  1. format() 方法的基本用法:透過格式規範字串,可以控制輸出的格式和對齊方式。
  2. 格式規範的組成:格式規範包括位置索引、格式說明符等部分,共同決定了輸出的樣式。
  3. 實際應用:在生成報表或需要格式化輸出的場景中,format() 方法非常實用。

字串的解析與分解

Python 中的字串物件提供了多種方法來解析和分解字串,例如 strip()partition()

>>> " 123.45 ".strip()
'123.45'
>>> amount, space, currency = "123.45 USD".partition(" ")
>>> amount
'123.45'
>>> currency
'USD'

內容解密:

  1. strip() 方法的作用:去除字串前後的空白字元,使資料更乾淨。
  2. partition() 方法的使用:根據指定的分隔符將字串分解為多個部分,方便進一步處理。
  3. 實際應用:在處理使用者輸入或解析資料檔案時,這些方法可以簡化資料處理流程。

軟體組織與檔案處理

Python 提供了多種方式來組織軟體成為概念上的單元。長篇且雜亂的指令碼難以閱讀、維護或擴充套件。Python 提供了套件、模組、類別和函式等多層級的組織方式。在我們的諜報工具開發過程中,將會逐步介紹這些組織技巧。

函式定義與使用

在前面的章節中,我們已經使用了許多 Python 的內建函式。定義自己的函式需要使用 def 陳述式。函式定義能夠幫助我們總結和一般化某些處理過程。下面是一個簡單的函式,用於從使用者取得小數值:

def get_decimal(prompt):
    value = None
    while value is None:
        entry = input(prompt)
        try:
            value = Decimal(entry)
        except decimal.InvalidOperation:
            print("Invalid: ", entry)
    return value

內容解密:

  1. get_decimal 函式接收一個提示訊息 prompt,並持續要求使用者輸入直到輸入有效的十進位數字。
  2. 使用 try-except 結構捕捉 decimal.InvalidOperation 例外,確保輸入值為有效的十進位數字。
  3. 函式傳回一個 Decimal 物件,避免浮點數運算中的精確度問題。

我們可以像這樣使用 get_decimal() 函式:

grd_usd = get_decimal("GRD conversion: ")

Python 允許在呼叫函式時以多種方式傳遞引數值。其中一個常見的技巧是使用可選引數,並透過關鍵字引數提供值。例如,print() 函式就具備這個特性,我們可以透過關鍵字引數指定輸出檔案:

import sys
print("Error", file=sys.stderr)

如果未提供 file 引數,則預設使用 sys.stdout

我們可以在自己的函式中實作類別似的功能,語法如下:

def report(grd_usd, target=sys.stdout):
    lunch_grd = Decimal('12900')
    bribe_grd = 50000
    cab_usd = Decimal('23.50')
    lunch_usd = (lunch_grd / grd_usd).quantize(PENNY)
    bribe_usd = (bribe_grd / grd_usd).quantize(PENNY)

    receipt_1 = "{0:12s} {1:6.2f} USD"
    receipt_2 = "{0:12s} {1:8.0f} GRD {2:6.2f} USD"
    print(receipt_2.format("Lunch", lunch_grd, lunch_usd), file=target)
    print(receipt_2.format("Bribe", bribe_grd, bribe_usd), file=target)
    print(receipt_1.format("Cab", cab_usd), file=target)
    print(receipt_1.format("Total", lunch_usd + bribe_usd + cab_usd), file=target)

內容解密:

  1. report 函式具有兩個引數:grd_usd 是必填引數,而 target 是可選引數,預設值為 sys.stdout
  2. 函式內部使用了全域變數 PENNY,該變數在函式外部定義。
  3. 使用 print() 函式並透過 file=target 指定輸出目標,若未提供 target 值,則預設輸出到 sys.stdout

我們可以透過多種方式呼叫這個函式。例如:

rate = get_decimal("GRD conversion: ")
print(rate, "GRD = 1 USD")
report(rate)

或者:

rate = get_decimal("GRD conversion: ")
print(rate, "GRD = 1 USD", file=sys.stdout)
report(grd_usd=rate, target=sys.stdout)

檔案與資料夾處理

我們的電腦中充滿了各種檔案。作業系統對檔案和裝置的管理是其最重要的功能之一。Python 為我們提供了極佳的檔案存取能力。

建立檔案

我們將從建立一個文字檔案開始,探討檔案處理的幾個重要導向:

  1. 建立檔案物件:檔案物件是 Python 對作業系統資源的抽象表示。
  2. 使用檔案上下文管理器:檔案有其生命週期,包括開啟、讀寫和關閉。使用 with 陳述式可以確保檔案被正確關閉,並釋放相關的作業系統資源。

建立檔案的一般範本如下:

with open("message1.txt", "w") as target:
    print("Message to HQ", file=target)
    print("Device Size 10 31/32", file=target)

內容解密:

  1. 使用 open() 函式開啟檔案,模式為 'w'(寫入模式)。
  2. with 陳述式的縮排區塊內,使用 print() 函式將資料寫入檔案。
  3. 當離開 with 陳述式區塊時,檔案會被自動關閉,相關的作業系統資源也會被釋放。

這種方式確保了檔案操作的正確性和資源管理的效率。接下來的章節中,我們將進一步探討更多關於檔案處理和標準化格式的內容。