我需要使用指针才能通过'curve_fit' Scipy函数调用'popt'变量吗?

6 浏览
0 Comments

我需要使用指针才能通过'curve_fit' Scipy函数调用'popt'变量吗?

在这些函数定义中,*args**kwargs是什么意思?

def foo(x, y, *args):
    pass
def bar(x, y, **kwargs):
    pass


请查看在函数调用中,**(双星号/星号)和*(星号/星号)的意义是什么?,了解关于参数的补充问题。

admin 更改状态以发布 2023年5月21日
0
0 Comments

值得注意的是,你也可以在调用函数时使用 ***。这是一种快捷方式,允许你直接使用列表/元组或字典向函数传递多个参数。例如,如果有以下函数:

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'

0
0 Comments

*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中成为标准。
0