博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python三大器(装饰器/生成器/迭代器)
阅读量:4594 次
发布时间:2019-06-09

本文共 3068 字,大约阅读时间需要 10 分钟。

1装饰器

1.1基本结构

def 外层函数(参数):    def 内层函数(*args,**kwargs);        return 参数(*args,**kwargs)    return 内层函数@外层函数def index()    pass
#示例:def func(arg):    def inner():        v = arg()        return v     return inner @funcdef index():    print(123)    return 666print(index)
  • @func :执行func函数把下面色函数当做参数传递,相当于:func(index)
  • 将外层函数的返回值(内层函数)重新赋值给下面的函数名index,index = func(index)

1.2装饰器基本应用

应用场景:想要为函数扩展功能时,使用装饰器

  • 计算运行时间

    • 时间模块:time.time()获取当前时间
    • time.sleep('秒数')睡眠
    # 计算函数执行时间def wrapper(func):    def inner():        start_time = time.time()        v = func()        end_time = time.time()        print(end_time-start_time)        return v    return inner@wrapperdef func1():    time.sleep(2)    print(123)@wrapperdef func2():    time.sleep(1)    print(123)func1()

1.3 带参数的装饰器

#普通装饰器基本格式def wrapper(func):    def inner():        pass        return func()    return innerdef func():    passfunc = wrapper(func)func()#带参数装饰器基本格式def w(counter):    def wrapper(func):        def inner(*args,**keargs):            lis = []            for i in range(0,counter):                a=func(*args,**keargs)                lis.append(a)            return lis        return inner    return wrapperdef func(*args,**keargs):    return 8
#面试题# 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回最后一次执行的结果【面试题】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 8v = index()print(v)

2生成器

  • 函数中存在yield,那么该函数为生成器函数,调用生成器函数会返回一个生成器,生成器只有被for循环时,生成器函数内部的代码才会执行,每次驯化都会获取yield返回的值.
  • 基本格式:
##生成器函数存在yielddef func(*args)    *args=1    yield 1    yield 2   func('a')#函数内部代码不会执行,返回一个生成器对象v = func('a')#生成器是可以被for循环,一旦开始循环name函数内部代码就会开始执行.for item in v:    print(item)    #循环开始,函数运行,yield 返回值,停止第一次循环,再次循环时从上一次yield的位置开始运行
  • 生成数字:
    • return 可以做终止命令,不会返回值
def func():    count = 1    while True:        yield count        count += 1        val = func()for item in val:    print(item)

3迭代器

3.1 迭代器

  • 迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代

  • 迭代器:帮助对某种对象(str/list/tuple类所创建的对象..)中的y元素一一获取.表象:具有__next__方法,每次迭代都返回一个值

    • 列表转换成迭代器:
      • lis = iter([1,2,4,2])
      • lis= [1,2,4,2]._ _ iter __()
    • 迭代器想要获取每个值就要反复调用:val = lis.__ next __()
      • 直到报错Stopinteration取到最后一个元素
    • 判断一个对象是否是迭代器:内部是否有__ next __方法.
    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__()print(result5)"""# v1 = "alex"# v2 = iter(v1)# while True:#     try:#         val = v2.__next__()#         print(val)#     except Exception as e:#         break

3.2 可迭代对象

  • 具有__inter__方法的就是可迭代对象,并且返回一个迭代器,才成为可迭代对象

    v1= [11,22,33,44]result= v1.__iter__()
  • 能被for循环的就是可迭代对象

小结

  • 迭代器,对可迭代对象中的元素进行逐一获取,迭代器对象的内部都有一个 __next__方法,用于以一个个获取数据。
  • 可迭代对象,可以被for循环且此类对象中都有 __iter__方法且要返回一个迭代器(生成器)。
  • 生成器,函数内部有yield则就是生成器函数,调用函数则返回一个生成器,循环生成器时,则函数内部代码才会执行。
    • 生成器是特殊的迭代器(**)

转载于:https://www.cnblogs.com/bigox/p/10738889.html

你可能感兴趣的文章
[NOI2008]假面舞会(DFS)
查看>>
BZOJ2137: submultiple(生成函数,二项式定理)
查看>>
winform程序关闭界面时弹出提示框
查看>>
vue 解决页面加载时闪烁出现vue标签或者指令的问题v-cloak
查看>>
iOS中Block介绍 基础
查看>>
Android 服务类Service 的详细学习
查看>>
通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(二)
查看>>
poj Dropping tests 01分数规划---Dinkelbach算法
查看>>
服务命令Linux安装配置apache
查看>>
运行确认怎么用vnc访问自己电脑,并且同时又是同一个会话?
查看>>
FTP文件操作之下载文件
查看>>
【Java NIO】一文了解NIO
查看>>
有赞订单导出的配置化实践
查看>>
Linux更改目录及其子目录、文件的访问权限
查看>>
29. Divide Two Integers
查看>>
D3.js 区域生成器 (V3版本)
查看>>
Linux的命令与文件的搜寻which、whereis、locate、find的区别
查看>>
237. Delete Node in a Linked List
查看>>
EF、Dapper、NHibernate等ORM框架的比较及优缺点
查看>>
Druid数据库连接池的一般使用
查看>>