Python类型处理与推导式

欢迎来到啾啾的博客🐱。

记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。

有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。

目录

  • [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)。

相关推荐
智能砖头5 分钟前
本地文档AI助手:基于LangChain和Qwen2.5的智能问答系统
人工智能·python
郭枫寅1 小时前
第二课 Python 注释与规范格式
python
郭枫寅1 小时前
第三课 Python中的简单数据类型
python
郭枫寅1 小时前
第四课 Python基础语法(一)
python
JavaEdge在掘金2 小时前
解决 Maven os.detected.classifier 报错:快速修复指南
python
HEY_FLYINGPIG4 小时前
【FLASK】FLASK应用中的多用户并行登录与加密
后端·python·flask
fydw_7154 小时前
Flask-login 处理授权逻辑
后端·python·flask
ZHOU_WUYI4 小时前
Flask 动态模块注册
后端·python·flask
全干engineer4 小时前
Web3-Web3.js核心操作:Metamask、合约调用、事件订阅全指南
开发语言·javascript·web3·区块链·智能合约
Blossom.1184 小时前
基于深度学习的智能图像增强技术:原理、实现与应用
人工智能·python·深度学习·神经网络·机器学习·tensorflow·sklearn