大纲 1.定义 2.使用函数的优势 3.return返回值详解 4.参数表详解 5.局部变量和全局变量 6.递归 7.高阶函数 一.函数的基本语法和特性 1.定义一个函数三要素 1)使用关键字def 2)参数表 3)返回值return python中参数表和返回值不是必须要写的,是一个可选项 以下就是一个函数的简单模型:
def test(num): print("test") return 02.使用函数有哪些好处? 1)提高代码的可复用性 2)提高代码的可扩展性 3)可以根据自己的需求进行自定义函数,使代码模块化 3.return返回值详解: 1)不写return,默认隐式返回值是None 2)返回一个参数,比如return 0 返回值是0 3)返回参数个数大于1,返回的就是一个tuple,比如 return 1,“hello”,[1,2],返回值是(1,“hello”,[1,2]) 为什么函数需要有返回值呢?为了返回函数的执行结果,方便后面程序的调用哦 return返回值的作用:(1)结束函数(2)返回某个对象 4.参数表详解: 1)关键参数和位置参数
def test(x,y): print(x) print(y) test(1,2) #传入的实际参数和形参一一对应--位置参数 test(y=1,x=2) #这种就是关键参数 test(y=1,2) #SyntaxError: non-keyword arg after keyword arg这种写法就是错误的,y已经有了位置参数2了,所以就不可以在赋值关键参数y=1 # 总结关键参数不可以写在位置参数的前面 test(1,2,3)#TypeError: test() takes exactly 2 positional arguments (3 given) test(1)#TypeError: test() takes exactly 2 positional arguments (1 given) #总结:传入的实参个数要和形参个数一致 def test(x,y=1):#这里关键参数也不可以写在位置参数前面 print(x) print(y) test(1) #默认参数,调用的时候默认参数不是必须传递2)当实际参数的个数我们并不确定时,那么我们怎么去定义它的形参呢? 这里我们就要用到参数组的概念了,一次可以传入多个参数
def test(*args): print(args) test(1,2,3,4) #(1, 2, 3, 4) test(*[1,2,3,4])#(1, 2, 3, 4) def test(x,*args): print(x) #1 print(args)#(2, 3, 4) test(1,2,3,4) #得到的结果都是元祖形式3)怎样传入字典呢?
def test(**kwargs): print(kwargs) print(kwargs["name"]) #coco test(name="coco",age=8)#{'age': 8, 'name': 'coco'} a=test(**{"name":"coco","age":8})#{'age': 8, 'name': 'coco'}5.局部变量和全局变量,作用域问题 字符串,元祖是不可以修改的,列表,字段集合均可修改
#实例一 age=[12,25,36,44]#全局变量 def change_age(): age[0]=11#修改全局变量 print(age)#[11, 25, 36, 44] change_age() print(age)#[11, 25, 36, 44] #实例二 name="coco" def change_name(): name="niko" print(name,"is 12 years old")#niko is 12 years old change_name() print(name,"is 12 years old")#coco is 12 years old #实例三 x=6#全局变量 def f(): print(x) x=5 #x=5是局部变量 f() #UnboundLocalError: local variable 'x' referenced before assignment #首先在局部寻找x,未声明就使用报错,改为 x=6#全局变量 def f(): global x print(x) x=5 #x=5是局部变量 f()#结果 6 #实例四 def outer(): count=10#不是全局变量 def inner(): count=20 print(count)#20 inner() print(count)#10 outer() def outer(): count=10#不是全局变量,嵌套 def inner(): nonlocal count count=20 print(count)#20 inner() print(count)#20 #global必须在全局作用域,不可以用在嵌套作用域,当嵌套作用域的值要修改必须加上nonlocal outer() #实例五 age=0#全局变量 def change_age(): #局部不声明也不修改可以正常使用 print(age) change_age()#0 #实例六 age=0#全局变量 def change_age(): #***局部对全局变量要修改,必须声明global*** global age age+=1 print(age) change_age()#16.递归 递归的概念:在一个函数的内部可以调用这个函数本身就是递归。 递归的缺点:效率不高,调用越多,容易栈溢出 那么递归的产生需要什么条件呢? 1)必须有明确的结束条件 2)每次进入更深一层,问题的规模要比上次的减少 递归函数实例1—阶乘
#方法一 def foo(n): ret=1 for i in range(1,n+1): ret=ret*i return ret print(foo(5)) #方法二 def foo1(n): if n==1: return 1 else: return n*foo1(n-1) print(foo1(5))递归函数实例2—斐波那契
#方法一: def fibo(n): before = 0 after = 1 for i in range(1,n-1): ret=before+after before=after after=ret return ret print(fibo(5)) #方法二: def fibo(n): if n==1: return 0 elif n==2: return 1 elif n==3: return 1 else: return fibo(n-1)+fibo(n-2) print(fibo(6))7.高阶函数 概念:变量可以指向函数,函数本身也可以赋值给变量,那么一个函数可以接受另一个函数作为参数 也就是说(把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式) 举例:
def add(x, y, f): return f(x) + f(y) print(add(5,-7,abs))#abs是取绝对值的意思,结果为12 #详解:x=5,y=-7,f=abs现在把x和y的值传给abs #等价于abs(5)+abs(-7)