Python之函数-可变形参

Python之函数-可变形参

可变参数

  • 可变位置参数
    • 在形参前使用 * 表示该形参是可变位置参数,可以接受多个实参 它将收集来的实参组织到一个tuple中
  • 可变关键字参数
    • 在形参前使用 ** 表示该形参是可变关键字参数,可以接受多个关键字参数
    • 它将收集来的实参的名称和值,组织到一个dict中

总结:

  • 有可变位置参数和可变关键字参数
  • 可变位置参数在形参前使用一个星号*
  • 可变关键字参数在形参前使用两个星号**
  • 可变位置参数和可变关键字参数都可以收集若干个实参,可变位置参数收集形成一个tuple,可变 关键字参数收集形成一个dict
  • 混合使用参数的时候,普通参数需要放到参数列表前面,可变参数要放到参数列表的后面,可变位 置参数需要在可变关键字参数之前

形参

  • 可以有缺省值,定义时,如果没有提供该参数,动用缺省值. 缺省值的定义往后放
  • 5种
      1. 普通形参:可以有缺省值,2种传实参方式都可以用
      1. *args 可变仅位置形参,只能接收按照位置传入的实参,可以接收0个或任意个,没有缺省值
      1. **kwargs 可变仅关键字形参,只能接收关键字传入的实参,可以接收0个或任意个. 形参的最后一个, 没有缺省值
  1. 普通形参
def add(x, y=5):
    print(x, y)
    return x + y
add(1), add(7, y=5), add(x=9), add(x=4, y=0), add(y=8, x=9)

# 返回结果:1 5
# 返回结果:7 5
# 返回结果:9 5
# 返回结果:4 0
# 返回结果:9 8
# 返回结果:(6, 12, 14, 4, 17)
add(), add(y=7), add(y=6, 7)

# x位置参数必须传参
# 报错内容:SyntaxError: positional argument follows keyword argument
def add(x=4, y):
    print(x, y)
    
# 缺省值的定义往后放,否则就会报错
# 报错内容:SyntaxError: non-default argument follows default argument
  1. *args 可变仅位置形参
def add(*nums):
    print(type(nums),nums)

# 定义函数add,形参是*nums,type查看类型
add, add(1), add(1, 2), add(1, 2, [1])

# add查看函数签名,add()中写入形参返回类型是元组
# 返回结果: (1,)
# 返回结果: (1, 2)
# 返回结果: (1, 2, [1])
# 返回结果:(, None, None, None)
def add(*nums):
    print(type(nums), nums)
    s = 0
    for i in nums:
        s += i
    return s

# 求和运算
add(1, 3, 5)

# 执行函数add传入形参1, 3, 5
# 返回结果: (1, 3, 5)
# 返回结果:9
add(range(5))

# nums (range(0, 5)) range对象是惰性的没有调用的时候只是一个展现形式
# 报错内容:TypeError: unsupported operand type(s) for +=: 'int' and 'range'
add(nums=[1, 3, 5])

# 不认关键字传参,只认位置传参
# 报错内容:TypeError: unsupported operand type(s) for +=: 'int' and 'range'
  1. **kwargs 可变仅关键字形参
def add(**kwargs):
    print(type(kwargs), kwargs)

# 可变仅关键字形参的函数
add(x=1, y=4)

# 只能传递关键字参数,返回类型是dict字典
# 返回结果: {'x': 1, 'y': 4}
add(1)

# 翻译:你给了1个位置参数,我不接受位置参数
# 报错内容:TypeError: add() takes 0 positional arguments but 1 was given
def add(**kwargs):
    print(type(kwargs), kwargs)
    for k,v in kwargs.items():
        print(k, v)

# 定义add函数,形参是**kwargs 可变仅关键字形参,先打印类型和kwargs的内容,循环取k,v的值在进行打印
add(x=1, y=4)

# 返回结果: {'x': 1, 'y': 4}
# 返回结果:x 1
# 返回结果:y 4

混合使用

def config(host, port, **kwargs):
    print(host)
    print(port)
    print(kwargs)

# 定义一个config函数
config('localhost', '3306')

# 调用config函数,指定形参按位置传参,**kwargs没有传入参数所以返回空字典。
# 返回结果:localhost
# 返回结果:3306
# 返回结果:{}
config('localhost', '3306', username='Runaway')

# **kwargs传入参数username='Runaway'字典形式返回,这么做为了指定用户名
# 返回结果:localhost
# 返回结果:3306
# 返回结果:{'username': 'Runaway'}
config('localhost', '3306', db='cmdb')

# **kwargs传入参数db='cmdb'字典形式返回,这么做为了指定需要连接的数据库
# 返回结果:localhost
# 返回结果:3306
# 返回结果:{'db': 'cmdb'}
def config(host, port, *args, **kwargs):
    print(host, port, args, kwargs)

# 重新定义config函数
config(1, 2, 3, 4, 5)

# 调用函数config
# 为什么字典是空的,因为1,2按位置给了host和port,3,4,5都被*args收入元组了
# 返回结果:1 2 (3, 4, 5) {}
config(1, 2, x=1, y=2)

# 调用函数config
# 为什么元组是空的,因为1,2按位置给了host和port,x和y匹配不上关键字所以被**kwargs收入字典了
# 返回结果:1 2 () {'x': 1, 'y': 2}

你可能感兴趣的:(Python,python)