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 FunYa=FunX(3)#返回的时内部函数FunYb=a(5)print(b)

输出:15

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

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

四、装饰器

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

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

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

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

时间: 2024-08-07 19:22:10

Python中的迭代器和生成器,以及装饰的相关文章

python中的迭代器和生成器

迭代:就是重复做一些事情很多次,使用__iter__方法,迭代器就是具有next方法的对象 内建函数iter可以从可迭代的对象中获得迭代器 从迭代器得到序列: 在if self.value>10中只能使用引发异常,不能使用break,不然有会报语法错误 从迭代器中得到序列我的理解为就是在满足条件之前就是将重复做过的值列出来. 生成器: 先展开嵌套列表中的子列表,然后再展开子列表中的元素. 任何包含yield语句的函数都称为生成器 处理多层未知的嵌套的情况:

Python中的迭代器、生成器

什么是迭代器 迭代器即迭代的工具 迭代是一个重复的过程,每一次重复即一次迭代,且每次迭代的结果都是下一次迭代的初始值 while True: #这里只是单纯的重复,不是迭代 print('-----') l = [1,2,3] count = 0 while count <= len(l): #这里是迭代 print(l[count]) count += 1 迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异

python函数:迭代器和生成器

python函数:迭代器和生成器 迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕(使用生成器) 一.迭代器 for i in 50:     print(i) #运行结果: # Traceback (most recent call last): #   File "G:/python/python代码/八月/day2 迭代器生成器/3迭代器.py", line 8, in &

Python - 三大器 迭代器,生层器,装饰器

目录 Python - 三大器 迭代器,生层器,装饰器 一. 容器 二. 可迭代对象(iterable) 三. 迭代器 四. 生成器 五. 装饰器 1. 定义 六. 闭包 Python - 三大器 迭代器,生层器,装饰器 在介绍三大器之前先来了解一下容器和可迭代对象... 一. 容器 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存

迭代器、生成器、装饰器学习总结

一.迭代器: 1.什么是迭代器? 在python中,迭代器是一个可以记住遍历位置的对象,迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完,迭代器只能往前不会后退.简单来讲我们见的比较多的是for 循环来遍历列表.元组.字符串等容器,这个就是迭代器的使用,所以说,迭代器简单可以理解成我们平时要从柜子里取东西时的动作. 2.两个内置迭代器协议方法: a.方法iter():返回对象本身,是for循环语句使用迭代器的要求. b.方法next():用于返回容器中下一个元素(所谓容器,简单理解

迭代器、生成器、装饰器(转)

一.迭代器: 1.什么是迭代器? 在python中,迭代器是一个可以记住遍历位置的对象,迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完,迭代器只能往前不会后退.简单来讲我们见的比较多的是for 循环来遍历列表.元组.字符串等容器,这个就是迭代器的使用,所以说,迭代器简单可以理解成我们平时要从柜子里取东西时的动作. 2.两个内置迭代器协议方法: a.方法iter():返回对象本身,是for循环语句使用迭代器的要求. b.方法next():用于返回容器中下一个元素(所谓容器,简单理解

python——迭代器、生成器、装饰器

迭代器 迭代器规则 迭代:重复做一些事很多次,就像在循环中那样. 不仅可以对字典和序列进行迭代,还可以对其他对象进行迭代:只要该对象实现了__iter__方法. __iter__方法会返回一个迭代器(iterator),所谓的迭代器就是具有next方法(这个方法在调用时不需要任何参数)的对象.在调用next方法时,迭代器会返回他的下一个值.如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常. 注意:迭代器规则在3.0中有一些变化.在新的规则中,迭代器对象应

Python学习笔记8(迭代器、生成器、装饰器)

1.列表生成式 要想学习生成器和迭代器,首先得了解另外一个概念,列表生成式. 想要生成一个0~9的列表的时候,首先想到的就是range(0,10) >>>a = range(0,10) >>>print(a) #3.0输出结果 range(0,10) #2.0输出结果 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 在3.0的版本呢当中range只是用来生成一个迭代器了,但是在2.0的版本里可以使用range来快速生成list. 但是想要生成一个[1*1,

Python中的内置模块与生成器迭代器-day5

Python3 中内置模块 Python中的列表生成式 Python生成器 Python迭代器 一.Python中的内置模块 PS:作为一个新手如果你不想使用IDE又想使用Python中的自动补全,可以下载使用ipython.下面实例中也大多是ipython输入和输出的内容. 安装ipython:pip3 install ipython Python3-内置函数 - abs() 绝对值 - all() 都为真 - any() 有一个为真 - ascii() 把字符串转换成ASCII - bin(