欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。
目录
- 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)。