装饰器&递归
装饰器
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 ...
随机推荐
- SharePoint创建内容类型
SharePoint创建内容类型 内容类型的用途是多种多样的.创建内容类型也非常简单. 1. 点击网站操作--网站设置. 2. 点击网站内容类型,点击创建. 3. 命名Beginning_ShareP ...
- dedecms织梦出现“Upload filetype not allow”原因和解决方案
资源:武汉科技有限公司倍频猫 我最近升级DEDE5.6出现此问题后.和解决的方法. 假设有同学是按某些朋友用删除代码的方法解决这个问题的话,建议你修正此做法,毕竟这是有非常大安全风险的.而DEDE本身 ...
- abp项目 从sql server迁移至mysql
官方资料:https://aspnetboilerplate.com/Pages/Documents/EF-MySql-Integration 实验发现,还差了两步 整理一下,步骤如下: 1.引用My ...
- WPF 4 DataGrid 控件(进阶篇二)
原文:WPF 4 DataGrid 控件(进阶篇二) 上一篇<WPF 4 DataGrid 控件(进阶篇一)>中我们通过DataGridTemplateColumn 类自定义编辑 ...
- C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享
原文:C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享 1 : C# Assembly.GetEntryAssembly().GetName().Version. ...
- 如何获取app配置文件内容
App.config: <appSettings> <add key="FCPConnection" value="Data Source=192.16 ...
- ef 查询总结
1.Linq 查询两张表:a表和b表,要得到的数据是a表数据b表没有 例如:a表有5条数据1,2,3,4,5:b表有2条数据1,3:那么就用dataGridView1输出2,4,5:link语句要怎么 ...
- delphi中最小化其他程序及所有程序最小化(使用 shell.minimizeAll 和自己寻找窗口这两种办法)
1.所有程序最小化 uses ComObj; var shell : OleVariant; begin shell := CreateOleObject('Shell.Appli ...
- Qt 下快速读写Excel指南(尘中远)
Qt Windows 下快速读写Excel指南 很多人搜如何读写excel都会看到用QAxObject来进行操作,很多人试了之后都会发现一个问题,就是慢,非常缓慢!因此很多人得出结论是QAxObjec ...
- 微服务之Service Fabric 系列 (一):概览、环境安装
参考 微软官方文档 service fabric 百家号 大话微服务架构之微服务框架微软ServiceFabric正式开源 一.概述 1.概念 Azure Service Fabric 是一款分 ...