符号
大约 4 分钟
符号
在 Python 中,在函数调用或数据结构中使用 **...
(省略号)、*
(星号)、**
(双星号)** 有不同的作用,具体如下:
...
(省略号 Ellipsis)
1. 作用:表示 省略(Ellipsis),常用于 NumPy、占位符、类型注解等。
示例 1:NumPy 切片
import numpy as np
arr = np.random.rand(3, 4, 5)
# 使用 `...` 选择所有前两维的元素
print(arr[..., 0].shape) # (3, 4)
示例 2:作为占位符
def my_function():
... # 这里可以先不写代码,相当于 pass
示例 3:类型注解
from typing import Callable
def func(x: int, y: int) -> ...: # 表示返回值未确定
return x + y
*
(单星号)
2. 作用:
- 解包(Unpacking):用于列表、元组、参数等的解包
- 变长参数:用于函数参数,使其接受多个位置参数
示例 1:列表解包
a = [1, 2, 3]
print(*a) # 1 2 3
示例 2:变长参数
def add(*args):
return sum(args)
print(add(1, 2, 3)) # 6
**
(双星号)**
**3. 作用:
- 字典解包:用于字典的键值对解包
- 关键字参数:用于函数参数,使其接受多个键值对
示例 1:字典解包
dict1 = {"x": 1, "y": 2}
dict2 = {"z": 3, **dict1} # 合并字典
print(dict2) # {'z': 3, 'x': 1, 'y': 2}
示例 2:关键字参数
def person_info(**kwargs):
print(kwargs)
person_info(name="Alice", age=25)
# 输出:{'name': 'Alice', 'age': 25}
[:]
数组切片
4. 在 Python 中,中括号中的冒号(:)用于切片操作。具体来说,dirs[:]表示对列表 dirs 进行切片操作,生成一个新的列表,该列表包含 dirs 中的所有元素。
在 Python 中,切片操作是一种强大的工具,可以用于提取、修改和操作序列(如列表、字符串、元组等)。以下是切片的所有常见用法:
基本切片:
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] subset = numbers[2:7] print(subset) # 输出: [2, 3, 4, 5, 6]
省略开始或结束索引:
start_to_five = numbers[:5] print(start_to_five) # 输出: [0, 1, 2, 3, 4] five_to_end = numbers[5:] print(five_to_end) # 输出: [5, 6, 7, 8, 9]
使用负数索引:
last_three = numbers[-3:] print(last_three) # 输出: [7, 8, 9] exclude_last_two = numbers[:-2] print(exclude_last_two) # 输出: [0, 1, 2, 3, 4, 5, 6, 7]
步长:
every_second = numbers[::2] print(every_second) # 输出: [0, 2, 4, 6, 8] reverse = numbers[::-1] print(reverse) # 输出: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
修改列表中的元素:
numbers[2:5] = [20, 30, 40] print(numbers) # 输出: [0, 1, 20, 30, 40, 5, 6, 7, 8, 9]
删除列表中的元素:
numbers[2:5] = [] print(numbers) # 输出: [0, 1, 5, 6, 7, 8, 9]
字符串切片:
text = "Hello, World!" substring = text[7:12] print(substring) # 输出: "World"
元组切片:
tuple_example = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) subset_tuple = tuple_example[2:7] print(subset_tuple) # 输出: (2, 3, 4, 5, 6)
总结
符号 | 作用 | 典型用途 |
---|---|---|
... | 省略号 | 占位符、NumPy 切片、类型注解 |
* | 解包、可变参数 | 列表/元组解包、变长参数 |
** | 字典解包、关键字参数 | 字典解包、函数关键字参数 |
[:] | 切片 | 用于数组切片 |
在 pydantic 中使用省略号
在 Pydantic 中,Field(...)
使用省略号 ...
(Ellipsis),表示该字段是必填的,不能省略或为空。
...
在 Pydantic Field
中的作用
📌 省略号 在 Pydantic 的 Field()
里,...
表示该字段 没有默认值,必须由用户提供,否则会报错。
✅ 示例 1:必填字段
from pydantic import BaseModel, Field
from typing import List
class UserModel(BaseModel):
username: str = Field(..., description="用户名") # 必填
login_other: List[str] = Field(..., description="第三方登录") # 必填
# ❌ 省略字段会报错
UserModel(username="Alice")
# pydantic.error_wrappers.ValidationError: missing field: login_other
...
与 None
、默认值的区别
📌 省略号 语法 | 作用 | 是否必填 |
---|---|---|
Field(...) | 强制必填(用户必须提供) | ✅ 是 |
Field(None) | 可选字段,默认值为 None | ❌ 否 |
Field(default_value) | 有默认值,如果不传就用默认值 | ❌ 否 |
✅ 示例 2:可选 vs 必填
class UserModel(BaseModel):
required_field: str = Field(..., description="必须填写")
optional_field: str = Field(None, description="可以为空")
default_field: str = Field("default_value", description="默认值为 'default_value'")
UserModel(required_field="data") # ✅ 成功
UserModel(optional_field="data") # ✅ 成功
UserModel() # ❌ 缺少 required_field,会报错
...
而不是 None
?
📌 为什么要用 None
表示 可选字段,但...
强制要求用户提供值。...
比None
更加严格,用于必须提供的字段。
Field(...)
?
📌 什么时候用 - 如果一个字段必须由用户提供,用
Field(...)
。 - 如果字段可以为空,用
Field(None)
或Optional[...]
。
你这个 login_other: List[str] = Field(...)
,说明:
- 这个字段必须提供,否则 Pydantic 会报错。
- 你可以在
description
里加上更详细的提示,方便文档生成。 😊