0
点赞
收藏
分享

微信扫一扫

[Python基础]Python中的参数

49路末班车 2022-03-21 阅读 101
python

[Python基础]Python中的参数

在调用函数时,通常会传递参数,函数内部的代码保持不变,针对不同的参数处理不同的数据

一、形参与实参

介绍

  • 形参:定义函数时的参数变量
  • 实参:调用函数时的参数变量

即:参数传递的过程,就是 把实参的引用 传递给 形参 ,使用实参的值来执行函数体的过程。

示例

def sum(num1, num2):  # num1和num2就是形式参数,即形参
    print(num1 + num2)


sum(1, 2)  # 1和2就是实际参数,即实参

二、关键字参数

介绍

​ 在定义好一个函数后,如果不想按照定义的形参顺序进行传递实参,或者说函数定义的形参太多,再进行顺序传递时容易搞乱顺序时,可以采用关键字传参

示例

def sum(num1, num2):
    print(num1)  # 1
    print(num2)  # 2


sum(num2=2, num1=1)

需要注意的是,如果使用了关键字参数,那么位置参数必须在关键字参数前面,否则就会报错,如:

def sum(num1, num2):
    print(num1)
    print(num2)


sum(num2=2, 1)
"""
    sum(num2=2, 1)
                 ^
SyntaxError: positional argument follows keyword argument
"""

三、缺省参数(默认参数)

介绍

​ 在定义一个函数时,可以给这个函数的形参一个默认值,那么这个参数就是缺省参数,也叫默认参数

  • 调用函数时,如果给缺省参数传值,那么缺省参数将使用传递的值,如果没有给缺省参数传值,那么缺省参数会使用默认值

示例

def sum(num1, num2=5):
    print(num1)  # 1
    print(num2)  # 2


sum(1, 2)
def sum(num1, num2=5):
    print(num1)  # 1
    print(num2)  # 5


sum(1)

需要注意的是,和关键字参数一样,如果使用了缺省参数,那么位置参数必须在缺省参数前面,否则就会报错,如:

def sum(num1, num2=5):
    print(num1)
    print(num2)


sum(num2=1, 1)
"""
    sum(num2=1, 1)
                 ^
SyntaxError: positional argument follows keyword argument
"""

四、收集参数(可变参数)

介绍

Python中接收可变参数有两种形式:

  • 接收元组:形参前定义加一个*
  • 接收字典:形参前定义加两个*

一般在给多值参数命名时,习惯使用以下两个名字

  • *args:存放元组参数
  • **kwargs:存放字典参数(kw即keyword,kwargs即键值对参数)

示例

首先是直接在调用函数时直接在实参位置传递多个参数,此时:

  • 如果函数定义的形参前有一个*,即是接收多个参数为元组
  • 如果函数定义的形参前右两个*,即是接收多个键值对参数为字典
def test1(*args):
    print("有%d个参数" % len(args))
    print(args, type(args))


def test2(**kwargs):
    print("有%d个参数" % len(kwargs))
    print(kwargs, type(kwargs))


test1(1, 2, 3, 4, 5, 6)
"""
有6个参数
(1, 2, 3, 4, 5, 6) <class 'tuple'>
"""
test2(key1=1, key2=2, key3=3, key4=4, key5=5, key6=6)

"""
有6个参数
{'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5, 'key6': 6} <class 'dict'>
"""

一般不建议使用这种直接将参数一个个当做实参传递的方式,而是定义好实参参数后再传递,如:

def test1(*args):
    print("有%d个参数" % len(args))
    print(args, type(args))


def test2(**kwargs):
    print("有%d个参数" % len(kwargs))
    print(kwargs, type(kwargs))


args = 1, 2, 3, 4, 5
test1(*args)
"""
有5个参数
(1, 2, 3, 4, 5) <class 'tuple'>
"""

kwargs = {
    'key1': 1,
    'key2': 2,
    'key3': 3,
    'key4': 4,
    'key5': 5
}
test2(**kwargs)
"""
有5个参数
{'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5} <class 'dict'>
"""

通过这种方式先定义好参数后再通过实参的方式进行传递时,需要注意:

  • 如果传递的不是键值对类型,即传递的是元组类型,需要在传递实参时在前面加一个*,如上述例子中test1(*args)的*args
  • 如果传递的是键值对类型,即传递的是字典类型,需要在传递实参时在前面加两个**,如上述例子中的test2(**kwargs)的**kwargs

五、打包与解包

介绍

上述可变参数中出现的*的含义就是打包或者解包的含义:

  • *出现在形参中,即是打包的含义,就是将传递过来的参数打包成一个可变参数
  • *出现在实参中,即是解包的含义,就是将封装好的参数解包成一个个单个参数

实例

args = 1, 2, 3, 4, 5

print(args)  # (1, 2, 3, 4, 5)
print(*args)  # 1 2 3 4 5
举报

相关推荐

0 条评论