歡迎來到啾啾的博客🐱。
記錄學習點滴。分享工作思考和實用技巧,偶爾也分享一些雜談💬。
有很多很多不足的地方,歡迎評論交流,感謝您的閱讀和評論😄。
目錄
- 1 引言
- 2 類型處理
- 3 高效操作AI開發常見數據結構
- 3.1 list推導式
- 3.2 dict推導式
1 引言
速成之后鞏固一下。
2 類型處理
和Java靜態類型不同,Python是動態類型的。
動態類型不用聲明,但在使用時往往不知道類型,所以Python 3.5版本之后引入了一個非常重要的特性:
- 類型提示 (Type Hinting)
它的作用,就是在代碼中“提示”一個變量、函數參數或返回值應該是什么類型。
**傳統的Python方式 (純動態類型):**
name = "World"
process_id = 123**現代的Python方式:**
name: str = "World"
process_id: int = 123
和Java不同,Python的類型提示在默認情況下是?不強制?的。也就是說,即便你給一個標記為?str?的變量賦予一個整數,Python解釋器本身在運行時?不會報錯。
它的真正威力在于?開發階段。現代的IDE和一些叫做“靜態類型檢查器”(如Mypy)的工具,會讀取這些提示,像Java的編譯器一樣,在代碼運行前就給你指出潛在的類型錯誤。
除了這個,Python還有一個Pydantic庫,可以用于處理復雜情況下的數據類型,讓代碼變得更具可讀性,且能拋出清晰的錯誤。
from pydantic import BaseModel
from typing import List, Dict# 1. 我們用類型提示來“定義”我們期望的數據結構
class Message(BaseModel):role: strcontent: strclass Choice(BaseModel):index: intmessage: Messagefinish_reason: strclass APIResponse(BaseModel):id: strmodel: strchoices: List[Choice] # 這里明確指出choices是一個包含Choice對象的列表usage: Dict[str, int]def get_from_api():api_response = {"id": "chatcmpl-123","object": "chat.completion","created": 1677652288,"model": "gpt-4","choices": [{"index": 0,"message": {"role": "assistant","content": "你好!有什么可以幫助你的嗎?"},"finish_reason": "stop"}],"usage": {"prompt_tokens": 9,"completion_tokens": 12,"total_tokens": 21}}return api_response# 2. 我們用這個定義好的結構來“解析”原始數據
raw_data = get_from_api() # 假設這里拿到了上面的字典數據
response_model = APIResponse.model_validate(raw_data)# 3. 輸入 response_model. 就會看到 id, model, choices...類型是安全的
content = response_model.choices[0].message.content
3 高效操作AI開發常見數據結構
在 AI 開發中,列表(list)和字典(dict)非常常見。我們來了解一下 Python 是如何利用其獨有特性 —— 推導式(Comprehensions)高效操作它們的。
3.1 list推導式
假設我們有一個需求:給定一個數字列表,我們想要創建一個新的列表,只包含其中所有偶數的平方。
- 傳統的寫法:
# 這是用傳統循環方式實現的Python代碼
numbers = [1, 2, 3, 4, 5, 6]
squares_of_evens = [] # 1. 初始化一個空列表
for number in numbers: # 2. 遍歷原列表if number % 2 == 0: # 3. 判斷條件squares_of_evens.append(number * number) # 4. 添加處理后的結果# 最終結果: [4, 16, 36]
- 列表推導式
numbers = [1, 2, 3, 4, 5, 6]
squares_of_evens = [number * number for number in numbers if number % 2 == 0]# 最終結果: [4, 16, 36]
列表推導式的基本結構是:[<要執行的表達式> for <元素> in <可迭代對象> if <篩選條件>]
這個特性在數據處理中極為常用,比如清洗文本數據、篩選特定樣本、轉換數據格式等等。它不僅代碼更短,通常執行效率也比手動?for?循環加?.append()?的方式要高。
- 例子
假設您從一個文本文件中讀取了很多用戶的評論,存放在一個列表?reviews?中。現在,您需要進行數據預處理。
reviews = ["這個產品太棒了!","不好用。","強烈推薦,物超所值!","有點小貴","物流很快"
]result = [review for review in reviews if len(review) > 5]
3.2 dict推導式
假設我們有一個列表,里面是產品名稱。我們還有一個需求,要創建一個字典,其中?鍵(key)?是產品名稱,值(value)?是這個產品名稱的字符長度。
products = ["Laptop", "Mouse", "Keyboard"]# 期待字典為
{'Laptop': 6, 'Mouse': 5, 'Keyboard': 8}
使用字典推導式,可以這么寫:
product_lengths = {product: len(product) for product in products}
結構{<鍵表達式>: <值表達式> for <元素> in <可迭代對象>}
使用推導式可以快速地轉換list為dict,可以將后續查詢的時間復雜度由O(n)變為O(1)。