Python—函数

宋正兵 on 2022-07-06

函数的定义

函数将一段实现功能的完整代码,用函数名进行封装,通过函数名对函数进行调用,达到一次编写,多次调用的目的。可以实现代码的重用性。

Python中用def关键字定义函数:

1
2
3
def 函数名称(参数列表):
函数体
[return 返回值列表]

函数的参数

  • 形式参数:函数定义处的参数
  • 实际参数:函数调用处的参数
1
2
3
4
def func(num): #num是形参
pass
number = 10
func(number) #number是实参

参数的传递有三种方式,分别是位置参数、关键字参数和默认值参数

  • 位置参数:调用时,参数的个数和顺序必须与定义的参数个数和顺序相同

    1
    2
    3
    4
    def func(name, age):
    print('name:{0}, age:{1}'.format(name, age))

    func('Tom', 22)
  • 关键字参数:调用时,用“形参名称=值”的方式进行传参,传递顺序可以与定义时参数的顺序不同

    1
    2
    func(name='Tom', age=22)
    func(name='Tom', 22) #位置参数在关键字参数之后会报错
  • 默认值参数:在函数定义的时候,直接对形参进行赋值,若调用时该参数不传值,将使用默认值

    1
    2
    3
    4
    5
    6
    7
    def func(name='Tom', age=22):
    print('name:{0}, age:{1}'.format(name, age))

    func() #name、age都使用默认值
    func('Daming') #age使用默认值
    func('Daming', 23) #使用位置传参
    func(age=23) #使用关键字传参

    函数定义时,同时存在位置参数和默认值参数时,默认值参数放后

有一类参数是可变参数:

  • 个数可变的位置参数:函数调用时可接受任意个数的实际参数,并放到一个元组中。

    如果调用时,实参为列表,在实参前加一个*,会将列表进行解包,如例子3所示。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    def func(*para):
    print(type(para))
    for item in para:
    print(item)

    func(1, 2, 3)
    '''
    <class 'tuple'>
    1
    2
    3
    '''
    func([1, 2, 3])
    '''
    <class 'tuple'>
    [1, 2, 3]
    '''
    #调用时参数前加一个*,会将列表进行解包
    func(*[1, 2, 3])
    '''
    <class 'tuple'>
    1
    2
    3
    '''
  • 个数可变的关键字参数:函数调用时可接受任意个数“参数=值”形式的参数,并放到一个字典中。

    如果想要直接传入一个字典,需要在字典类型的实参前加**,如例子3所示。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    def func(**para):
    print(type(para))
    for key, value in para.items():
    print(key, '--->', value)

    func(name='Tom', age=22, score=99)
    '''
    <class 'dict'>
    name ---> Tom
    age ---> 22
    score ---> 99
    '''

    d = {'name': 'Tom', 'age': 22, 'score': 99}
    # func(d) # TypeError: func() takes 0 positional arguments but 1 was given
    func(**d)
    '''
    <class 'dict'>
    name ---> Tom
    age ---> 22
    score ---> 99
    '''