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 多个装饰器叠加 生成式的更多相关文章

  1. s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法

    python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf ...

  2. Day13有参装饰器,三元表达式,匿名函数

    多个装饰器: 加载顺序:由下而上 执行顺序:由上而下 有参装饰器: 闭包,给函数传参的一种方法 当装饰器内需要参数时,可以采用闭包形式给其传参,第三层函数接收完参数时,就变为无参装饰器 三元表达式: ...

  3. day13 闭包及装饰器

    """ 今日内容: 1.函数的嵌套定义及必包 2.global 与 nonlocal 关键字 3.开放封闭原则及装饰器 """ " ...

  4. python基础知识13---函数对象、函数嵌套、名称空间与作用域、装饰器

    阅读目录 一 函数对象 二 函数嵌套 三 名称空间与作用域 四 闭包函数 五 装饰器 六 练习题 一 函数对象 1 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 ...

  5. 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 ...

  6. 面向切面编程AOP,一些通用装饰器

    1.一些装饰器,可以减少重复编写.比较常用的. 用的时候函数上面加上装饰器就可以.这是一些装饰器,加在函数或者方法上,减少了很多重复代码. 除此之外工作中也用一些mixin类大幅减少代码. impor ...

  7. Python 装饰器入门(下)

    继续上次的进度:https://www.cnblogs.com/flashBoxer/p/9847521.html 正文: 装饰类 在类中有两种不通的方式使用装饰器,第一个和我们之前做过的函数非常相似 ...

  8. python之旅:函数对象、函数嵌套、名称空间与作用域、装饰器

    一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...

  9. Python 闭包、迭代器、生成器、装饰器

    Python 闭包.迭代器.生成器.装饰器 一.闭包 闭包:闭包就是内层函数对外层函数局部变量的引用. def func(): a = "哈哈" def func2(): prin ...

随机推荐

  1. jq-杂记

    点击消失 <script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"> </script& ...

  2. 2.HTML文件中<!DOCTYPE html>的作用

    <!DOCTYPE> 声明位于文档中的最前面的位置,处于 <html> 标签之前.此标签可告知浏 览器文档使用哪种 HTML 或 XHTML 规范.(重点:告诉浏览器按照何种规 ...

  3. 实用的DDos攻击工具

    来源: http://www.safecdn.cn/linux/2018/12/ddos/95.html ‎ 特别提示:仅用于攻防演练及教学测试用途,禁止非法使用 Hyenae 是在windows平台 ...

  4. 《锋利的JQuery》中重写超链接与图片提示效果

    代码部分: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <met ...

  5. php图片上传base64数据编码。

    /** * base64图片上传 */ function IdImg($base64_img = ''){ $up_dir = 'upload/';//存放在当前目录的upload文件夹下 if(!f ...

  6. Redis 主从复制, 读写分离

    1: 是什么? 2: 经常是配置从库, 不配置主库 3.1: 每次与 master 断开之后都要从连, 除非你配置了redis.conf 3.2: 获取当前redis 服务信息 => info ...

  7. 02.设计模式_NullObject模式

    使用NULL OBJECT模式,我们可以确保返回的总是有效的对象,即使失败时也代表对象什么也不做. 下面以一个数据库查询的示例来演示空对象模式. 1.Employe实体对象空对象的接口 Employe ...

  8. react-navigation设置navigationOptions中Static中使用 this 的方法

    使用react-navigation时,单页面设置navigationOptions中,进行Static中 调用this 中的方法或值时,需要做如下操作 static navigationOption ...

  9. grep命令的常用选项

    Linux的grep命令是使用正则表达式进行文本搜索的,一些对程序员很有用的选项如下: -i   忽略大小写 -w  进行普通文件匹配,而不是正则表达式匹配 -c  只统计每个文件中匹配行数(默认是输 ...

  10. TCP的窗口滑动机制

    TCP的滑动窗口主要有两个作用,一是提供TCP的可靠性,二是提供TCP的流控特性.同时滑动窗口机制还体现了TCP面向字节流的设计思路. 可靠:对发送的数据进行确认 流控制:窗口大小随链路变化. 一.t ...