1 装饰器

1.1目的、应用场景:

  • 目的:

    在不改变原函数内部代码的基础上,在函数执行前后自定义功能。

  • 应用场景:

    想要为函数扩展功能时,可以选择用装饰器。

1.2 编写装饰器和应用

    1. 基本装饰器

      # 装饰器的编写格式     (双层嵌套函数)
      def 外层函数(参数):
      def 内层函数(*arg,**kwarg)
      return 参数(*arg,**kwarg)
      return 内层函数 #装饰器的应用格式
      @外层函数
      def 要装饰的函数()
      pass # 执行函数,自动触发装饰器了
      要装饰的函数()

      练习题

      def func(arg):
      def inner():
      print('before')
      v = arg()
      print('after')
      return v
      return inner def index():
      print('123')
      return '666' # 示例一
      v1 = index() # 执行index函数,打印123并返回666赋值给v1. # 示例二
      v2 = func(index) # v2是inner函数,arg=index函数
      index = 666
      v3 = v2() # 示例三
      v4 = func(index)
      index = v4 # index ==> inner
      index() # 示例四
      index = func(index)
      index()
      def func(arg):
      def inner():
      v = arg()
      return v
      return inner # 第一步:执行func函数并将下面的函数参数传递,相当于:func(index)
      # 第二步:将func的返回值重新赋值给下面的函数名。 index = func(index)
      @func
      def index():
      print(123)
      return 666 print(index)
      # 计算函数执行时间
      
      def wrapper(func):

    def inner():

    start_time = time.time()

    v = func()

    end_time = time.time()

    print(end_time-start_time)

    return v

    return inner

    @wrapper

    def func1():

    time.sleep(2)

    print(123)

    @wrapper

    def func2():

    time.sleep(1)

    print(123)

    def func3():

    time.sleep(1.5)

    print(123)

    func1()


    注:问题:为什么要加*arg、**kwarg 理解:
  • 变量赋值

         def func():
    print(1) v1 = func
    func = 666
    ``` - 看看到底return的是什么? - 自己有找自己的,自己没有到上一级作用域去找

背会:

     @xx  # index = xx(index)
def index():
pass
index()
``` - 2. 关于参数 ```python
def x(func):
def inner(a1):
return func(a1)
return inner @x
def index(a1):
pass
``` ```python
def x(func):
def inner(a1,a2):
return func(a1,a2)
return inner @x
def index(a1,a2):
pass # index = inner
index(1,2) # ################################### 参数统一的目的是为了给原来的index函数传参
def x(func):
def inner(a1,a2):
return func()
return inner @x
def index():
pass
# func = 原来的index函数u
# index = inner
index(1,2)
``` 如果给好几个函数写一个统一的装饰器,怎么办? ```python
def x1(func):
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner @x1
def f1():
pass @x1
def f2(a1):
pass
@x1
def f3(a1,a2):
pass
``` 装饰器建议写法: ```python
def x1(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs)
return data
return inner
``` - 3. 带参数的装饰器 ```python
# 第一步:执行 v1 = uuu(9)
# 第二步:ret = v1(index)
# 第三步:index = ret
@uuu(9)
def index():
pass
``` ```python
# ################## 普通装饰器 #####################
def wrapper(func):
def inner(*args,**kwargs):
print('调用原函数之前')
data = func(*args,**kwargs) # 执行原函数并获取返回值
print('调用员函数之后')
return data
return inner @wrapper
def index():
pass # ################## 带参数装饰器 #####################
def x(counter):
def wrapper(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs) # 执行原函数并获取返回值
return data
return inner
return wrapper @x(9)
def index():
pass
``` 练习题 ```python
# 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,把每次结果添加到列表中,最终返回列表。
def xxx(counter):![](https://img2018.cnblogs.com/blog/1646753/201907/1646753-20190719213053775-1588807446.png) print('x函数')
def wrapper(func):
print('wrapper函数')
def inner(*args,**kwargs):
v = []
for i in range(counter):
data = func(*args,**kwargs) # 执行原函数并获取返回值
v.append(data)
return v
return inner
return wrapper @xxx(5)
def index():
return 8 v = index()
print(v) # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回最后一次执行的结果
def xxx(counter):
print('x函数')
def wrapper(func):
print('wrapper函数')
def inner(*args,**kwargs):
for i in range(counter):
data = func(*args,**kwargs) # 执行原函数并获取返回值
return data
return inner
return wrapper @xxx(5)
def index():
return 8 v = index()
print(v)
# 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回执行结果中最大的值。
def xxx(counter):
print('x函数')
def wrapper(func):
print('wrapper函数')
def inner(*args,**kwargs):
value = 0
for i in range(counter):
data = func(*args,**kwargs) # 执行原函数并获取返回值
if data > value:
value = data
return value
return inner
return wrapper @xxx(5)
def index():
return 8 v = index()
print(v)
``` ```
def x(counter):
print('x函数')
def wrapper(func):
print('wrapper函数')
def inner(*args,**kwargs):
if counter:
return 123
return func(*args,**kwargs)
return inner
return wrapper @x(True)
def fun990():
pass @x(False)
def func10():
pass
``` ### 2 迭代器 自己不会写迭代器,只需要会用。 任务:请展示列表中所有的数据 - 1. while + 索引 + 计数器 2. 迭代器,对 某种对象(str/list/tuple/dict/set类创建的对象)-可迭代对象中的元素进行逐一获取 表象:具有_ _ next _ _方法且每次调用都获取可迭代对象中的元素(从前到后一个一个获取)。 - 1. 先将某对象(如列表)转换成迭代器 v1 = iter([11,22,33,44]) v1 = [11,22,33,44]_ _ iter _ _() _ 2. 迭代器想要获取每个值:反复调用(val = v1._ _ next _ _()) ```python
v1 = [11,22,33,44] # 列表转换成迭代器
v2 = iter(v1)
result1 = v2.__next__()
print(result1)
result2 = v2.__next__()
print(result2)
result3 = v2.__next__()
print(result3)
result4 = v2.__next__()
print(result4)
result5 = v2.__next__() # v1只有4个元素,第五次获取就会报错:StopIteration
print(result5) v1 = "alex"
v2 = iter(v1)
while True:
try:
val = v2.__next__()
print(val)
except Exception as e:
break
``` 3. 直到报错:StopIteration错误,表示已经迭代完毕。 ![](https://img2018.cnblogs.com/blog/1646753/201907/1646753-20190719213324918-1325127417.png) 4. 如何判断一个对象是否是可迭代对象:内部是否有_ _ next _ _方法。 3. for循环: ```python
v1 = [11,22,33,44] # 1.内部会将v1转换成迭代器
# 2.内部反复执行 迭代器.__next__()
# 3.取完不报错
for item in v1:
print(item)
``` ### 3 可迭代对象 - 1. 内部具有_ _ iter _ _()方法且返回一个迭代器 ```python
v1 = [11,22,33,44]
result = v1.__iter__()
``` 2. 可以被for循环的

python — 装饰器、迭代器的更多相关文章

  1. python装饰器,迭代器,生成器,协程

    python装饰器[1] 首先先明白以下两点 #嵌套函数 def out1(): def inner1(): print(1234) inner1()#当没有加入inner时out()不会打印输出12 ...

  2. Python装饰器、迭代器&生成器、re正则表达式、字符串格式化

    Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用 ...

  3. python装饰器(docorator)详解

    引言: 装饰器是python面向对象编程三大器之一,另外两个迭代器.生成器只是我现在还没有遇到必须使用的场景,等确实需要用到的时候,在补充资料:装饰器在某些场景真的是必要的,比如定义了一个类或者一个函 ...

  4. Python 装饰&生成&迭代器

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  5. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  6. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  7. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  8. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  9. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  10. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

随机推荐

  1. UVALive 5052 Genome Evolution ——(xjbg)

    本以为这题n=3000,随便n方一下就能过.于是我先枚举长度len再枚举起点,不断增加新的点并删除原来的点,判断在b中的r-l+1是不是等于len即可,这个过程显然要用set维护比较方便,但是貌似卡了 ...

  2. mysql 常见面试题

    附录: https://mp.weixin.qq.com/s/pC0_Y7M7BkoUmlRwneZZdA 一.为什么用自增列作为主键 1.如果我们定义了主键(PRIMARY KEY),那么InnoD ...

  3. 20175313 张黎仙《Java程序设计》第十周学习总结

    目录 一.教材学习内容总结 二.教材学习中的问题和解决过程 三.代码调试中的问题和解决过程 四.代码托管 五.心得体会 六.学习进度条 七.参考资料 一.教材学习内容总结 第十二章内容 主要内容 杂项 ...

  4. SCRIPT438: 对象不支持“trim”属性或方法

    关于ie9以下不支持trim()方法 可以在自己封装的框架中加入如下.或直接调用也行. if(!String.prototype.trim) { String.prototype.trim = fun ...

  5. dd 命令

    dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: if=文件名:输入文件名 ...

  6. LightGBM两种使用方式

    原生形式使用lightgbm(import lightgbm as lgb) import lightgbm as lgb from sklearn.metrics import mean_squar ...

  7. Java同步数据结构之ConcurrentLinkedQueue

    前言 前面介绍的Queue都是通过Lock锁实现的阻塞队列,今天介绍一种非阻塞队列ConcurrentLinkedQueue,所谓非阻塞,其实就是通过CAS代替加锁来实现的高效的非阻塞队列.当许多线程 ...

  8. Python - pytesseract 机器视觉

    机器视觉  - tesseract ( 验证码 ) 安装 Ubuntu sudo apt-get install tesseract-ocr Windows 下载安装包 添加环境变量(Path) :搜 ...

  9. 001-多线程-锁-架构【同步锁、JUC锁】

    一.概述 Java中的锁,可以分为"同步锁"和"JUC包中的锁". 1.1.同步锁 即通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁 ...

  10. 图解 HTTP 笔记(七)——HTTPS

    本章主要讲解 HTTPS 的基本原理,以及如何利用 HTTPS 防范 HTTP 通信过程中存在的伪装.窃听.篡改等问题 一.HTTP 的缺点 HTTP 在通信过程中会面临以下三种安全问题: 通信使用明 ...