python Optional可选的用法

示例 1:表示单个可选值

from typing import Optional

def get_name(user_id: int) -> Optional[str]:
    # 定义一个函数 get_name,接收一个整数 user_id,返回值可以是字符串或 None
    if user_id == 1:
        return "Alice"  # 如果 user_id 是 1,返回字符串 "Alice"
    else:
        return None  # 否则返回 None,表示没有找到用户

# 测试
name = get_name(2)  # 调用函数,传入 user_id 2
print(name)  # 输出: None,表示没有找到对应用户

解析:

  • from typing import Optional: 从 typing 模块导入 Optional 类型。
  • def get_name(user_id: int) -> Optional[str]: 定义函数 get_name,参数 user_id 为整数,返回值可以是字符串或 None
  • if user_id == 1:: 检查 user_id 是否为 1。
  • return "Alice": 如果条件成立,返回字符串 “Alice”。
  • return None: 如果条件不成立,返回 None

示例 2:表示列表中的可选元素

from typing import List, Optional

def process_numbers(nums: List[Optional[int]]) -> List[int]:
    # 定义一个函数 process_numbers,接收一个整数列表 nums,其中的元素可以是 int 或 None
    return [num for num in nums if num is not None]  # 过滤掉列表中的 None 值

# 测试
numbers = [1, None, 2, None, 3]  # 创建一个包含 int 和 None 的列表
processed = process_numbers(numbers)  # 调用函数,处理列表
print(processed)  # 输出: [1, 2, 3],返回过滤掉 None 后的新列表

解析:

  • def process_numbers(nums: List[Optional[int]]) -> List[int]: 定义函数 process_numbers,接受一个包含 Optional[int] 的列表,返回一个只含有 int 的列表。
  • [num for num in nums if num is not None]: 列表推导式,循环遍历 nums,并仅保留非 None 的元素。

示例 3:字典中的可选值

from typing import Dict, Optional

def get_user_data() -> Dict[str, Optional[str]]:
    # 定义一个函数 get_user_data,返回一个字典,字典的值可以是字符串或 None
    return {
        "name": "Bob",  # 用户名
        "email": None,  # 邮箱缺失,值为 None
        "phone": "123-456-7890"  # 电话号码
    }

# 测试
user_data = get_user_data()  # 调用函数获取用户数据
print(user_data)  # 输出: {'name': 'Bob', 'email': None, 'phone': '123-456-7890'}

解析:

  • def get_user_data() -> Dict[str, Optional[str]]: 定义函数 get_user_data,返回一个字典,键是字符串,值是可选字符串(可以是字符串或 None)。
  • 返回的字典中,"email" 的值为 None,表示该用户没有提供邮箱。

示例 4:嵌套的可选值

from typing import List, Optional

def find_item(items: List[Optional[str]], search: str) -> Optional[int]:
    # 定义一个函数 find_item,接收一个可选字符串列表和待查找的字符串
    for index, item in enumerate(items):  # 遍历列表,获取元素的索引和内容
        if item == search:  # 如果当前元素与搜索项相同
            return index  # 返回该元素的索引
    return None  # 如果没有找到,返回 None

# 测试
items = ["apple", None, "banana"]  # 包含字符串和 None 的列表
index = find_item(items, "banana")  # 查找 "banana" 的索引
print(index)  # 输出: 2,表示 "banana" 在列表中的索引是 2
index_not_found = find_item(items, "orange")  # 查找 "orange" 的索引
print(index_not_found)  # 输出: None,表示没有找到 "orange"

解析:

  • def find_item(items: List[Optional[str]], search: str) -> Optional[int]: 定义函数 find_item,接受一个可选字符串列表和一个待查找的字符串,返回索引或 None
  • for index, item in enumerate(items): 使用 enumerate 迭代列表,获得每个元素的索引和内容。
  • if item == search: 检查当前元素是否与要查找的字符串相同。
  • return None: 如果没有找到匹配项,返回 None

总结

  • Optional[X]: 表示可以是类型 X 的值或者 None
  • 结合其他类型使用: Optional 常与 List, Dict 等集合类型结合,表示集合中的元素可以是 None
  • 应用场景:
    • 函数返回值可以是某种类型或 None,使得函数的返回值更灵活。
    • 列表或字典中可以存在缺失的值,适合处理不完整的数据。
    • 明确哪些值是可选的,提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值