十二、 函数和函数的参数

一 函数的本质

函数相当于一个工具,具备某一个功能,在使用时直接拿来使用即可。

二 函数的语法

def my_func():
    """

    :return:
    """
    print('my_func')
    return

def:定义函数的关键字。
my_func:函数名,和变量名的命名一样。
():函数名后面必须跟括号,括号里的参数可有可无。
冒号:括号后面跟冒号
“”“”“”:文档描述,函数功能,函数参数和返回值的一些描述信息。
函数体代码:功能代码。
return:函数返回值,可有可无。

三 函数的定义和调用

1.函数必须先定义在调用,定义函数的代码必须在调用函数的代码之前运行起来。
2.定义函数使用定义函数语法。
3.函数名就是将函数体代码的内存地址赋值之间的绑定关系。
4.函数在定义阶段只检查语法 不执行函数体代码
5.函数名加括号就可以调用。

my_func1()  # 报错 name 'my_func' is not defined


def my_func1():
    print('my func')


def my_func2():
    print('my func')


print(my_func2)  # <function my_func at 0x0000027B2554C670>
# 函数名就是函数体代码的内存地址


def my_func3():
    adsdsad
    asdasdasds
    print('my func')


print(my_func3)  # 不会报错
print(my_func3())  # 报错 name 'adsdsad' is not defined
# 函数在定义阶段不执行函数体代码 只检查语法 调用阶段才会执行函数体代码

四 函数的返回值

函数的返回值就是函数运行结束后产生的结果,获取函数返回值的方法就是用变量名接受。

def return_value():
    return  # 默认返回None


res = return_value()
print(res)  # None


def return_value1():
    return -1  # 后面跟什么就返回什么


res1 = return_value1()
print(res1)  # -1


def return_value2():
    name = 'jasper'
    return -1, name  # 返回一个元组


res2 = return_value2()
print(res2)  # (-1, 'jasper')


def return_value3():
    return [1, 2, 'jasper'] # 单个数据是什么类型就返回什么类型


res3 = return_value3()
print(res3, type(res3))  # [1, 2, 'jasper'] <class 'list'>


def return_value4():
    return [1, 2, 'jasper'], {'age': 18}  # 多个数据还是返回元组


res4 = return_value4()
print(res4, type(res4))  # ([1, 2, 'jasper'], {'age': 18}) <class 'tuple'>
print(res4[1], type(res4[1]))  # {'age': 18} <class 'dict'>

五 函数的分类

5.1 内置函数

python解释器在程序启动时就定义好的函数,可以直接加括号调用。

# 内置函数
len()
print()
exit()


# 可以直接加参数直接调用

5.2 自定义函数

自定义函数分为三种,分别是空函数,无参函数和有参函数。

# 自定义函数
# 1 空函数
def none_func():
    """
    无函数体代码 没有任何功能 用于前期项目搭建
    :return:
    """
    pass


none_func()


# 2 无参函数
def no_argument_func():
    """
    函数调用时不需要参数就可以执行该功能
    :return:
    """
    print('no_argument_func')


none_func()  # no_argument_func


# 3 有参函数
def argument_func(x):
    """
    函数调用时需要传入参数x
    :param x:
    :return:
    """
    print('argument_func is x')


argument_func(1)  # argument_func is x

六 函数的参数

学习函数参数之前我们要知道两个概念,什么是形式参数(简称形参)和什么是实际参数(简称实参)。
形参:函数定义阶段函数名后括号里的参数
实参:函数调用时括号里的参数
形参相当于变量名,实参相当于变量名对应的数据值,在函数调用阶段时,会临时进行绑定,函数执行结束就结束绑定关系,是一个动态绑定。

6.1 位置参数

6.1.1 位置形参

在函数定义阶段从左至右填写的变量名就是位置形参

6.1.2 位置实参

在函数调用阶段从左至右填写的数据值就是位置实参

# 位置形参
def form_argument(x, y):  # 位置形参
    z = x + y
    print(z)


form_argument(1, 2)  # 3 位置实参 在传值时从左至右依次赋值
form_argument()  # 报错 form_argument() missing 2 required positional arguments: 'x' and 'y'
form_argument(2)  # 报错 form_argument() missing 1 required positional argument: 'y'
form_argument(1, 2, 3)  # 报错 form_argument() takes 2 positional arguments but 3 were given
# 位置实参在传参数时,必须和位置形参个数一一对应,不能少也不能多

6.2 关键字参数

关键字实参:在调用阶段以变量名等于数据值的形式传入参数称之为关键字实参

# 关键字实参
def key_argument(x, y):
    z = x * y
    print(z)


key_argument(x=4, y=6)  # 24
key_argument(x=6, y=4)  # 24 都是关键字实参与位置没有关系

key_argument(y=6, 1)  # 报错 positional argument follows keyword argument
# 位置实参不能跟在关键字实参后边

key_argument(1, y=6)  # 6 可以位置实参在前 关键字实参在后

key_argument(1, x=2)  # 报错 key_argument() got multiple values for argument 'x'
# 形参x获得了多个值

key_argument(y=6, 4)  # 报错 positional argument follows keyword argument
# 位置参数跟在了关键字参数后边

6.3 默认值参数

在函数定义参数阶段,以变量名等于数据值的形式写入的就是默认值参数。

# 默认值参数
# 打印员工信息功能
def staff_info(name, age, gender):
    print(f"""
    **********info**********
    name:{name}
    age:{age}
    gender:{gender}
    ************************
    """)


staff_info('Jasper', 18, 'male')
staff_info('Tom', 28, 'male')
staff_info('Jack', 19, 'male')


def staff_info(name, age, gender='male'):
    print(f"""
    **********info**********
    name:{name}
    age:{age}
    gender:{gender}
    ************************
    """)


staff_info('Jasper', 18, 'male')
staff_info('Tom', 28, 'male')
staff_info('Jack', 19, 'male')  # 加上默认形参以后 可以不写 打印结果一致
staff_info('lili', 18, gender='female')  # 可以修改默认值形参 

6.4 可变长参数

打破实参与形参之间一一对应的关系 随意的传值

6.4.1 *args

接受多余的位置实参放在*后的变量名args中,以元组的形式存储多余的位置实参

6.4.2 **kwargs

接受多余的关键字实参放在**后的变量名kwargs中,以字典的形式存放多余的关键字实参

# 可变长参数
def variable_len_argument(*args, **kwargs):
    print(args, kwargs)


variable_len_argument()  # () {}
variable_len_argument(1, 2, 3)  # (1,2,3) {}
variable_len_argument(name='jasper', age=18)  # () {'name': 'jasper', 'age': 18}
variable_len_argument(1, name='jasper')  # (1,) {'name': 'jasper'}

总结:定义函数阶段,不同参数之间的混合使用,位置参数不能在默认值后边,简单的在前复杂的在后。

七 参数补充

7.1 * 和 ** 在实参中的作用

# 假如有一个列表 需要把列表里的所有元素当作参数传入 应该怎么做
my_list = [1, 2, 3, 4, 5]


def func(*args, **kwargs):
    print(args)
    print(kwargs)


# 方式一
func(my_list[0], my_list[1], my_list[2], my_list[3], my_list[4])
# (1, 2, 3, 4, 5)
# {}
# 索引取值可以解决此需求 但是写死了 如果列表数据修改则函数参数也许修改

# 方式二
func(*my_list)
# (1, 2, 3, 4, 5)
# {}
# 结果是一样的 但是列表数据修改不会影响实参的变化


# 定义一个字典
my_dict = {
    'name': 'jasper',
    'age': 18
}
func(**my_dict)
# ()
# {'name': 'jasper', 'age': 18}
# **的作用是将字典的k,v键值对以变量名等于数据值的形式当作实参传入

总结:*相当于将字符串、列表、元组、集合for循环的每个值一次性放到实参中,**就是把字典中的k,v键值对以变量名等于数据值的形式放到实参中。

7.2 命名关键字参数

def func(a, b, c):
    print(a, b, c)


# 如果要让c必须使用关键字实参的形式传入
def func1(a, b, *args, c):
    print(a, b, args, c)


# func1(1, 2, 3)  # 报错 func1() missing 1 required keyword-only argument: 'c'

func1(1, 2, 3, 4, c=666)  # 1 2 (3, 4) 666


# 完整版本
def func3(a, b, *args, c, d, **kwargs):
    print(a, b, args, c, d, kwargs)

在定义函数阶段,写在*后面的参数必须以关键字实参的形式传入,而且这个参数必须在**前面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值