1.有名函数
断点

打断点
启动断点 鼠标右键
ctrl +F5 重启程序
ctrl +F2 停止
F9绿色 的三角形是调到下一个断点
F8 蓝色朝下的箭头是单步走
Alt + shift +F7蓝色朝右下角的箭头是进入函数自己定义的函数。
F7蓝色朝右下角的箭头是进入函数
shift+F8 跳出函数
Alt+F9 跳到光标
Alt+F10 光标将定位到当前 正在调试的位置。
Alt + F8 搜索数据
2.匿名函数


也就是没有名字的函数 ,除了没有名字外,其他因素都有,
常用于临时使用一次的场景,没有重复使用的需求。
由 lambda 函数引导,一行代码图省事。
语法: lambda +参数+冒号+函数 体代码(表达式或者函数 )
print((lambda x,y:x+y))#表达式:print((lambda x,y:x+y)(2.3,5))# 函数:(lambda x,y:print(x+y))(1,2)结果:<function <lambda> at 0x01C456B8>7.33
调用内存地址加括号(它虽然没有名字),但加括号可以调用。
匿名函数的精髓就是省略了名字,简化过程,为其绑定名字没有任何意义
匿名函数与内置函数 结合使用
max,min,sorted
查字典时,默认返回的值是key值,比较的也是key值。
所以,需要获取字典的value值进行比较,再返回key值。
salaries={'xiaoluo':35025,"xishi":4566,"dafu":5600,'fan':3688,"dahai":30000}def fun(n):return salaries[n]print(max(salaries,key=fun))print(max(salaries,key=lambda name:salaries[name]))结果:xiaoluoxiaoluo
sorted
排序,
nums=[1,15,0,22,546]res=sorted(nums)re=sorted(nums,reverse=True)print(res)print(re)结果:[0, 1, 15, 22, 546][546, 22, 15, 1, 0]
循环遍历薪资


salaries={'xiaoluo':35025,"xishi":4566,"dafu":5600,'fan':3688,"dahai":30000}for v in salaries.values():print(v)print(sorted(salaries.values(),reverse=True))print(sorted(salaries,key=lambda name:salaries[name],reverse=True))结果:3502545665600368830000[35025, 30000, 5600, 4566, 3688]['xiaoluo', 'dahai', 'dafu', 'xishi', 'fan']
3.递归函数

函数的递归调用是函数嵌套调用的一种特殊形式,在调用一个函数的过程中又直接或者间接地调用该函数本身,称之为函数 的递归调用
递归循环是没有意义的。

递归调用必须有两个明确的阶段:
- 回溯:一次次的递归调用下去,这是一个重复的过程,但每一次调用后,重复的规模应当减少,直到逼近一个最终 的结果 。即回溯阶段一定要有一个明确的结束条件。
- 递推:往回一层一层地推算出结果。

3.递归与循环的区别,循环每一次都要判断,需要考虑多少次
而递归只需要确定结束条件就行,按照规律进行重复调用,不需要考虑次数。
递归是函数的定义里面嵌套函数的调用

4.闭包函数
闭指的是该函数 是一内部函数
包指的是:该内部的函数名在外部被 引用
def outer(): #没有调用outer(),但是创造了outer这个函数# 1.只检测函数体的语法,不执行函数体的代码。print("外部的函数被调用")def inner ():print("内部的函数被调用")#3.返回inner函数的内存地址return inner# 执行了outer这个函数体代码,inner定义了in1=outer() #得到了里面的inner钥匙,取名字inner,也可以是任意名in1()
为函数传值的方式:参数

每次都传入同样的参数时,为函数体传值的方式二:闭包

def outer(x,y):def func():print(x+y)return funcfunc1=outer(3,2)func1()func1()结果 :55
5.装饰器
1.定义
装饰器是一个特殊的闭包函数,只不过这个函数 不是给自己使用的,而是给其他函数添加功能的
器指的是工具,而程序中的函数就具备某一功能的工具
装饰指的是为被装饰的对象添加额外功能。
2 使用装饰器的目的:
软件的维护应该遵循开放封闭原则
开放封闭原则指的是:
软件一旦上线运行后对修改源代码是封闭的,对扩展功能是开放的,
这时就用到了装饰器
装饰器的实现必须遵循两大原则 :
1、不修改被装饰对象的源代码
2、不修改被装饰对象的调用方式
name='大海'
def run(name):
print("=========")
print("我是%s"%name)
print("=========")
#定义decorate,检测decorate语法,
def decorate(func): #func将要传入的值是run
def new_func(name): #也是run(name)中的name
print("我是装饰函数前面的代码")
func(name) #run(name)
print("我是装饰函数后面的代码")
return new_func
# 定义了new_func(name)函数,
# 返回了new_func的内存地址 ,
# 传入了一个run函数作为名称
run=decorate(run)
run(name)
结果:
我是装饰函数前面的代码
=========
我是大海
=========
我是装饰函数后面的代码
def for1(n):
b = 0
for i in range(n+1):
b=b+i
print(b)
from datetime import datetime
def run_time(func):
def new(n):
start_time=datetime.now()
print("开始时间%s"%start_time)
func(n)
end_time=datetime.now()
print("结束时间%s"%end_time)
time=end_time-start_time
print("花费时间%s"%time)
return new
for1=run_time(for1)
for1(100000)
结果:
开始时间2022-03-28 22:21:51.944271
5000050000
结束时间2022-03-28 22:21:51.949258
花费时间0:00:00.004987
装饰器的调用:
被装饰的函数放在装饰器后边,前边@装饰器名称即可使用
from datetime import datetime
def run_time(func):
def new(n):
start_time=datetime.now()
print("开始时间%s"%start_time)
func(n)
end_time=datetime.now()
print("结束时间%s"%end_time)
time=end_time-start_time
print("花费时间%s"%time)
return new
@run_time
def for1(n):
b = 0
for i in range(n+1):
b=b+i
print(b)
for1(100000)
结果:
开始时间2022-03-28 22:36:09.874281
5000050000
结束时间2022-03-28 22:36:09.879267
花费时间0:00:00.004986


">

