python装饰器+递归+冒泡排序
2024-08-20 16:46:54
冒泡排序
li = [33, 2, 10, 1,23,23523,5123,4123,1,2,0]
for k in range(1,len(li)):
for i in range(len(li) - k):#当这个for执行完时,最大值被放在了最后一个,所以下次判断时就可以不
if li[i] > li[i + 1]: #比较最后一个,所以在这里range的循环就应该少一次,所以k就加一,为了完成
temp = li[i] #所有的数的比较,所以再建立一个for循环,把k作为变量,循环的范围是1到len(li)
li[i] = li[i + 1]
li[i + 1] = temp print(li)
递归
斐波纳挈数列
def f4(a1,a2)
if a1>10000:
return
print(a1)
#a1 = 0,a2 = 1,a3 = 1
#a1 = 1,a2 = 1,a3 = 2
a3 = a1 + a2
f4(a2,a3) f4(0,1)
第十个斐波纳挈数
def f1(taller,a1,a2):
if taller == 10:
return a1
a3 = a1 + a2
r = f1(taller + 1,a2,a3)
return r feo = f1(1,0,1)
print(feo)
装饰器
def outer(func):
def inner():
print("hello")
print("hello")
print("hello")
r = func()
print("end")
print("end")
print("end")
return r
return inner #1、执行outer函数,并且将其下面的的函数名,当作参数
#2、将outer的返回值重新赋值给f1(f1 = outer的返回值)
#新f1函数 = inner 执行f1就相当于执行inner()
@outer
def f1():
print("F1") def f2():
print("F2") def f3():
print("F3") def f4():
print("F4") f1()
f2()
f3()
f4()
结果:
hello
hello
hello
F1
end
end
end
F2
F3
F4
如果有两个函数名一样的函数,在执行这个函数时,会执行下面那个函数,因为python解释器是从上往下
把代码(函数)放入内存的,所以,同样的函数名会指向最后一个函数。
装饰器的本质是将原函数封装到另一个函数里面,让装饰器里面的函数等于新函数(f1)
def outer(func):
def inner():
print("hello")
print("hello")
print("hello")
r = func()
print("end")
print("end")
print("end")
return r
return inner #首先,@outer的意思是让它下面的函数当作装饰器的参数,让装饰器函数的返回值等于f1,而装饰器的返回值为
#inner函数,所以执行f1()函数就是执行inner() 函数,再把inner的返回值赋给f1
#@outer相当于f1 = outer(f1) @outer
def f1():
print("F1") f1()
1、定义装饰器,函数
2、应用装饰器
只要函数应用装饰器,那么函数就被重新定义,重新定义为:装饰器的内层函数
带有参数的装饰器
def outer(func):
def inner(a1,a2):
print("hello")
print("hello")
print("hello")
r = func(a1,a2)
print("end")
print("end")
print("end")
return r
return inner @outer
def f1(a1,a2):
print(a1+a2)
接收任意参数的装饰器
def outer(func):
def inner(*a1,**a2):#这里的*a1可以接收多个参数
print("hello")
print("hello")
print("hello")
r = func(*a1,**a2)#这里的*a1,**a1可以接收多个参数,在执行函数是会自动把相应位置的参数传给他
print("end") #a1=>*a1=>*a1=>a1,a2=>*a1=>*a1=>a2,python有自带优化机制
print("end")
print("end")
return r
return inner @outer
def f0(a1):
print(a1) @outer
def f1(a1, a2):
print(a1 + a2) @outer
def f2(a1, a2, a3):
print(a1 + a2 + a3) @outer
def f3(a1, a2, a3, a4):
print(a1 + a2 + a3 + a4) @outer
def f4(a1, a2, a3, a4, a5):
print(a1 + a2 + a3 + a4 + a5) f0(1)
f1(1,2)
f2(1,2,3)
f3(1,2,3,4)
f4(1,2,3,4,5)
*a1接受参数放到元组里
**a2接收字典类参数放到字典里
一个函数添加多个装饰器
def outer(func):
def inner(*a1,**a2):
print("hello") #@outer相当于f1 = outer(f1)
r = func(*a1,**a2)
print("end")
return r
return inner def outer2(func):
def inner(*a1,**a2):
print("gg")
r = func(*a1,**a2)
return r
return inner @outer2 #在上面的装饰器先输出
@outer
def f1(a1, a2):
print(a1 + a2) f1(1,2)
#首先,把f1函数传到outer里面,outer里面的func代指f1函数,而f1函数就是outer函数的返回值,而outer函数的返回值为inner函数,所以执行f1函数,就是执行outer里的inner函数,而把@outer2放在@outer上面就是相当于给f1装饰的函数outer装饰一次,
outer2把outer函数当作func参数,而outer2的返回值为outer2的inner函数,当执行outer函数时,会执行outer2的inner函数,而inner函数中的func又执行了outer函数,而outer函数的返回值为outer函数的inner函数,在outer2里的inner函数里
执行func函数,就是执行了outer函数的返回值,就是执行了outer函数的inner函数,而outer函数里的inner函数有执行了f1函数,所以最后先输出最上面那个装饰器,然后是下面那个装饰器,这就是装饰器的原理
结果: gg
hello
3
end
最新文章
- Selenium-java-testng插件安装eclipse
- Swift的关键字
- C指针(一)
- SpringBoot读取配置文件
- RunLoop(官方文档翻译)
- java集合比较
- java中InvocationHandler 用于实现代理。
- 【python网络编程】使用rsa加密算法模块模拟登录新浪微博
- chrome浏览器不允许记忆登录账户的方法
- Thinkphp单字母快捷键
- php5.2 连接 SQL Server2008
- ";由于这台计算机没有远程桌面客户端访问许可证,远程会话被中断";的解决方案
- 【MySQL】frm文件解析
- iOS &; Mac 调试命令(VMMap&;Top)
- Lync 2010升级到Lync 2013POC计划-过程!
- phpstorm+wamp+xdebug配置php调试环境
- 设计模式 -->; (4)建造者模式
- kafka 客户端 consumer 配置参数
- centos系统java后台运行(xshll关掉不至于jar程序结束)
- Problem A: STL——灵活的线性表