码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-06-07 23:08:31      阅读:353      评论:0      收藏:0      [点我收藏+]

标签:pre   解释   需要   dig   可迭代对象   如何   内部函数   推导   容器   

一、迭代器

   它是一个带状态的对象,他能在你调用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())

 

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

 

 

 

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

标签:pre   解释   需要   dig   可迭代对象   如何   内部函数   推导   容器   

原文地址:https://www.cnblogs.com/qianshuixianyu/p/9153068.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!