Python 函数定义

本文详细介绍了 Python 函数声明和定义的各种方式,有些在阅读标准库函数和开源代码时经常会遇到,特此整理总结一下。

类型建议符

类型建议符(Type Hints)是 Python 3.5 新增的功能,在 typing 模块中实现。可以通过 冒号箭头 来表示函数的参数类型和返回值类型,主要起到 注释 的作用。

  • 冒号:函数参数的类型建议符
  • 箭头:函数返回值的类型建议符

Python 运行时不强制执行函数和变量类型注解(实际使用中违反了也不会报错),但这些注解可用于类型检查器、IDE、静态检查器等第三方工具。

typing 模块的常用类型:

  • Union:并集,Union[X, Y] 表示要么 X 类型、要么 Y 类型。
  • Optional:可选,等同于 Union[X, None],表示可以为 None。

示例:类型建议符的使用

1
2
3
# 声明函数的参数为str类型,返回值为int类型
def converse(x: str) -> int:
return int(x)

Ellipsis 对象(…):语义上表示省略,可以在 Type Hints 中做占位符使用。

关键字参数

如果你有一些具有许多参数的函数,而你又希望只对其中的一些进行指定,那么你可以通过 关键字 而非 位置 来给这些参数赋值。这样做有两大优点:

  1. 不再需要考虑参数的顺序,函数的使用将更加容易。
  2. 可以只对需要指定的参数赋值,只要其它的参数都具有默认参数值。

示例:关键字参数的使用

1
2
3
4
5
6
7
def func(a, b=5, c=10):
print(f'a:{a}, b:{b}, c:{c}')


func(1, 2) # a:1, b:2, c:10
func(1, c=2) # a:1, b:5, c:2
func(c=2, a=1) # a:1, b:5, c:2

可变参数

在 Python 函数定义中,使用 *args 星号参数或 **kwargs 双星号参数声明参数列表可接受任意数量的参数,统称为可变参数。

函数定义时

  • *args 表示可接受任意个(包含0个)位置参数,当函数调用时,所有未匹配的位置参数(Positional Arguments)会被组成一个 tuple 对象,局部变量 args 指向此 tuple 对象。
  • **kwargs 表示可接受任意个(包含0个)关键字参数,当函数调用时,所有未匹配的关键字参数(Keyword Arguments)会被组成一个 dict 对象,局部变量kwargs 指向此 dict 对象。

函数调用时

  • *var 表示解包 tuple 对象中的每个元素作为函数调用时传入的位置参数。
  • **var 表示解包 dict 对象中的每个元素作为函数调用时传入的关键字参数。

注:元组解包 是完全独立的一个功能,在未定义可变参数的函数上也可以使用。

示例:可变参数的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def func(*args, **kwargs):
if args:
print(args)
for item in args:
print(item)
if kwargs:
print(kwargs)
for k, v in kwargs.items():
print(k, v)


my_tuple = (1, 'a', [1, 2, 3])
func(*my_tuple) # 等同于 func(1, 'a', [1, 2, 3])

my_dict = {'name': 'xiao bing', 'age': 23}
func(**my_dict) # 等同于 func(name='xiao bing', age=23)

# 复杂参数传递
threading.Thread(target=web.run_app, args=[app], kwargs={'host': '127.0.0.1', 'port': 9643}).start()

限定参数

从 Python 3.8 开始,函数参数中允许出现 /* 号,分别表示 限定位置参数限定关键字参数(也称作命名关键字参数)。/ 用来指明在其前面的参数必须使用位置参数而非关键字参数的形式,* 单独出现在参数中表示其后面的参数必须为关键字参数形式。

示例一:限定参数的使用

1
2
3
4
5
def func(a, b, /, c=10, *, d, e=50):
print(a + b + c + d + e)


func(1, 2, 3, d=4, e=5)

示例二:综合应用

1
2
3
4
5
6
7
# 以下代码的输出是什么?
def func(a: list, b: int, /, c=10.0, *, d: int, e=50, **f) -> str:
return f'{a + [(b * c) + d + e]} + {f}'


data = (2, 3)
print(func([1], *data, value=123, d=4, e=5)) # [1, 15] + {'value': 123}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!