我需要使用指针才能通过'curve_fit' Scipy函数调用'popt'变量吗?
我需要使用指针才能通过'curve_fit' Scipy函数调用'popt'变量吗?
在这些函数定义中,*args
和**kwargs
是什么意思?
def foo(x, y, *args): pass def bar(x, y, **kwargs): pass
请查看在函数调用中,**(双星号/星号)和*(星号/星号)的意义是什么?,了解关于参数的补充问题。
admin 更改状态以发布 2023年5月21日
值得注意的是,你也可以在调用函数时使用 *
和 **
。这是一种快捷方式,允许你直接使用列表/元组或字典向函数传递多个参数。例如,如果有以下函数:
def foo(x,y,z): print("x=" + str(x)) print("y=" + str(y)) print("z=" + str(z))
你可以这样做:
>>> mylist = [1,2,3] >>> foo(*mylist) x=1 y=2 z=3 >>> mydict = {'x':1,'y':2,'z':3} >>> foo(**mydict) x=1 y=2 z=3 >>> mytuple = (1, 2, 3) >>> foo(*mytuple) x=1 y=2 z=3
注:字典 mydict
中的键必须与函数 foo
的参数名完全相同。否则会抛出TypeError
异常:
>>> mydict = {'x':1,'y':2,'z':3,'badnews':9} >>> foo(**mydict) Traceback (most recent call last): File "", line 1, in TypeError: foo() got an unexpected keyword argument 'badnews'
*args
和**kwargs
是一种常见的习语,它允许函数接受任意数量的参数,如Python文档的更多有关定义函数的内容中所述。
*args
将会把所有的函数参数作为元组返回:
def foo(*args): for a in args: print(a) foo(1) # 1 foo(1,2,3) # 1 # 2 # 3
**kwargs
将会把所有除了对应形式参数以外的关键字参数作为字典返回。
def bar(**kwargs): for a in kwargs: print(a, kwargs[a]) bar(name='one', age=27) # name one # age 27
这两种习惯用法都可以与普通参数混用,以允许一组固定参数和一些可变参数:
def foo(kind, *args, **kwargs): pass
也可以反过来使用这种方式:
def foo(a, b, c): print(a, b, c) obj = {'b':10, 'c':'lee'} foo(100,**obj) # 100 10 lee
使用*l
的另一个用法是在调用函数时展开参数列表。
def foo(bar, lee): print(bar, lee) l = [1,2] foo(*l) # 1 2
在Python 3中,可以在赋值的左侧使用*l
(扩展可迭代解包),但在此上下文中,它会返回一个列表而不是一个元组:
first, *rest = [1,2,3,4] first, *l, last = [1,2,3,4]
此外,Python 3添加了新的语义(参见PEP 3102):
def func(arg1, arg2, arg3, *, kwarg1, kwarg2): pass
例如,在Python 3中,以下代码可以工作,但在Python 2中不能:
>>> x = [1, 2] >>> [*x] [1, 2] >>> [*x, 3, 4] [1, 2, 3, 4] >>> x = {1:1, 2:2} >>> x {1: 1, 2: 2} >>> {**x, 3:3, 4:4} {1: 1, 2: 2, 3: 3, 4: 4}
这样的函数只接受3个位置参数,*
后面的所有内容只能作为关键字参数传递。
注意事项:
- 在Python中,
dict
被用于传递关键字参数,具有任意排序性质。然而,在Python 3.6中,关键字参数保持插入顺序。 - "在
**kwargs
中的元素顺序现在与传递给函数的关键字参数的顺序相对应。" - Python 3.6的新特性 - 实际上,在CPython 3.6中,所有的字典都会记住插入顺序作为实现细节,这在Python 3.7中成为标准。