Python08
Python08函数什么是函数函数的创建和调用函数调用的参数传递函数参数传递的内存分析函数的返回值函数参数定义--默认值参数函数参数定义变量的作用域递归函数
函数
什么是函数
-
函数就是执行特定任务和已完成特定功能的一段代码
-
为什么需要函数
-
复用代码
-
隐藏实现细节
-
提高可维护性
-
提高可读性便于调试
-
函数的创建和调用
def calc(a, b): c = a + b return c result = calc(10, 20) print(result)
函数调用的参数传递
-
位置实参:根据形参对应的位置进行实参传递
-
关键字实参:根据形参名称进行参数传递
def calc(a, b): # a,b称为形式参数,简称形参,形参的位置是在函数的定义处 c = a + b return c result = calc(10, 20) # 10,20作为实际参数的值,简称实参,实参的位置是在函数的调用处 print(result) sum = calc(b=10,a=20) # =左侧的变量名称称为关键字参数 print(sum)
函数参数传递的内存分析
def fun(arg1, arg2): print('arg1:', arg1) print('arg2:', arg2) arg1 = 100 arg2.append(10) print('arg1:', arg1) print('arg2:', arg2) return n1 = 11 n2 = [22, 33, 44] print('n1:', n1) print('n2:', n2) fun(n1, n2) # 位置传参, arg1,arg2是函数定义处的形参,n1,n2是函数调用处的实参 # 实参名称与形参名称可以不一致 print('n1:', n1) print('n2:', n2) '''在函数的调用过程,进行参数的传递 如果是不可变对象,在函数体的修改不会影响实参的值 如果是可变对象,在函数体的修改会影响实参的值'''
函数的返回值
print(bool(0)) # False print(bool(1)) # True 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, 23, 44, 53, 55] print(fun(lst)) '''函数的返回值 1,如果函数没有返回值【函数执行完成之后,不需要给调用处提供数据】 return可以省略不写 2.函数的返回值,如果是一个,直接返回原类型 3.函数的返回值,如果是多个,返回的结果为元组''' def fun1(): print('hello') fun1() def fun2(): return 'hello' res = fun2() print(res) def fun3(): return 'hello', 'world' print(fun3()) '''函数在定义是,是否需要返回值,视情况而定'''
函数参数定义--默认值参数
-
函数定义时,给形参设置默认值,只有与默认值不符的时候才需传递实参
def fun(a, b = 10): # b 为默认值参数 print(a, b) #函数的调用 fun(100) fun(10,20)
函数参数定义
-
个数可变的位置参数
-
定义函数时,可能无法事先先确定传递的位置实参的个数时,使用可变的位置参数
-
使用*定义个数可变的位置形参
-
结果为一个元组
-
-
个数可变的关键字形参
-
定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参
-
使用**定义个数可变的关键字形参
-
结果为一个字典
-
def fun(*args): # 函数定义时的可变的位置参数 print(args) fun(10) fun(10, 30) fun(10, 23, 34) def fun1(**args): print(args) fun1(a = 10) fun1(a = 10,b = 20) '''def fun2(*args, *a): pass 以上代码会报错,个数可变的位置参数,只能是一个''' '''def fun2(**args, **args): pass 以上代码,程序会报错,个数可变的关键字参数,只能有一个''' def fun3(*args1, **args2): pass '''def fun4(**args1, *args2): pass 在一个函数的定义过程中,既有个数可变的关键字形参,也有可变的位置形参 要求,个数可变的位置形参,放在个数可变的关键字形参之前'''
变量的作用域
-
**程序代码能访问该变量的区域
-
根据变量的有效范围可分为
-
局部变量
-
在函数内定义并使用的变量,只在函数内部有效,局部变量使用global声明,这个变量就会成为全局变量
-
-
全局变量
-
函数体外定义的变量,可作用于函数体外
-
-
def fun(a, b): c = a + b # c,就称为局部变量,因为c是在函数体内进行的变量,a,b为函数的形参,作用范围也是函数内部,相当于局部变量 print(c) # print(c) # print(a) 代码曝错,因为a,c超出了作用的范围 name = 'xy' # name 作用范围为函数内部和外部都可以使用--》称为全局变量 print(name) def fun2(): print(name) # 调用函数 fun2() def fun3(): global age # 函数内部定义的变量,局部变量,局部变量用global声明,就变成了全局函数 age = 20 print(age) fun3() print(age)
递归函数
-
什么是递归函数
-
如果在一个函数的函数体内调用了该函数的本身,这个函数就称为递归函数
-
-
递归的组成部分
-
递归调用与递归终止条件
-
-
递归的调用过程
-
每递归调用一次函数,都会在栈内存分配一个栈帧
-
每执行玩一次函数,都会释放相应的空间
-
-
递归的优缺点
-
缺点:占用内存多,效率低下
-
优点:思路和代码简单
-
def fun(n): if n == 1: return 1 else: n = n *fun(n - 1) return n print(fun(6))
-
斐波那契数列
def fib(n): if n == 1: return 1 elif n == 2: return 1 else: return fib(n-1)+fib(n-2) print(fib(6)) # 斐波那契数列第六位上的数字 # 输出这个数列前六位上的数字 print('------------------------') for i in range(1,7): print(fib(i))