装饰器&递归
装饰器
1.开放封闭原则
在源码不改变的情况下,增加一些额外的功能
对扩展是开放的,对修改是封闭的
1.1 开放原则:增加额外新功能
1.2 封闭原则:不要改变源码
2 装饰器
满足开放封闭原则,在不改变原函数代码及调用方式的前提下,增加新功能
# 基本装饰器
def wrapper(func): # 1
def inner(*args): # 这里的* 是聚合 ## 5
ret = func(*args) # 这里的* 是打散 ## 6
return ret # 7
return inner
@wrapper # 2 func1 = wrapper(func1) 所以运行到这一步 wrapper函数执行
def func1(*args): # 3
... # 6
func1() # 4
语法糖的作用
# 标准版的装饰器
@a
def b():
pass
# 语法糖的那行 就等价于 b = a(b) 把那一行换成这一行 是一样的 所以这是执行操作,和下面调用没关系
## 带参数的装饰器
@c(1)
def b():
pass
## 这个有两行操作 a = c(1) b = a(b)
带参数装饰器
## 当装饰器装饰两个以上验证方式又不相同的函数时,就用到了带参数的装饰器
def outer(choose):
def wrapper(func):
def inner(*args,**kwargs):
if choose =='func1':
print ('func1的判断条件')
ret = func()
return ret
if choose=='func2':
print ('func2的判断条件')
ret = func()
return ret
return inner
return wrapper
@outer('func1') ## 这里的 outer('func1') 先执行 返回 wrapper 函数,所以就只比标准函数多一步操作
def func1():
print('我是被装饰的函数1')
@outer('func2')
def func2():
print ('我是被装饰的函数2')
## 当然这样写很蠢;如果有操作的话可以直接对choose这个变量操作,不需要判断,因为相应的choose是不一样的
两个装饰器装饰一个函数
def wrapper1(func):
print(0)
def inner1():
print(111)
func()
print(222)
return inner1
def wrapper2(func):
print(9)
def inner2():
print(333)
func()
print(444)
return inner2
@wrapper1
@wrapper2
def func0():
print('********')
## 结果
9
0
111
333
********
444
222
## 这个语法糖 等价于 func0 = wrapper1(wrapper2(func0))
递归
递归绝不是简单的自己调用自己,他是一种化繁为简的思想,请宏观的看问题,细节交给计算机
递归要满足两点要求
1 递归条件:可以通过不断调用自身,缩小待解决问题的范围
2 基线条件:出口,当不满足递归条件时
# 阶乘问题
def jc(n):
if n==1:
return 1
else:
return n*jc(n-1)
## 斐波那契数列 第n项的值
def fbnq(n):
if n==1:
return 1
if n<=0:
return 0
return fbnq(n-1)+fbnq(n-2)
装饰器&递归的更多相关文章
- Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- Python(迭代器 生成器 装饰器 递归 斐波那契数列)
1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...
- python基础(八)生成器,迭代器,装饰器,递归
生成器 在函数中使用yield关键字就会将一个普通的函数变成一个生成器(generator),普通的函数只能使用return来退出函数,而不执行return之后的代码.而生成器可以使用调用一个next ...
- python装饰器+递归+冒泡排序
冒泡排序 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) ...
- 【python基础】第19回 多层,有参装饰器 递归 二分法
本章内容概要 1. 多层装饰器 2. 有参装饰器 3. 递归函数 4. 算法(二分法) 本章内容详解 1. 多层装饰器 1.1 什么是多层装饰器 多层装饰器是从下往上依次执行,需要注意的是,被装饰的函 ...
- python-Day4-迭代器-yield异步处理--装饰器--斐波那契--递归--二分算法--二维数组旋转90度--正则表达式
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- python --> 递归 以及装饰器
一.递归知识 函数迭套执行,逐层执行之后,满足某个条件之后就会停止执行,将return值返回上层的函数,上层函数再逐层返回,最终返回给最初始函数. 递归在斐波那契数列的应用[斐波那契数列特点:前两个数 ...
- python学习笔记之装饰器、递归、算法(第四天)
参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...
- 学习PYTHON之路, DAY 5 - PYTHON 基础 5 (装饰器,字符格式化,递归,迭代器,生成器)
---恢复内容开始--- 一 装饰器 1 单层装饰器 def outer(func): def inner(): print('long') func() print('after') return ...
随机推荐
- CefSharp For WPF隐藏滚动条
效果:开始的时候会显示几秒,之后就不会再显示了 <!--浏览器--> <cefSharpWPF:ChromiumWebBrowser Name="webBrowser&qu ...
- 关于IOS7以及向下兼容音量控制问题
最近做个简单的播放界面,只是简单的设计到播放音频,ios系统自带播放有四个类可以播放音频 AVPlayer,AVAudioPlayer,MPMusicPlayerController,MPMovieP ...
- C/C++使用openssl进行摘要和加密解密(md5, sha256, des, rsa)
openssl里面有很多用于摘要哈希.加密解密的算法,方便集成于工程项目,被广泛应用于网络报文中的安全传输和认证.下面以md5,sha256,des,rsa几个典型的api简单使用作为例子. 算法介绍 ...
- 检查Android是否支持指纹识别以及是否已经录入指纹
原文:检查Android是否支持指纹识别以及是否已经录入指纹 Android M 开始,系统中加入了指纹相关功能. 主要用到的类为:FingerprintManager 只提供三个方法: 返回值 方法 ...
- 读取spring工程中resource的文件
Resource resource = new ClassPathResource("data.json"); // 读文件到字符串 String fileContent = Fi ...
- CSS visibility 属性 使元素占位,但不可见
CSS visibility 属性 使元素占位,但不可见 h2 { visibility:hidden; } 浏览器支持 所有主流浏览器都支持 visibility 属性. 注释:任何的版本的 Int ...
- Markdown 入门
一. Markdown语法的简要规则 标题 标题是非常重要的一个标记,一段文字标记为标题,只需要在文字前加 #.具体可以支持到1到6个# 1 2 3 4 # 一级标题 ## 二级标题 ### 三级标题 ...
- Android零基础入门第26节:layout_gravity和gravity大不同
原文:Android零基础入门第26节:layout_gravity和gravity大不同 上一期我们一起学习了LinearLayout线性布局的方向.填充模型和权重,本期来一起学习LinearLay ...
- PowerDesigner 在通过jdbc连接数据库时 Could not Initialize JavaVM!
最近用到PowerDesigner的逆向工程,从数据库中逆向生成模型,本想使用odbc连接的,但是需要安装驱动,mysql的还好弄,oracle对我来讲实在是有些麻烦,看到能用jdbc连接,就想试试, ...
- Capsule Network
Capsule Network最大的特色在于vector in vector out & 动态路由算法. vector in vector out 所谓vector in vector out ...