Python类型处理与推导式

欢迎来到啾啾的博客。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论。

目录

  • 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: 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代码
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)。

你可能感兴趣的:(#,Python基础,python,windows,开发语言)