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
內容解密:
length, width = Fraction(9, 4), Fraction(39, 8):初始化length和width兩個變數。length, width = width, length:使用多重指定陳述式交換length和width的值。- 右側的運算元會先被計算完畢,然後再指定給左側的變數。
此外,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
內容解密:
total = Decimal('0'):初始化total變數為 0。total += lunch_usd、total += bribe_usd、total += cab_usd:使用增強指定陳述式將各項費用累加到total中。- 最終輸出總計金額。
編寫指令碼與輸出結果
在大多數情況下,我們不會在 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
內容解密:
from decimal import Decimal:匯入Decimal模組,用於處理貨幣計算。PENNY = Decimal('.01'):定義一個常數PENNY,用於四捨五入到小數點後兩位。grd_usd = Decimal('247.616'):定義匯率轉換因子。- 使用
quantize()方法將金額四捨五入到小數點後兩位。 - 使用
print()函式輸出收據內容。
使用註解與變數命名
在程式碼中新增註解(Comments)可以幫助他人理解程式碼的用途。註解以 # 符號開頭,例如:
grd_usd = Decimal('247.616') # Mihalis Bank 的匯率,日期:5/15/14
良好的變數命名可以提高程式碼的可讀性。例如,使用 lunch_grd 和 lunch_usd 分別表示以 GRD 和 USD 為單位的午餐費用。
使用者輸入與例外處理
在開發應用程式時,經常需要從使用者那裡取得輸入。在 Python 中,可以使用 input() 函式來實作這一點。然而,使用者輸入的資料可能不符合預期,因此需要進行適當的處理。
取得使用者輸入
首先,讓我們看看如何使用 input() 函式來取得使用者輸入:
entry = input("GRD 轉換:")
grd_usd = Decimal(entry)
第一行程式碼會顯示提示訊息並等待使用者輸入。使用者輸入的內容會被指定給 entry 變數。然而,entry 是一個字串,不能直接用於算術運算。因此,需要將其轉換為合適的數值型別。
內容解密:
input()函式用於取得使用者輸入,傳回一個字串。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'>]
在這種情況下,程式會當機並顯示錯誤訊息。
內容解密:
decimal.InvalidOperation例外是在Decimal物件無法解析輸入字串時引發的。- 使用
try-except區塊可以捕捉和處理例外,避免程式當機。
使用 try-except 區塊處理例外
可以使用 try-except 區塊來捕捉和處理例外:
entry = input("GRD 轉換:")
try:
grd_usd = Decimal(entry)
except decimal.InvalidOperation:
print("無效輸入:", entry)
在這個例子中,如果 Decimal(entry) 引發 decimal.InvalidOperation 例外,就會執行 except 區塊中的程式碼,輸出錯誤訊息。
內容解密:
try區塊包含可能引發例外的程式碼。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")
在這個例子中,程式會不斷提示使用者輸入,直到輸入有效的數值。
內容解密:
while迴圈用於重複執行程式碼,直到grd_usd不再是None。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.'
在這個例子中,展示瞭如何使用單引號、雙引號和三引號來定義字串。
內容解密:
- Python 中的字串可以用單引號、雙引號或三引號來定義。
- 三引號可以用於定義跨越多行的字串。
字串處理與格式化輸出
在 Python 中,字串是一種基本且重要的資料型別。我們可以使用單引號或雙引號來建立短字串,而使用三重引號或三重單引號來建立長字串。長字串可以跨越多行程式碼,這在撰寫複雜的文字輸出或檔案時非常有用。
字串中的特殊字元與轉義序列
Python 使用反斜線(\)作為跳脫字元,以表示某些特殊字元。例如,\n 表示換行字元。當 Python 回應字串時,會使用 \n 來表示換行。
>>> "Hello\nWorld"
'Hello\nWorld'
>>> print("Hello\nWorld")
Hello
World
內容解密:
- 特殊字元的使用:在字串中使用
\n可以實作換行輸出。 - 跳脫字元的作用:反斜線(\)用於轉義特殊字元,使其具有特殊意義。
- 實際應用:在需要格式化輸出的場景中,合理使用跳脫字元可以提高程式碼的可讀性和輸出效果。
Unicode 字元的使用
當我們需要使用鍵盤上不存在的特殊字元時,可以使用 Unicode 編碼。Python 提供了兩種方式來表示 Unicode 字元:使用 \u 加上四位十六進位制數,或使用 \N{字元名稱}。
>>> "\u2328"
'⌨'
>>> "\N{KEYBOARD}"
'⌨'
內容解密:
- Unicode 編碼的使用:透過
\u和四位十六進位制數可以直接表示 Unicode 字元。 - 字元名稱的使用:使用
\N{字元名稱}可以更直觀地表示特殊字元,無需記住具體的 Unicode 編碼。 - 實際應用:在需要顯示特殊符號的場景中,使用 Unicode 字元可以豐富輸出內容。
字串與數值之間的轉換
Python 提供了多種函式來實作字串與數值之間的轉換,例如 int(), float(), Decimal(), fractions.Fraction(), 和 complex()。
>>> int('dead', 16)
57005
>>> int('0b1101111010101101', 2)
57005
內容解密:
- 不同進位制之間的轉換:使用
int()函式可以將不同進位制的字串轉換為整數。 int()函式的靈活性:透過指定基數,可以處理二進位制、八進位制、十六進位制等不同進位制的字串。- 實際應用:在處理不同進位制的資料時,這些轉換函式非常有用。
使用 format() 方法進行格式化輸出
format() 方法允許我們使用格式規範字串來定義輸出的格式,從而實作複雜的數值到字串的轉換。
>>> "{0:12s} {1:6.2f} USD {2:8.0f} GRD".format("lunch", 52.10, 12900)
'lunch 52.10 USD 12900 GRD'
內容解密:
format()方法的基本用法:透過格式規範字串,可以控制輸出的格式和對齊方式。- 格式規範的組成:格式規範包括位置索引、格式說明符等部分,共同決定了輸出的樣式。
- 實際應用:在生成報表或需要格式化輸出的場景中,
format()方法非常實用。
字串的解析與分解
Python 中的字串物件提供了多種方法來解析和分解字串,例如 strip() 和 partition()。
>>> " 123.45 ".strip()
'123.45'
>>> amount, space, currency = "123.45 USD".partition(" ")
>>> amount
'123.45'
>>> currency
'USD'
內容解密:
strip()方法的作用:去除字串前後的空白字元,使資料更乾淨。partition()方法的使用:根據指定的分隔符將字串分解為多個部分,方便進一步處理。- 實際應用:在處理使用者輸入或解析資料檔案時,這些方法可以簡化資料處理流程。
軟體組織與檔案處理
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
內容解密:
get_decimal函式接收一個提示訊息prompt,並持續要求使用者輸入直到輸入有效的十進位數字。- 使用
try-except結構捕捉decimal.InvalidOperation例外,確保輸入值為有效的十進位數字。 - 函式傳回一個
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)
內容解密:
report函式具有兩個引數:grd_usd是必填引數,而target是可選引數,預設值為sys.stdout。- 函式內部使用了全域變數
PENNY,該變數在函式外部定義。 - 使用
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 為我們提供了極佳的檔案存取能力。
建立檔案
我們將從建立一個文字檔案開始,探討檔案處理的幾個重要導向:
- 建立檔案物件:檔案物件是 Python 對作業系統資源的抽象表示。
- 使用檔案上下文管理器:檔案有其生命週期,包括開啟、讀寫和關閉。使用
with陳述式可以確保檔案被正確關閉,並釋放相關的作業系統資源。
建立檔案的一般範本如下:
with open("message1.txt", "w") as target:
print("Message to HQ", file=target)
print("Device Size 10 31/32", file=target)
內容解密:
- 使用
open()函式開啟檔案,模式為'w'(寫入模式)。 - 在
with陳述式的縮排區塊內,使用print()函式將資料寫入檔案。 - 當離開
with陳述式區塊時,檔案會被自動關閉,相關的作業系統資源也會被釋放。
這種方式確保了檔案操作的正確性和資源管理的效率。接下來的章節中,我們將進一步探討更多關於檔案處理和標準化格式的內容。