• Python中的迭代器和生成器,以及装饰


    一、迭代器

       它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter____next__()方法的对象都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常,至于它们到底是如何实现的这并不重要。

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

      (1)迭代器的四大特性

        1.跌代集合,字符串,有序依次---------即有可迭代对象

        2.线程不安全的,多线程访问同一个集合修改报错。
        3.对于无法随机访问的数据结构,迭代器是唯一选择
        4.只迭代当前元素,迭代前后均可不存
      (2)迭代器的使用
        lst = range(2)
           it = iter(lst)
           print( it)

          输出:<listiterator object at 0x00BB62F0>

          print(it.next())   #输出:0

          print(next(it)) #输出:1

      (3) python中in后面自动就会生成迭代器对象

          for idx, ele in enumerate(lst):

              print idx, ele

    二、生成器

        生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要再像上面的类一样写__iter__()__next__()方法了,只需要一个yiled关键字。 生成器一定是迭代器(反之不成立),因此任何生成器也是以一种懒加载的模式生成值。

        特性:

            1.推导 +(x+1 for x in lst) =生成器表达式,返回迭代器,外部括号用于参数时可省略
            2.或者yield :生成 且 只生成一次,且停止到此

      (1)生成器的基本代码

         def get_0_1_2():

             yield 0

             yield 1  

             yield 2

          print( get_0_1_2)

          输出:<function get_0_1_2 at 0x00B2CB70>

        (2)调用生成器函数将返回一个生成器:

          generator = get_0_1_2()

          print( generato)

          输出:<generator object get_0_1_2 at 0x00B1C7D8>

          print(generator.next())  输出:0

          print(generator.next())  输出:1

          print(generator.next())  输出:2

    三、闭包

    定义:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)

    闭包从表现形式上解释为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包。

        #含有内部函数--闭包

    def FunX(x):
    print("开始")
    def FunY(y):
    print("计算")
    return x*y
    return FunY
    a=FunX(3)#返回的时内部函数FunY
    b=a(5)
    print(b)

    输出:15

      FunY在FunX函数的代码块中定义。我们称FunY是FunX的内部函数。

      在FunY的局部作用域中可以直接访问FunX局部作用域中定义的变量。
    简单的说,这种内部函数可以使用外部函数变量的行为,就叫闭包。

    四、装饰器

    Python将一切视为 objec t的子类,即一切都是对象,因此函数可以像变量一样被指向和传递。

    def diguo():
    print("地锅50")
    return 50
    def doupi(fn):
    def jia():
    print("豆皮10")
    return fn()+10
    return jia
    def xiang(fnn):
    def jia():
    print("香菜")
    return fnn()+5
    return jia
    aa=doupi(xiang(diguo))
    print(aa())

    下一篇博客将详细讲解闭包和装饰器。

  • 相关阅读:
    锚点anchorPoint
    核心动画2
    核心动画1
    CALayer()CoreAnimation 核心动画 简称 CA
    storyBoard
    本地通知UILocalNotification
    CoreImage 可以用滤镜来处理图片,比如修改饱和度,亮度,对比度等
    GCD(2)
    NSOperation(多线程)2
    给你个图片的网络地址url,如何获取该图片的尺寸
  • 原文地址:https://www.cnblogs.com/qianshuixianyu/p/9153068.html
Copyright © 2020-2023  润新知