zoukankan      html  css  js  c++  java
  • 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())

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

  • 相关阅读:
    log4j 日志配置
    找出两个列表元素中相同的元素
    列表元素去重
    hdu 2149 Public Sale(巴什博弈变形)
    POJ 3169 Layout (差分约束+SPFA)
    hdu 1494 跑跑卡丁车(动态规划)
    hdu 3177 Crixalis's Equipment(贪心)
    HDU 1576 A/B(扩展欧几里德变形)
    POJ 1061青蛙的约会(扩展欧几里德)
    IE6下的CSS多类选择符
  • 原文地址:https://www.cnblogs.com/qianshuixianyu/p/9153068.html
Copyright © 2011-2022 走看看