python基础-7 迭代器 生成器 闭包 装饰器

迭代器 :

            迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束

            迭代不能回退,只能往前进行迭代。

            迭代器也不是线程安全的

           迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值,这是后话)。但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式

           迭代器更大的功劳是提供了一个统一的访问集合的接口。只要是实现了__iter__()方法的对象,就可以使用迭代器进行访问

生成器 :

           生成器就是一种迭代器。生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中。另外,对于生成器的特殊语法支持使得编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的特性之一

   from 继承 import Person
def iterdemo():
    for i in range(5):
        print("yield之前...")
        yield i
        print("yield之后...")

f = iterdemo()

          生成器函数在每次暂停执行时,函数体内的所有变量都将被封存(freeze)在生成器中,并将在恢复执行时还原,并且类似于闭包,即使是同一个生成器函数返回的生成器,封存的变量也是互相独立的


闭包  :

        所谓闭包,就是将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象

       Local - 本地函数(show_filename)内部,通过任何方式赋值的,而且没有被global关键字声明为全局变量的filename变量;

       Enclosing - 直接外围空间(上层函数wrapper)的本地作用域,查找filename变量(如果有多层嵌套,则由内而外逐层查找,直至最外层的函数);

      Global - 全局空间(模块enclosed.py),在模块顶层赋值的filename变量;
      Builtin - 内置模块(__builtin__)中预定义的变量名中查找filename变量;

     在任何一层先找到了符合要求的filename变量,则不再向更外层查找。如果直到Builtin层仍然没有找到符合要求的变量,则抛出NameError异常。这就是变量名解析的:LEGB法则

       闭包最重要的使用价值在于:封存函数执行的上下文环境

       闭包在其捕捉的执行环境(def语句块所在上下文)中,也遵循LEGB规则逐层查找,直至找到符合要求的变量,或者抛出异常

装饰器 :

        闭包的重要特性:封存上下文,这一特性可以巧妙的被用于现有函数的包装,从而为现有函数增加功能。而这就是装饰器

       一般情况下,局部变量在函数返回时,就会被垃圾回收器回收,而不能再被使用。但是这里的alist却没有,它随着lazy_sum函数对象的返回被一并返回了(这个说法不准确,实际是包含在了lazy_sum的执行环境中,通过__globals__),从而延长了生命周期

        动态类型:在运行期间确定变量的类型,python确定一个变量的类型是在你第一次给他赋值的时候;

强类型:有强制的类型定义,你有一个整数,除非显示的类型转换,否则绝不能将它当作一个字符串(例如直接尝试将一个整型和一个字符串做+运算)

        def doupi(fn):
    def jiadoupi():
        print("麻将豆皮10块")
        return fn()+10
    return jiadoupi
def xiangcai(fnn):
    def jiaxiangcai():
        print("麻将香菜5块")
        return fnn()+5
    return jiaxiangcai
@xiangcai
@doupi
def diguo():
    print("底锅50")

    return 50

@标记: 
装饰器以@标记来修饰函数和类的方法,使装饰目标对象更为简单易读。 
在python中,@可以将python定义的函数“当作”属性访问,从而提供更加友好的访问方式

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值