函数参数问题

  • 位置参数

必选参数,必须按照位置次序,依次传入参数。

def power(x, n):
    s = 1
    while n > 0:
        n -= 1
        s = s * x
    return s

 

  • 默认参数

给参数赋予值时,就是默认参数

1、是必选参数在前,默认参数在后,否则Python的解释器会报错

def power(x, n=2):
    s = 1
    while n > 0:
        n -= 1
        s = s * x
    return s

2、传入默认参数的必须是不可变参数,不然会影响后续调用

def func(x=[], y=[6, 7]):  # 默认参数一定要用不可变对象
    # Python 中,函数的默认参数在函数定义时被创建,并且在每次函数调用时都会重用相同的对象。
    # 因此,当对默认参数进行修改时,这些修改会影响到下一次对该函数的调用。
    print("此时默认值:", x, y)
    x.append(8)
    y.append(8)
    return x + y


a, b = [1, 2], [3, 4]
t = func(x=a)  # 运行结束时,默认参数x=[],y=[6,7,8],x被赋值,没有改变其默认值,y没有赋值,y.append语句改变的是y默认值的值。
func()  # 执行完该语句,默认参数x=[8],y=[6,7,8,8]
t = func(y=b)  # 默认参数x=[8,8],y=[6,7,8,8]
func()

func被定义时,列表[],[6, 7]在内存中被创建,当调用该func没有传入参数时,并且在func中改变了默认参数变量x,y值时,实际上改变的时内存地址中的列表的值,所以会影响下次默认参数的调用。若传入了参数,则进行操作的时传入的参数,原默认参数变量值不会改变。

 

  • 可变参数

1、可变,指的是传入参数是不确定个数的,0个或任意个,并且传入的参数被自动封装为一个tuple,并传入函数内的变量,定义时参数前加*

2、对于list 或tuple数据,传入函数时,可以变量前加*

def calc(*numbers):
    sum1 = 0
    for n in numbers:  # 允许传入0个或任意个参数,*number被自动封装一个元组
        sum1 += n * n
    return sum1


nums = [1, 2, 3, 4, 5, 6, 7, 8]
print(calc(*nums))  # list or tuple前加一个*表示其中元素变成可变参数传进去

 

  • 关键字参数

1、 允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

2、传入参数为字典时,可以变量前面加**,此时函数中kw接受到一个该变量拷贝的字典

def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)、
person('Michael', 30)
person('Bob', 12, city='Beijing')
person('Jack', 14, gender='M', job='Engineer')
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 14, **extra) # **extra 表示把extra字典中的key-value用作关键字传入函数**kw,kw获得一个extra拷贝的字典

 

  • 命名关键字参数

当只想传入某几个关键字参数时,可以该参数对传入的参数进行限制

1、定义时采用 * 间隔的方式,命名关键字参数需要一个特殊分隔符**后面的参数被视为命名关键字参数

  当函数中有可变参数是,不需要分隔符*了,后面的参数默认是命名关键字参数

def person1(name, age, *, city, job):  # 表示只接受,关键字为city and job的参数
    print('name:', name, 'age:', age, 'city:', city, 'job:', job)
def person2(name, age, *args, city, job):
    print(name, age, args, city, job)

2、命名关键字参数必须传入参数名,不然会将传入的参数认为是*args。并且必须传入city和job值,不然也会报错

person1('Jack', 24, job='Engineer')
TypeError: person1() missing 1 required keyword-only argument: 'city'

3、当定义时,命名关键字参数有默认值时,则调用时可以缺省该变量

def person(name, age, *, city='Beijing', job):
    print(name, age, city, job)
person('Jack', 24, job='Engineer')

 

  • 参数组合

 1、参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数

def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
args = (1, 2, 3, 4)
kw = {'d': 99, 'x': '#'}
f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}


args = (1, 2, 3)
kw = {'d': 88, 'x': '#'}
f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}

2、对传入的*tuple 和 *kw 进行类似于“解包” 的操作,并依次将其中每一个元素,赋予位置参数、默认参数、可变参数、命名关键字参数、关键字参数

但此时命名关键字参数不能缺省,一定要在kw中以 dict 形式存在,不然会报错

f2(1, 2, d=99, ext=None)
args = (1, 2, 3)
kw = {'f': 88, 'x': '#'}
f2(*args, **kw)
TypeError: f2() missing 1 required keyword-only argument: 'd'

 

posted on 2024-11-02 23:44  Devprayer  阅读(22)  评论(0编辑  收藏  举报

导航