自己经常混*
的用处,为此特意总结记录。
在Python中,函数定义中的*
(星号)用于指示位置参数的结束和关键字参数的开始。具体来说,*
之后的参数必须以关键字参数的形式传递。
用在函数参数中
在我的例子中:
python
def __init__(self, *, name: str, grams: float):
这里的*
表示在*
之后的参数name
和grams
必须通过关键字来传递,而不能通过位置来传递。也就是说,你必须这样调用这个构造函数:
python
obj = 类名(name="example", grams=10.5)
而不能这样调用:
python
obj = 类名("example", 10.5) # 这会导致错误
这种用法有助于提高代码的可读性和明确性,特别是在构造函数或方法有很多参数时,明确指出哪些参数必须通过关键字传递,可以避免参数顺序错误的问题。
在Python中,*
(星号)在函数定义和调用中有多种用途,主要包括以下几种情况:
-
单星号
*
用于收集和解包位置参数:-
收集位置参数: 在函数定义中,
*args
用于收集所有传递给函数的位置参数,并将它们打包成一个元组。pythondef example_function(*args): for arg in args: print(arg) example_function(1, 2, 3) # 输出: 1 2 3
-
解包位置参数: 在函数调用中,
*
用于解包一个可迭代对象(如列表、元组),将其元素作为单独的位置参数传递给函数。pythondef example_function(a, b, c): print(a, b, c) args = [1, 2, 3] example_function(*args) # 输出: 1 2 3
-
-
双星号
**
用于收集和解包关键字参数:-
收集关键字参数: 在函数定义中,
**kwargs
用于收集所有传递给函数的关键字参数,并将它们打包成一个字典。pythondef example_function(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") example_function(a=1, b=2, c=3) # 输出: a: 1 b: 2 c: 3
-
解包关键字参数: 在函数调用中,
**
用于解包一个字典,将其键值对作为单独的关键字参数传递给函数。pythondef example_function(a=0, b=0, c=0): print(a, b, c) kwargs = {'a': 1, 'b': 2, 'c': 3} example_function(**kwargs) # 输出: 1 2 3
-
-
单星号
*
用于指示关键字参数的开始:如前所述,
*
在函数定义中可以用于指示位置参数的结束和关键字参数的开始。pythondef example_function(*, a, b): print(a, b) example_function(a=1, b=2) # 输出: 1 2
总结来说,*
和**
在Python函数中主要用于参数的收集和解包,以及指示关键字参数的开始。这些特性使得函数定义和调用更加灵活和强大。