有名函数
多次使用,会重复调用
def run(x,y):
print(x,y)
return x,y
run(1,2)
匿名函数
1 匿名函数:就是没有名字的函数
2 为何要用:
用于仅仅临时使用一次的场景,没有重复使用的需求
匿名函数的定义
print(lambda x, y: x + y)
表达式
(lambda x, y: print(x + y))(1, 2)
匿名函数一般和max,min,sorted连用
salaries= {
'xialuo':3000000,
'xishi':30000,
'dahai':3000
}
def func(name):
return(salaries[name]
#比较value值
#求最大值
print(max(salaries,key=lambda name:salaries[name]))
#求最小值
print(min(salaries,key=lambda name:salaries[name]))
#反序
print(sorted(salaies,key=lambda name:salaries[name],reverse=True))
#正序
print(sorted(salaies,key=lambda name:salaries[name],reverse=False))
递归函数
1.什么是递归函数
函数的递归调用是函数嵌套调用的一种特殊形式,在调用一个函数的过程中又直接或者间接地调用该函数本身,称之为函数的递归调用
递归死循环是没有意义的
递归调用必须有两个明确的阶段:
1. 回溯: 一次次递归调用下去,说白了就一个重复的过程,
但需要注意的是每一次重复问题的规模都应该有所减少,
直到逼近一个最终的结果,即回溯阶段一定要有一个明确的结束条件
2. 递推: 往回一层一层推算出结果
递归是函数的定义里面嵌套函数的调用
*****递归与循环的区别,循环每一次都要判断,需要考虑多少次
而递归只需要确定结束条件就行,按照规律进行重复调用,不需要考虑次数
第五个人年龄为第4个人加2岁
def age(n):
if n ==1:
return 18
if n>1:
return age(n-1)+2
print(age(5))
循环取值
L = [1,[2,[3,[4,[5,[6,[7,[8,[9,]]]]]]]]]
def search(L):
for n in L:
# print(n)
if type(n) is not list:
print('我是数字%s'%n)
else:
search(n)
search(L)
闭包函数
闭包
闭指的是:该函数是一个内部函数
包指的是:指的是该内部的函数名字在外部被引用
def outer(x,y):
def func():
print(x+y)
return func
#每次都是传入同样的参数
func1=outer(3,2)
func1()
func1()
func1()
装饰器
装饰器就是一个特殊的闭包函数
1、什么是装饰器(就是一个函数,只不过这个函数不是给自己使用的,是给其他函数添加功能的)
器指的是工具,而程序中的函数就具备某一功能的工具
装饰指的是为被装饰器对象添加额外功能
2、为什么要用装饰器
软件的维护应该遵循开放封闭原则
开放封闭原则指的是:
软件一旦上线运行后对修改源代码是封闭的,对扩展功能的是开放的
这就用到了装饰器
装饰器的实现必须遵循两大原则:
1、不修改被装饰对象的源代码(人的原来的性格,生活方式)
2、不修改被装饰对象的调用方式(人的原来的外貌,名字)
实例
name='大海'
#装饰器
def decorate(func): #func等下传入run
def new_func(name):#run(name) 的 name
print("装饰前面的代码")
func(name)
print("装饰后面的代码")
return new_func
#被装饰函数
@decorate
def run(name):
print('=================')
print('我是%s' %name)
#运行装饰器
@decorate等价于run = decorate(run)
run = decorate(run)
run(name)