#定义一个函数,求任意数的和defs(*a):#定义一个变量保存结果
r=0#遍历元组,将元组当中的数相加for n in a:
r = r + n
print(r)
参数的解包
deffn(a,b,c):...
t =(4,5,6)
fn(*t)
函数的返回值
返回值就是返回函数执行的结果
通过return来指定函数的返回值
返回值可直接使用,通过一个变量来接收函数的返回值
return后面可以跟任意的对象,甚至可以是一个函数(不加括号)
fn是函数对象,fn()是调用函数
打印fn(),实际上就是在打印fn()的返回值
deffn():deffn2():print('hello')return fn2
r = fn()
r()#hello
deffn2():return
r = fn2()print(r)#None#在函数中,return后的代码都不会执行,return一旦执行函数自动结束deffn3():print('abc')returnprint('hahah')
r = fn3()print(r)#abc,Nonedeffn4():for i inrange(5):if i==3:break#return #函数结束 0,1,2#continue #用来跳过当次循环0,1,2,4,函数执行完毕print(i)print('循环执行完毕')
fn4()#0,1,2,循环执行完毕
lst =[1,2,3,4,5,6,7,8,9,10]deffn4(i):if i %3==0:returnTruereturnFalseprint(list(filter(fn4,lst)))#[3,6,9]
匿名函数 lambda函数表达式
lambda函数表达式就是专门用来创建一些简单的函数
语法:lambda 参数列表 : 返回值
deffn5(a,b):return a + b
print(fn5(1,2))#(lambda a,b : a+b)(50,60)
fn6 =lambda a,b : a+b
print((lambda a,b : a+b)(50,60))print(fn6(50,60))
lst =[1,2,3,4,5,6,7,8,9,10]
r =filter(lambda i : i %3==0, lst)print(list(r))
闭包
通过闭包可以创建一些只有当前函数能够访问的变量,将一些私有数据藏到闭包中
形成闭包的条件
1.函数嵌套
2.将内部函数作为返回值返回
3.内部函数必须使用到外部函数的变量
#特点二 将函数作为返回值也是高阶函数deffn():#再函数内部定义一个函数deffn2():print('我是fn2')#将内部函数fn2作为返回值返回return fn2
print(fn())#结果为fn2
r = fn()
r()#我是fn2#求平均数defmake_fn():
nums2 =[]deffn1(n):
nums2.append(n)returnsum(nums2)/len(nums2)return fn1
m = make_fn()print(m(10))
装饰器
我们可以通过修改函数中的代码来完成需求,但是会产生一些问题
问题1: 如果要修改的函数过多,修改起来比较麻烦
问题2: 不方便后期的维护
问题3: 违反开闭原则(ocp)程序的设计思想,要求开发对程序的扩展,要关闭对程序的修改
#求任意两个数的和defadd(a,b):return a+b
#求任意两个数的积defmul(a,b):return a * b
#希望在不修改原函数的前提下,来对函数扩展功能deffn():print('我是fn函数')deffn2():print('函数开始执行')
fn()print('函数执行结束')defnew_add(a,b):print('开始执行')
r = add(a,b)print('函数执行结束')return r
r = new_add(a,b)print(r)
#定义一个函数来对其他的函数进行扩展,使其他的函数可以在执行前打印开始,执行后打印结束deffn():print('我是fn函数')defstart_end(old):#参数old 要扩展的函数对象#创建一个新的函数defnew_function(*args,**kwargs):print('函数开始执行')
r = old(*args,**kwargs)print('函数执行结束')return r
#返回函数return new_function
f = start_end(add)
r = f()print(r)