关于python中的参数 `args`, `**kwargs`


  • 位置参数 *args 与 关键字参数 **kwargs 可以增加灵活性
def foo(required, *args, **kwargs):
    print(required)
    if args:
        print(args)
    if kwargs:
        print(kwargs)

上面这个函数中 有required必须传入的参数, 还可以接收 多个位置参数关键字参数

其中 args因为 *前缀 的存在, 会把位置参数收集到一个tuple元組中 其中 kwargs因为 **前缀 的存在, 会把位置参数收集到一个dict字典中

当然 argskwargs可以为空


def foo(required, *args, **kwargs):
    print(required)
    if args:
        print(args)
    if kwargs:
        print(kwargs)


foo()
TypeError:
"foo() missing 1 required positional arg: 'required'"

foo('hello')
hello

foo('hello', 1, 2, 3)
hello
(1, 2, 3)


foo('hello', 1, 2, 3, key1='value', key2=999)
hello
(1, 2, 3)
{'key1': 'value', 'key2': 999}
  • 将接收的 位置参数关键字参数 传递给另一个函数

def bar(x, *args, **kw):
    pass


def foo(x, *args, **kwargs):
    kwargs['name'] = 'Alice'
    new_args = args + ('extra', )
    bar(x, *new_args, **kwargs)
    

class Car:
    def __init__(self, color, mileage):
        self.color = color
        self.mileage = mileage
        
class AlwaysBlueCar(Car):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.color = 'blue'
        
AlwaysBlueCar('green', 48392).color
'blue'

  • unpacking 使用 *, ** unpack 一個字典


def print_vector(x, y, z):
    print(x, y, z)
    print('<%s, %s, %s>' % (x, y, z))

dict_vec = {'y': 0, 'z': 1, 'x': 1}
print_vector(*dict_vec)
y z x
<y, z, x>

print_vector(**dict_vec)
1 0 1
<1, 0, 1>
  • 沒有返回值

def foo1(value):
    if value:
        return value
    else:
        return None
        
def foo2(value):
    """Bare return statement implies `return None`"""
    if value:
        return value
    else:
        return
        
def foo3(value):
    """Missing return statement implies `return None`"""
    if value:
        return value

# 在一個函數沒有返回值的时候,不使用return 语句 

Buy me a 肥仔水!