day13 多个装饰器叠加 生成式
1.装饰器剩余
from functions import wraps
@wrap(func) 会把func内的自带方法赋给wrapper,这样wrapper装饰函数就和原函数一模一样
多个装饰器叠加
def outter1(func):
def wrapper1(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper1
def outter2(func):
def wrapper2(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper2
def outter3(func):
def wrapper3(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper3
@outer1
@outer2
@outer3
def f1(name):
print('welcome home %s' % name)
f1('egon')
加载顺序
自下而上,因为装饰器的语法糖,相当于f1 = outer1(outer2(outer3(f1)))
检测语法后,先加载outer3,此时的原函数f1的内存地址还没有变包在闭包函数wrapper3中传给outer2,outer2将打包的闭包函数wrapper2地址传给outer1,outer1将打包的闭包函数打包给f1
outer1(outer2(outer3(f1))) 从右往左一步一步闭包并且加载函数
执行顺序 从上往下,因为用到的闭包函数都被包给了outer1中,先去outer1中开始运行,运行到其中要运行wrapper2的地方了,这时wrapper1还没运行完,就跳到wrapper2中去执行,wrapper2还没执行完,遇到wrapper3了,就跳到wrapper3中运行,运行完已经是最内层了,开始把wrapper3的返回值返回值给wrapper2,wrapper2运行完返回值返回给wrapper1,wrapper1运行完之后,返回值返回给最初始的函数,继续运行全局代码,整个装饰器函数的调用结束。
2.有参装饰器
以上装饰器模版如下
from functools import wraps
def outter(func):
@wraps(func)
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
这样会遇到一个问题,这个函数确实可以完全模仿了旧函数的同时加了新功能,但是如果假如想给内部闭包函数传进其他参数方便使用,在当前模版上就没法做到
outter(func)的参数必须是原函数,不能增加,也不能减少,否则使用语法糖@outter func=outter(func)会报错
另外,wrapper(*args,**kwargs)内传的参数也不能改变,这是为了把原函数的参数原封不动还给原函数去调用
这个时候,就可以再多包一层函数,在最外层函数传参数,而且参数可以任意指定,把最外层函数名返回,这样包含着最外层名称空间的闭包函数就赋给了原函数
既包含旧功能,又添加了新功能,还传了新参数,可供程序扩展使用
根据传进的文件类型不同,在内部增加判断选择写入文件的方式
3.三元表达式
三元表达式用来在保证代码可读性的前提下,精简一些语句的写法
如下需要函数判断两个数的大小语句
def max(x,y)
if x>y:
return x
else:
return y
可以用如下表达式代替
x=10
y=20
res = x if x >y else y #b表达式1 if条件表达式 else 表达式2,当if判断返回True时,返回结果表达式1,否则返回结果表达式2
print(res)
res = ’ok‘ if False else 'No'
print(res)
4.生成式:用来生成数据的表达式
先来生成一个列表
l = []
for i in range(10):
if i >4:
l.append(i**2)
列表生成式
l = [i**2 for i in range(10) if i >4] 不能加else,因为不知道是加给for的还是if的
print(l)
name = ['egon','alex_sb','kevin_sb','hxx_sb','cxx_sb'] 匹配找出结尾是sb的元素
sbs=[]
for name in names:
if name.endswith('sb')
sbs.append(name)
用生成式代替
sbs = [name for name in names if name.endswith('sb')]
print([name.upper() for name in names])
字典生成式
res = {i:i**2 for i in range(10) if i > 3}
print(res)
print({i for i in 'hello'}) 生成集合,去重
5.匿名函数
先看有名函数
def func():
print(‘from func’)
func()
func()
func()
有名称的函数定义后,可以在之后多次以名字调用
匿名函数就是只定义一个函数的内存地址,主要用于临时使用一次的场景
func = lambda x,y:(return)x+y 匿名函数自动返回值,不用添加return
print(func)
print(func(1,2))
res = (lambda x,y:x+y)(1,2) 匿名函数后面加扣号调用,并传参数
print(max([10,11,-3,23]))
salaries = {
'egon':3000
'alex':100000000
'wupeiqi':10000
'yuanhao':2000
}
def func(k):
return salaries[k]
print(max(salaries,key = lambda k:salaries[k]))
day13 多个装饰器叠加 生成式的更多相关文章
- s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法
python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf ...
- Day13有参装饰器,三元表达式,匿名函数
多个装饰器: 加载顺序:由下而上 执行顺序:由上而下 有参装饰器: 闭包,给函数传参的一种方法 当装饰器内需要参数时,可以采用闭包形式给其传参,第三层函数接收完参数时,就变为无参装饰器 三元表达式: ...
- day13 闭包及装饰器
""" 今日内容: 1.函数的嵌套定义及必包 2.global 与 nonlocal 关键字 3.开放封闭原则及装饰器 """ " ...
- python基础知识13---函数对象、函数嵌套、名称空间与作用域、装饰器
阅读目录 一 函数对象 二 函数嵌套 三 名称空间与作用域 四 闭包函数 五 装饰器 六 练习题 一 函数对象 1 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 ...
- Python函数——装饰器
前言 给下面的函数加上运行时间 def fib(n): a, b = 0, 1 for i in range(n): print(b) a, b = b, a+b return b a = fib(5 ...
- 面向切面编程AOP,一些通用装饰器
1.一些装饰器,可以减少重复编写.比较常用的. 用的时候函数上面加上装饰器就可以.这是一些装饰器,加在函数或者方法上,减少了很多重复代码. 除此之外工作中也用一些mixin类大幅减少代码. impor ...
- Python 装饰器入门(下)
继续上次的进度:https://www.cnblogs.com/flashBoxer/p/9847521.html 正文: 装饰类 在类中有两种不通的方式使用装饰器,第一个和我们之前做过的函数非常相似 ...
- python之旅:函数对象、函数嵌套、名称空间与作用域、装饰器
一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...
- Python 闭包、迭代器、生成器、装饰器
Python 闭包.迭代器.生成器.装饰器 一.闭包 闭包:闭包就是内层函数对外层函数局部变量的引用. def func(): a = "哈哈" def func2(): prin ...
随机推荐
- 常见天气api
1. 心知天气API1.1 免费版:400次/小时,也就是9600次/天.国内城市数据,天气实况,3天预报,6项生活指数.这个API的免费版已经提供了很多年了,应该算最长寿稳定的那批API了……1.2 ...
- 432 4.3.2 STOREDRV.Deliver; recipient thread limit exceeded
最近几天Hub-Mailbox服务器时不时就CPU超过90%.在任务管理器里面看到edgetransport占用大量CPU.进入EMC的队列查看器,看到邮箱数据库堵塞,队列上万. 堵塞的邮件大多是收件 ...
- 关于 Container ,Injection
1.容器的历史 容器概念始于 1979 年提出的 UNIX chroot,它是一个 UNIX 操作系统的系统调用,将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到这个新的 ...
- kubernets之endpoints
注:本文整理自网络 endpoint endpoint是k8s集群中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址.service配置selector,endp ...
- Vue.js——60分钟组件快速入门(下篇)
转自:https://www.cnblogs.com/keepfool/p/5637834.html 概述 上一篇我们重点介绍了组件的创建.注册和使用,熟练这几个步骤将有助于深入组件的开发.另外,在子 ...
- 对象 Object
在js 中创建最简单的对象,然后给它添加属性或者方法 示例如下: var obj = new Object(); //或者 var obj = {}; obj.name = '张三'; obj.fun ...
- ABAP-权限查询-用户信息系统
事务代码:SUIM
- (已解决)java.lang.NoSuchMethodException: com.kevenwu.pojo.User.<init>()
搭建ssm框架时报了如下错误,原因是: mybatis在初始化bean的时候需要无参构造器, 如果写了有参构造器,将会把无参构造器覆盖掉,加上一个无参构造器就可以了
- mobile-net v2 学习记录。我是菜鸡!
声明:只是自己写博客总结下,不保证正确性,我的理解很可能是错的.. 首先,mobile net V1的主要特点是: 1.深度可分离卷积.用depth-wise convolution来分层过滤特征,再 ...
- UE 不生成.bak文件
.bak文件是UE处理文件时自动备份的文件,可以取消备份这样就不会生成.bak文件了 菜单:高级-设置-文件处理-备份 应用和确定