自己经常混*
的用处,为此特意总结记录。
在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
用于收集所有传递给函数的位置参数,并将它们打包成一个元组。python">def example_function(*args):for arg in args:print(arg)example_function(1, 2, 3) # 输出: 1 2 3
-
解包位置参数: 在函数调用中,
*
用于解包一个可迭代对象(如列表、元组),将其元素作为单独的位置参数传递给函数。python">def example_function(a, b, c):print(a, b, c)args = [1, 2, 3] example_function(*args) # 输出: 1 2 3
-
-
双星号
**
用于收集和解包关键字参数:-
收集关键字参数: 在函数定义中,
**kwargs
用于收集所有传递给函数的关键字参数,并将它们打包成一个字典。python">def 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
-
解包关键字参数: 在函数调用中,
**
用于解包一个字典,将其键值对作为单独的关键字参数传递给函数。python">def 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
-
-
单星号
*
用于指示关键字参数的开始:如前所述,
*
在函数定义中可以用于指示位置参数的结束和关键字参数的开始。python">def example_function(*, a, b):print(a, b)example_function(a=1, b=2) # 输出: 1 2
总结来说,*
和**
在Python函数中主要用于参数的收集和解包,以及指示关键字参数的开始。这些特性使得函数定义和调用更加灵活和强大。