• python装饰器、迭代器、生成器


    装饰器:为已存在的函数或者或者对象添加额外的功能

     1 def wrapper(f):    #装饰器函数,f是被装饰的函数
     2     def inner(*args,**kwargs):
     3         '''在被装饰函数之前要做的事'''
     4         print("AAAA")
     5         ret = f(*args,**kwargs)    #被装饰的函数
     6         '''在被装饰函数之后要做的事'''
     7         print("BBBB")
     8         return ret
     9     return inner
    10 
    11 @wrapper         #语法糖 @装饰器函数名
    12 def func(a,b):     #被装饰的函数
    13     time.sleep(0.01)
    14     print('大家好',a,b)
    15     return '新年好'
    16 
    17 func(2,5)

    打印结果如下

    迭代器:在python中如果一个对象有_iter_()和_next_()方法,则称该对象是迭代器(Iterator),其中_iter_()方法可以让对象使用for...in循环遍历,_next_()方法糖对象可以通过next(实例名)访问下一个元素

    可迭代在python中一个一个对象有_iter_()方法或_getitem_()方法,称该对象为可迭代的(Iterable),_iter_()让对象使用for循环,_getitem_()方法是让对象可以通过“实例名[index]”的方式访问实例中的元素

    # 迭代器
    l = [1, 2, 3]
    # for i in l:
    #     i:
    
    print(dir([]))  # 列表拥有的方法
    """
    ['__add__', '__class__', '__contains__', '__delattr__',
     '__delitem__', '__dir__', '__doc__', '__eq__', '__format__',
    '__ge__', '__getattribute__', '__getitem__', '__gt__',
    '__hash__', '__iadd__', '__imul__', '__init__', 
    '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__',
    '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
    '__repr__', '__reversed__', '__rmul__', '__setattr__',
    '__setitem__', '__sizeof__', '__str__', '__subclasshook__',
    'append', 'clear', 'copy', 'count', 'extend', 'index',
    'insert', 'pop', 'remove', 'reverse', 'sort']
    """
    # 双下划线的是双下方法
    print([1].__add__([2]))  # -->[1, 2]
    print([1] + [2])  # -->[1, 2]
    
    ret = set(dir([])) & set(dir({})) & set(dir('')) & set(dir(range(10)))
    print(ret)  # iterable  __iter__
    
    # 判断
    print('__iter__' in dir([].__iter__()))  # True
    print('__next__' in dir([].__iter__()))  # True
    
    from collections import Iterable  # Iterable:可迭代对象
    from collections import Iterator  # Iterator迭代器
    
    print(isinstance([], Iterator))  # False  列表不是一个迭代器
    print(isinstance([], Iterable))  # True   列表是可迭代的
    
    a = [1, 2, 3, 4]
    for b in a.__iter__():
        print(b)
    
    # 打印结果1,2,3,4

    生成器:生成器函数generator与定义普通函数一样,唯一不同的是生成器函数有一个或者多个yield,yield与return类似都是用来返回数据,两者的区别是return返回数据后直接退出当前函数,yidel是将数据返回后继续运行函数

    def generator():
        print(1)
        return 'a'
    ret = generator()
    print(ret)     # 结果:1   a
    
    
    # 生成器函数(含有yield关键字)
    def generator1():
        print(1)
        yield 'a'
    
    ret = generator1()
    print(ret)   # 结果: <generator object generator1 at 0x0000016AFEFDCF68>
    ret.__next__()   # 结果:1
    ret.__iter__()

    生成器进阶:

     1 # 计算移动平均值(1)
     2 def averager():
     3     total = 0.0
     4     count = 0
     5     average = None
     6     while True:
     7         term = yield average
     8         total += term
     9         count += 1
    10         average = total / count
    11 
    12 
    13 g_avg = averager()
    14 next(g_avg)
    15 print(g_avg.send(10))
    16 print(g_avg.send(30))
    17 print(g_avg.send(5))
    18 # 结果:10.0,20.0,15.0
    19 
    20 # 计算移动平均值(2)_预激协程的装饰器
    21 def init(func):  # 在调用被装饰生成器函数的时候首先用next激活生成器
    22     def inner(*args, **kwargs):
    23         g = func(*args, **kwargs)
    24         next(g)
    25         return g
    26 
    27     return inner
    28 
    29 
    30 @init
    31 def averager():
    32     total = 0.0
    33     count = 0
    34     average = None
    35     while True:
    36         term = yield average
    37         total += term
    38         count += 1
    39         average = total / count
    40 
    41 
    42 g_avg = averager()
    43 # next(g_avg)   在装饰器中执行了next方法
    44 print(g_avg.send(10))
    45 print(g_avg.send(30))
    46 print(g_avg.send(5))
    47 # 打印结果10.0,20.0,15.0
  • 相关阅读:
    高精度“+”算法
    漏洞扫描
    端口扫描
    使用sqlmap
    Kali实现靶机远程控制
    Docker下配置KeepAlive支持nginx高可用
    web攻防环境--一句话木马
    Docker容器技术--自定义网桥后的默认网卡名称
    小白大数据学习指南
    Nginx简单操作
  • 原文地址:https://www.cnblogs.com/xiaolu915/p/10528905.html
Copyright © 2020-2023  润新知