文章目录
前言
hello,大家好。这一章分享函数。主要讲解的内容是函数的参数。
一、函数的定义
1、简介
函数是可重复使用的,用来实现单一功能的代码段。
函数是为了解决代码重复性的问题,就像循环一样。不过函数是灵活地实现某一个功能。
我们可以把函数想象成一个盒子,这个盒子可以实现各种各样的功能。只有使用的时候,盒子的功能才会生效。
2、函数的格式
def test(): # def 是定义函数的关键字,test()是函数名
print('hello world') # 此处是函数的代码块
test()
# 输出结果如下
hello world
这里有以下几个需要注的问题
1.使用def关键字定义函数
2.def 与函数名之间有空格
3.函数名后要有括号,括号内可以传入参数,也可以不传入参数。传入的参数叫 形参
4.函数定义完之后要有一对 冒号 :
5.代码块一定要缩进
6.函数调用时才会实现函数的功能,函数调用不需要缩进
7.形参是用来接收实参的(这样可以使函数更灵活)
函数调用:函数名 ( )
二、函数的类型
函数整体可以分为自定义函数和内置函数
三、函数的参数
1.可变类型参数与不可变类型参数
类型在函数体内是否可变
不可变类型:
def test(a):
print('a赋值前:{}'.format(a))
a = 20
print('a赋值后:{}'.format(a))
a = 10 # 传入的参数为不可变类型
test(a)
print('函数体外的a:{}'.format(a))
# 输出结果如下:
a赋值前:10
a赋值后:20
函数体外的a:10 # 函数体外的值未修改
可变类型:
def test(a):
print('a添加前:{}'.format(a))
a.append(4)
print('a添加后:{}'.format(a))
a = [1, 2, 3] # 传入的参数为可变类型
test(a)
print('函数体外的a:{}'.format(a))
# 输出结果如下:
a添加前:[1, 2, 3]
a添加后:[1, 2, 3, 4]
函数体外的a:[1, 2, 3, 4] # 函数体外的值已修改
总结:
1.可变类型传入的参数是可变的,不可变类型传入的参数是不可变的(像整型,元组)
2.可变类型参数在函数体内可以被修改,不可变类型参数在函数体内不可以被修改
3.两个参数内存地址的区别
2.位置参数
实参与形参的个数一致,传入的实参与形参位置一一对应
def test(a, b): # a 和 b是接收的形参
print('a:{}'.format(a))
print('b:{}'.format(b))
test(1, 2) # 在此处 1 和 2为实参
# 输出结果如下:
a:1
b:2
在此处,位置参数是通过默认的方式,将实参一一传入形参中。通过位置一一对应传入参数
3.关键字参数
传入实参时,指定形参
def test(a, b):
print('a:{}'.format(a))
print('b:{}'.format(b))
test(a=2, b=1) # 指定形参,无视位置顺序
# 输出结果如下:
a:2
b:1
通过与上面的位置参数对比,我们不难发现:
关键字参数是在实参处,通过指定形参,无视位置、无视顺序将参数传入
4.默认值参数
定义函数时,在形参处赋值
如果实参处也赋值,会不会有冲突呢?
实参未赋值:
def test(a=20):
print('a:{}'.format(a))
test()
# 输出结果:
a:20
实参处赋值:
def test(a=20):
print('a:{}'.format(a))
test(30)
# 输出结果:
a:30
通过两次对比我们可以总结:
- 使用默认值参数时,默认值参数的位置可以不用传入实参
- 如果默认值参数传入实参,则传入的参数会覆盖默认值
5.可变类型参数
*args:传入实参,返回元组
**kwargs:传入实参,返回字典。实参以键值对传入
5.1 当作为形参时
打包过程
*args:
将实参打包成元组,直接传入实参
def test(*args): # 可以是*a, *b...(*args只是比较规范)
print(args)
test(1, 2, 3, 4) # 传入参数
# 输出结果如下:
(1, 2, 3, 4) # 返回元组
**kwargs:
将实参打包成字典,实参以键值对传入
def test(**kwargs):
print(kwargs)
test(a=1, b=2, c=3, d=4) # 参数以键值对形式传入
# 输出结果如下:
{'a': 1, 'b': 2, 'c': 3, 'd': 4} # 返回一个字典
5.2 当作为实参时
拆包过程
*args:
将实参(实参是序列格式)解包,并一个个传入
def test(a, b, c):
print(a, b, c)
test(*(1, 2, 3)) # 将()内的值一一拆开,并传入形参
# 输出结果如下:
1 2 3
**kwargs:
将实参(实参是字典格式)解包,并以关键字传入
def test(a, b, c):
print(a, b, c)
test(**{'a': 5, 'b': 2, 'c': 3}) # 实参以字典形式传入,在实参处,形参需要引号括起来
# 输出结果如下:
5 2 3
总结
今天主要讲解了函数的各种参数,我们应该分清楚形参与实参的区别。欢迎各位大佬评论交流。如有错误的地方,还希望批评指正。