一、函数的创建与调用
1、 概念
执行特定任务和完成特定功能的一段代码。
2、 作用
- 复用代码;
- 隐藏实现功能;
- 提高可维护性;
- 提高可读性,便于调试。
3、 创建
函数结构:
def 函数名(形式参数\形参名): 函数体 return XXX
举个例子:
def clac(a, b): c = a+b return c
下图画出了上面例子当中名为 clac
的函数的工作原理:
二、函数的参数与传递
1、 位置传参
根据形参对应 位置 进行实参传递。
2、 关键字传参
根据形参 名称 进行实参传递。
3、 参数传递内存分析
在函数的调用中,进行参数传递:
(1)如果是 不可变 对象,在函数体中的修改 不会影响 实参的值;
(2)如果是 可变 对象,在函数体中的修改 会影响 实参的值。
举个例子:
def fun(arg1, arg2): print('arg1', arg2) print('arg2', arg1) arg1 = 100 arg2.apped(101) print('arg1', arg1) print('arg2', arg2) return print(arg1, arg2) n1 = 12 n2 = [10, 20, 30, 40] print('n1', n1) print('n2', n2) fun(n1, n2) print(n1) print(n2)
上例中实参n1就不会因为函数体内调用而发生值的改变。
三、函数返回值
1、 若无需返回值(即执行完成后,无需给调用处提供数据),可省略;
2、 若返回值只有1个,直接返回 原值(类型不发生改变);
3、 若返回值有多个,返回结果为 元组 。
注意:
- 函数是否需要返回值应当 视情况而定;
return
语句是把执行结果返回调用的地方,并返回程序的控制权;- 程序遇到的第一个
return
即退出def
块,不会再运行第二个return
。
四、函数的参数定义
(一)函数的默认值参数
1、 函数定义时,给形参设置默认值;
2、 只有与默认值不符合时才会传递,若不指定就按照默认只运行。
举个例子:
def print(self, *args, sep = '', end = '\n', file = None): # print()默认参数回车
(二)个数可变形参
注意:
- 同一函数中,个数可变的位置形参、个数可变的关键字形参只能分别定义一个,否则会报错;
- 既然有个数可变的位置形参,也有个数可变的关键字形参,则按照
(*arg1, **arg2)
输入。
五、函数变量的作用域
1、 概念
程序代码能够访问该变量的区域。
2、 分类
(1)局部变量
在函数定义并使用该变量时,之在函数内部有效。
注意:
- 在函数使用 global 声明时,调用后,会成为全局变量。
(2)全局变量
函数内外都有效。
六、递归函数
1、 概念
在一个函数的函数体内调用了该函数本身。
2、 组成部分
(1)递归调用;
(2)递归终止条件。
3、 递归调用过程
(1)每递推一次函数,都会在栈内分配一个栈帧;
(2)每回归一次函数,都会释放相应空间。
4、 优缺点
(1) 优点
思路、代码简单。
(2) 缺点
占用内存多,效率低。
5、 示例
(1) 计算阶乘
计算阶乘代码
print("------计算阶乘------") def fac(n): if n == 1: return n else: res = n*fac(n-1) return res print(fac(6))
计算阶乘运行结果
(2) 求斐波那契数列的值
求斐波那契数列代码
print("------求斐波那契数列------") def fib(n): if n == 1: return 1 elif n == 2: return 1 else: res = fib(n-1)+fib(n-2) return res print(fib(2))
求斐波那契数列运行结果
七、python 中 lambda 的用法
1、 介绍
lambda 表达式其实是 python 中的一类特殊的定义函数的形式,使用它可以定义一个 匿名函数。
即当你需要一个函数,但又不想费神去命名一个函数,这时候,就可以使用 lambda 了。
2、 语法
lambda [arg1 [,arg, ...... argn]]:expression
注意:
- 在代码
f = lambda a, b, c: a+ b+ c
中,lambda表示匿名函数; - 冒号之前的
a, b, c
表示它们是这个函数的参数。
3、 用法
(1)将函数赋值给一个变量,然后再像一般函数调用;
(2)直接在 lambda 表达式后面传递实参;
(3)将 lambda 嵌套到普通函数中,lambda 函数本身作为 return 的值;
(4)将 lambda 函数作为参数传递给其他函数