欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。
目录
- [1 引言](#1 引言)
- [2 类型处理](#2 类型处理)
- [3 高效操作AI开发常见数据结构](#3 高效操作AI开发常见数据结构)
-
- [3.1 list推导式](#3.1 list推导式)
- [3.2 dict推导式](#3.2 dict推导式)
1 引言
速成之后巩固一下。
2 类型处理
和Java静态类型不同,Python是动态类型的。
动态类型不用声明,但在使用时往往不知道类型,所以Python 3.5版本之后引入了一个非常重要的特性:
- 类型提示 (Type Hinting)
它的作用,就是在代码中"提示"一个变量、函数参数或返回值应该是什么类型。
python
**传统的Python方式 (纯动态类型):**
name = "World"
process_id = 123
**现代的Python方式:**
name: str = "World"
process_id: int = 123
和Java不同,Python的类型提示在默认情况下是 不强制 的。也就是说,即便你给一个标记为 str 的变量赋予一个整数,Python解释器本身在运行时 不会报错 。
它的真正威力在于 开发阶段。现代的IDE和一些叫做"静态类型检查器"(如Mypy)的工具,会读取这些提示,像Java的编译器一样,在代码运行前就给你指出潜在的类型错误。
除了这个,Python还有一个Pydantic库,可以用于处理复杂情况下的数据类型,让代码变得更具可读性,且能抛出清晰的错误。
python
from pydantic import BaseModel
from typing import List, Dict
# 1. 我们用类型提示来"定义"我们期望的数据结构
class Message(BaseModel):
role: str
content: str
class Choice(BaseModel):
index: int
message: Message
finish_reason: str
class APIResponse(BaseModel):
id: str
model: str
choices: 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
# 这是用传统循环方式实现的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]
- 列表推导式
python
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 中。现在,您需要进行数据预处理。
python
reviews = [
"这个产品太棒了!",
"不好用。",
"强烈推荐,物超所值!",
"有点小贵",
"物流很快"
]
result = [review for review in reviews if len(review) > 5]
3.2 dict推导式
假设我们有一个列表,里面是产品名称。我们还有一个需求,要创建一个字典,其中 键(key) 是产品名称,值(value) 是这个产品名称的字符长度。
python
products = ["Laptop", "Mouse", "Keyboard"]
# 期待字典为
{'Laptop': 6, 'Mouse': 5, 'Keyboard': 8}
使用字典推导式,可以这么写:
python
product_lengths = {product: len(product) for product in products}
结构{<键表达式>: <值表达式> for <元素> in <可迭代对象>}
使用推导式可以快速地转换list为dict,可以将后续查询的时间复杂度由O(n)变为O(1)。