目录
1、函数的创建和调用
2、函数的参数传递
3、函数的返回值
4、函数的参数定义
5、变量的作用域
6、递归函数
6.1 什么是递归函数
6.2 递归的组成部分
6.3 递归的调用过程
6.4 递归的优缺点
1、函数的创建和调用
(1) 函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数。
(2) 复用代码,隐藏实现细节,提高可维护性
(3) 提高可读性便于调试
- # 作 者:要努力,努力,再努力
- # 开发日期:2022/4/22 14:41
-
- def calc(a, b): # 形参
- c = a + b
- return c
-
-
- result = calc(10, 20) # 位置实参
- print(result)
-
-
- rec = calc(b=10, a=20) # 关键字实参
- print(rec)
2、函数的参数传递
如果是不可变对象,在函数体的修改不会影响实参的值
如果是可变对象,在函数体的的修改会影响到实参值的修改
- # 作 者:要努力,努力,再努力
- # 开发日期:2022/4/22 14:57
-
- def fun(arg1, arg2):
- print('arg1', arg1)
- print('arg2', arg2)
- arg1 = 100
- arg2.append(10)
- print('arg1', arg1)
- print('arg2', arg2)
-
-
- n1 = 11
- n2 = [22, 33, 44]
- print('n1', n1)
- print('n2', n2)
- fun(n1, n2)
- print('n1', n1)
- print('n2', n2)
3、函数的返回值
- # 作 者:要努力,努力,再努力
- # 开发日期:2022/4/22 15:07
-
- print(bool(0))
- print(bool(8))
-
-
- def fun(num):
- odd = [] # 存奇数
- even = [] # 存偶数
- for i in num:
- if i % 2:
- odd.append(i)
- else:
- even.append(i)
- return odd, even
-
-
- lst = [10, 29, 34, 44, 53, 55]
- print(fun(lst)) # 返回的是元组: 元素是列表
-
- '''
- (1) 函数可以没有返回值
- (2) 函数的返回值,如果是只有一个,返回原类型
- (3) 函数的返回值,如果是只有多个,返回元组
- '''
-
-
- def fun():
- print('hello')
-
- fun()
-
- def fun2():
- return 'hello'
-
- ref = fun2()
- print(ref)
-
-
- def fun3():
- return 'hello','world'
-
- print(fun3())
-
4、函数的参数定义
默认值参数
- # 作 者:要努力,努力,再努力
- # 开发日期:2022/4/22 15:23
-
- def fun(a, b=10): # b为默认值形参
- print(a, b)
-
-
- fun(100)
- fun(10, 20)
-
- print('hello', end='\t')
- print('world')
位置参数、关键字参数:
- # 作 者:要努力,努力,再努力
- # 开发日期:2022/4/22 15:27
-
- def fun(*arg): # 函数定义时,个数可变的位置参数,结果是元组
- print(arg)
- print(arg[0])
-
-
- fun(10)
- fun(10, 20)
- fun(10, 20, 30)
-
-
- def fun1(**args): # 函数定义时,个数可变关键字的参数,结果是字典
- print(args)
-
-
- fun1(a=10, b=20, c=40)
-
-
-
- # def fun2(*args,*a): # 报错。只能一个位置可变参数
-
- # def fun2(**args,**a): # 报错。只能一个关键字可变参数
-
- def fun2(*args,**arg2):
- pass
-
- # def fun2(**args,*arg2): # 报错。在一个函数的定义过程中,既有个数可变的关键字形参,也有个数可变的位置形参,要求,个数可变的位置形参,放在个数可变的关键字形参之前
- # pass
将元素转换为位置实参、关键字实参:
- # 作 者:要努力,努力,再努力
- # 开发日期:2022/4/22 16:30
- def fun(a, b, c):
- print('a=', a)
- print('b=', b)
- print('c=', c)
-
-
- fun(10, 20, 30) # 位置实参
- lst = [11, 22, 33] # 将列表中的每个元素都转化为位置实参
- fun(*lst)
-
- fun(a=10, b=20, c=30)
- dict = {'a': 100, 'b': 200, 'c': 300}
- fun(**dict) # 将字典中的每个元素都转化为关键字实参
-
-
在函数定义中,默认值参数、位置参数、关键字参数混合使用:
- # 作 者:要努力,努力,再努力
- # 开发日期:2022/4/22 16:44
- def fun(a, b, c, d):
- print('a=', a)
- print('b=', b)
- print('c=', c)
- print('d=', d)
-
-
- fun(10, 20, 30, 40)
- fun(a=10, b=20, c=30, d=40)
- fun(10, 20, c=30, d=40)
-
-
- def fun2(a, b, *, c, d): # * 之后的用关键字参数传递
- print('a=', a)
- print('b=', b)
- print('c=', c)
- print('d=', d)
-
-
- # fun2(10, 20, 30, 40) # TypeError: fun2() takes 2 positional arguments but 4 were given
- fun2(a=10, b=20, c=30, d=40)
- fun2(10, 20, c=30, d=40)
-
-
- def fun3(a, b, *, c, d, **args):
- pass
-
-
- def fun4(*args, **args2):
- pass
-
-
- def fun5(a, b=4, *args, **args2):
- pass
5、变量的作用域
(1) 局部变量:在程序中使用变量都定义在函数内部,作用范围:被局限于所在函数内。 [ 例如:形参就是局部变量。 ]
(2) 全局变量:定义在函数外而不属于任何函数的变量称为全局变量。
作用范围:对所有函数都起作用。生命周期:从开始定义到程序所在文件的结束。
注意:global 的使用
- # 作 者:要努力,努力,再努力
- # 开发日期:2022/4/22 16:59
-
- def fun(a, b):
- c = a + b # a,b,c都为局部变量
- print(c)
-
-
- name = '杨老师' # name为全局变量
- print(name)
-
- def fun2():
- print(name)
-
- fun2()
-
- def fun3():
- global age # global 在函数内部定义全局变量
- age = 20
- print(age)
-
- fun3()
- print(age)
-
6、递归函数
6.1 什么是递归函数
如果在一个函数的函数体内调用了该函数本身,这个函数就称为递归函数
6.2 递归的组成部分
递归调用与递归终止条件
6.3 递归的调用过程
每递归调用一次函数,都会在栈内存分配一个栈帧
每执行完一次函数,都会释放相应的空间
6.4 递归的优缺点
缺点:占用内存多,效率低下
优点:思路和代码简单
下面代码最好设置断点调试:
- # 作 者:要努力,努力,再努力
- # 开发日期:2022/4/22 17:11
- def fun(n):
- if n == 1:
- return 1
- else:
- res = n * fun(n - 1)
- return res
-
-
- print(fun(6))
实现菲波那切数列:
原理:第一项为1,第二项为1,从第三项开始为前两项之和。
- # 作 者:要努力,努力,再努力
- # 开发日期:2022/4/23 7:51
-
- def fun(n):
- if n == 3:
- return 1 + 1
- elif n == 2 or n == 1:
- return 1
- else:
- return fun(n - 1) + fun(n - 2)
-
-
- for i in range(1, 11, 1):
- num = fun(i)
- print(num, end='\t')
-
-