一、函数的创建和调用
函数就是执行特定任务以完成特定功能的一段代码
函数可以提高代码复用率,隐藏实现细节,提高可维护性,提高可读性以便于调试
1. 函数的创建格式
2. 定义一个不带参函数并调用
3. 定义一个带参函数并调用
二、函数的参数传递
函数的参数传递分为 位置实参传递和关键字实参传递
关键字实参:是根据形参的名称进行实参传递
位置实参:是根据形参的名称进行实参传递
函数主体
关键字实参
位置实参
还有另一种传递参数的分类方式,那就是按照传递的参数是可变还是不可变来分类
不可变对象:在函数体的修改不会影响实参的值
可变对象:在函数体的修改会影响实参的值
其中n1是不可变对象,n2是可变对象,将n1,n2传入函数中,函数调用后第一次的输出结果为n1,n2的值,第二次输出的结果为arg1,arg2的值 ,其中n1的值不会发生改变,但是n2的值会发生改变与arg2相等。
结果
三、函数的返回值
函数返回多个值的时候,返回的是元组
函数只有一个返回值时,返回的是原类型
函数不需要返回值时可以不写return语句
运行结果
四、函数的参数定义
1. 函数定义默认值参数
函数定义时,给形参设置默认值,只有与默认值不符的时候需要传递实参
例如:
其中给形参b赋了值,当调用函数只传入一个实参时,就会默认形参b = 10
但是如果传入两个参数时,就会输出实际传入的参数值
2. 定义个数可变的参数
个数可变的位置参数
定义函数时,可能无法事先确定传递的位置实参的个数,就可以使用可变位置参数
使用*定义个数可变的位置形参
位置形参的结果是一个元组
个数可变的关键字参数
定义函数时,可能无法事先确定传递的关键字实参的个数,就可以使用可变关键字参数
使用**定义个数可变的关键字形参
结果为一个字典
例如:
函数fun()中定义的就是个数可变的位置参数,可以看到调用函数后输出的参数值的类型为元组型
函数fun1()中定义的是个数可变的关键字参数,调用函数后输出的参数值类型为字典型
tips:可变的位置参数/关键字参数只能有一个,可以同时有一个关键字参数和一个位置参数,但是必须位置参数在前面,关键字参数在后面。
3. 总结
函数调用时传入的是位置实参/关键字实参
函数定义时传入的是位置形参/关键字形参,可变的位置形参/关键字形参
tips:如果想要将元组或者列表利用位置传参传入有多个形参的函数中,可以在变量名前加上*
如果想要将字典利用关键字传参传入有多个形参的函数中,可以在变量名前加上**
如果在形参加上*,那么后面的形参只能利用关键字传参,不能利用位置传参
五、变量的作用域
程序代码能够使用的区域,分为局部变量和全局变量
局部变量:只在函数内部有效
全局变量:可作用于函数内外
如果想将函数内部调用的变量变成全局变量,需要在变量名前面加上一个global关键字
六、递归函数
如果在函数体内部调用这个函数,那么这个函数就叫做递归函数
递归函数是由递归调用和递归终止条件组成的
递归的调用过程:每次递归调用一次函数,就会在栈内分配一个栈帧,每执行完一次函数就会释放相应的空间
递归的优点:思路和代码简单 缺点:占用内存多,效率低下