python基础之三大器中迭代器和生成器

迭代器

  • 迭代对象: 在python中,但凡内部含有iter方法的对象,都是可迭代对象
  • **迭代器: 在python中,内部含有__Iter__方法并且含有__next__方法的对象就是迭代器。**

    可迭代对象 str list set dic

  • python中规定,只要具有__ iter__()方法就是可迭代对象
    str.__iter__()# list.__iter__()# tuple.__iter__()# dict.__iter__()# set.__iter__()
    • 将可迭代对象转换成迭代器

      lis = lst.__iter__()
      # print(lis.__next__())  # 下一位
      # print(lis.__next__())  # 下一位
      # print(lis.__next__())  # 下一位
      # print(lis.__next__())  # 下一位
      有多少元素就能next 多少次 超过范围报错
      文件句柄就是一个迭代器 # f = open("usrinfo","a",encoding="utf-8")

      while模拟for的内部循环机制

      将可迭代对象转换成迭代器,然后利用next进行取值,最后利用异常处理处理StopIteration抛出的异常。

      s = "alex"
      s1 = s.__iter__()
      while True:
          try: # 尝试着运行一下缩进体中的代码
              print(s1.__next__())
          except StopIteration:
              break

    可迭代对象如何转化成迭代器,并且取值

    方法一:

    lst = [1,2,3,4]
    l = lst.__iter__()
    print(1.__next__())  #1
    print(1.__next__())  #2
    print(1.__next__())  #3
    print(1.__next__())  #4
    方法二
    lst = [1,2,3,4]
    l = iter(lst)
    print(next(l))  #1
    print(next(l))  #2
    print(next(l))  #3
    print(next(l))  #4   #推荐

    python2 和python3

    py2没有__iter__()  有iter()
    py3 有__iter__()  有iter()

    可迭代对象优点和缺点:

    #优点
      1.使用灵活(每个可迭代对象都有自己的方法)
      2.能够直接查看元素的个数
    #缺点
      占内存
    应用:内存空间大,当数据量比较少,建议使用可迭代对象

    迭代器的优缺点及应用

    #具有__iter__()和__next__()方法就是一个迭代器
    #优点
         节省内存
    #缺点
      1 只能向一个方向执行,不能退回
      2 一次性的
      3 不能灵活操作,不能直接看元素的个数
    应用:当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。(可参考为什么python把文件句柄设置成迭
    代器)。

时间换空间:迭代器,生成器,用大量的时间来节省空间

空间换时间:可迭代对象,用大量空间来节省时间

lst = [1,2,3,4]
l = iter(lst)
#print(l) 输出结果是迭代器的内存地址 <list_iterator object at 0x0000018117F0BA58>
for i in l:# for循环可以直接去循环迭代器
    print(i)
迭代器也是一个可迭代对象

生成器

  • 生成器的本质就是一个迭代器
  • 最大的区别:
    • 迭代器:文件句柄,通过数据转换 python自带提供
    • 生成器:程序员自己实现
  • 生成器的目的:不在通过数据转换实现,而是通过代码编写实现
  • 生成器的定义:

    1.基于函数实现的生成器

    2.表达式实现生成器

    这是一个函数
    def func():
      print(1)
      return 5
    print(func())  这是一个函数

    这是一个生成器

    def func():
      print(1)
      yield 5
      print(func())    创建一个生成器对象  <generator object func at 0x0000025A8B022EB8>

    表达式形式的生成器

    gen = (i**2 for i in range(10))
    print(next(gen))
    博客推导式那里细讲
    函数print(func()) 得到的是return返回的值,而生成器print(fun()) 得到的是生成器对象的内存地址
    补充运行代码情况
    # def func():
    #     print(foo)      报错
    # func()
    
    # def func():
    #     print(foo)    不报错     
    
    因为计算机在查看代码时候会进行  1 语法分析  2词法分析   第一个是语法没有错,foo没有定义,但是他调用了,语法分析时没有问题,但是执行调用使用词法分析就
    会报错
    第二个虽然没定义foo  但是语法没有错误,词法错误,但是函数体没有调用,故不会报错

    生成器怎么用:

    特点:惰性机制

    yield 和 return部分功能很像

    • 版一
    def func( ):
          yield 1       #记录执行位置的
          yield 2
          yield 3
    g = func()     #获取的是生成器的内存地址
    print(next(g)) #1
    print(next(g)) #2
    print(next(g)) #3   惰性机制,不next 不往下执行
    • 版二
    def func():
      yield 1
      yield 2
        yield 3
    g =func()
    g1 =func()
    g2= func()
    print(g,g1,g2)   输出三个<generator object func at 0x00000133E5DA7990>  只不过后边的地址不一样,说明创建了三个生成器 
    def func():
          yield
        print(func().__next__())    NONE   #得到是yield 返回的NONE
    def func():
      yield [1,2,3,4,5]
          print(func().__next__(),type(func().__next__()))
      得到的是[1,2,3,4,5]  类型是List
    def func():      !!!!!这个有意思  结果是 1 NONE  <class 'function'>
      def foo():
          print(1)
      yield foo
    g = func().__next__()
    print(g(),type(g)) 
    def func():
      yield 1,2,3,4,5
      print(123)
      yield 111
    g = func()
    print(next(g))
    print(next(g))
    输出结果(1,2,3,4,5)  123  111      yield惰性 next往下走 
    yield from 
    
    def func():
      yield [1,2,23,54,2]    #将列表整体返回
      yield from  [1,2,23,54,5]  #将列表中的元素逐个返回
    g = func()
    print(next(g)) [1,2,23,54,2]
    print(next(g))  1
    print(next(g))  2
    print(next(g))  23
    print(next(g))  54
    print(next(g))  5

    总结:

    在我理解就是生成器就是人造的迭代器,通过next取值,用时间换空间!

    生成器一定是一个迭代器,但是迭代器不一定是一个生成器

    迭代器和生成器的优点:

    节省内存

    迭代器和生成器的缺点

    1.不能直接使用元素
    2.不能直观查看元素的个数
    3.使用不灵活
    4.稍微消耗时间
    5.一次性的,不能逆行

    当数据量特别大的时候,一定要记得用生成器

    区分迭代器和生成器:

    lst = [1,2,3]
    print(lst.__iter__())
    
    def func():
      yield 1
    print(func())
    # 看内存地址   结果会显示iterator是迭代器  generator是生成器

    yeild

    return一般在函数中只设置一个,他的作用是终止函数,并且给函数的执行者返回值。

    yield在生成器函数中可设置多个,他并不会终止函数,next会获取对应yield生成的元素。

    • yield 能返回多个,以元组的形式储存
    • yield 能返回各种数据类型
    • yield 能写多个并且都执行
    • yield 能够记录执行位置
    • yield 后边不写内容,默认返回NONE
    • yield 都是将数据一次性返回
    • yield from 是将数据逐个返回
    可迭代对象:
    具有__iter__()方法的就是一个可迭代对象
    迭代器:
    具有__iter__()和__next__()方法就是一个迭代器
    生成器:
    基于函数创建的生成器,函数体中必须存在yield

原文地址:https://www.cnblogs.com/zzsy/p/12219533.html

时间: 2024-11-03 01:32:00

python基础之三大器中迭代器和生成器的相关文章

Python 从零学起(纯基础) 笔记 之 迭代器、生成器和修饰器

Python的迭代器. 生成器和修饰器 1. 迭代器是访问集合元素的一种方式,从第一个到最后,只许前进不许后退. 优点:不要求事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而在这之前或者之后,元素可以不存在或被销毁. 特点: 访问者是不需要关心迭代器内部的结构,仅需要通过next()方法不断去取下一个内容. 不能随机访问集合中的某个值,只能从头到尾依次访问. 访问到一半时不能往回退 便于循环比较大的数据集合,节省内存 1 names = iter(['alex','ja

python中迭代器和生成器。

前言:很多python教程中,对python的解释不容易理解,本文记录自己的理解和体会,是对迭代器和生成器的初步理解. 迭代器: 迭代器的实质是实现了next()方法的对象,常见的元组.列表.字典都是迭代器. 迭代器中重点关注两种方法: __iter__方法:返回迭代器自身.可以通过python内建函数iter()调用. __next__方法:当next方法被调用的时候,迭代器会返回它的下一个值,如果next方法被调用,但迭代器没有只可以返回,就会引发一个StopIteration异常.该方法可

Python 基础第十三天(迭代器,生成器)

今日主要内容: 1.可迭代对象 2.迭代器 3.生成器 1.可迭代对象 什么是可迭代对象:内部含有__iter__方法的对象,就是可迭代对象. 查看__iter__方法:dir(对象) 可迭代对象就遵循可迭代协议. 接触过的可迭代对象有:str,list,tuple,dict,set,range 迭代器:f1文件句柄 如何判断 法一: 例:s = 'laonanhai' print('__iter__' in dir(s)) 法二: 例:l = [1, 2, 3, 4]from collecti

Python 基础 - Day 4 Learning Note - Generator 生成器

列表生成器/列表解析 list comprehension 简单灵活地创建列表,通常和lambda(), map(), filter() 一起使用 通过列表生成式, 直接创建列表.但是,收到内容限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问几个元素,那其他的就白占空间.列表生成器能够一边循环一边计算,大大节省大量的空间.是生成器的一种. 只有调用,才能生成. 不支持切片操作,只能通过__next()___一个个取数字. 基本语法

Python之装饰器、迭代器和生成器

在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思来谁就是对特定的建筑物内按照一定的思路和风格进行美化的一种行为,所谓“器”就是工具,对于python来说装饰器就是能够在不修改原始的代码情况下给其添加新的功能,比如一款软件上线之后,我们需要在不修改源代码和不修改被调用的方式的情况下还能为期添加新的功能,在python种就可以用装饰器来实现,同样在写

15.python的for循环与迭代器、生成器

在前面学习讲完while循环之后,现在终于要将for循环这个坑填上了.之所以拖到现在是因为for循环对前面讲过的序列.字典.集合都是有效的,讲完前面的内容再来讲for循环会更加容易上手. 首先,for循环和while循环一样,都是在满足一定条件的时候对其内层的代码进行循环执行.不同的是,while循环判断的是条件,而for判断的是迭代对象. 我们先来看for循环的代码: a = (1, 2, 3, 4, 5) for x in a: print x 我们以序列中的元祖为例,发现其输出了这些,那么

python中迭代器和生成器的区别

1 #!/usr/bin/python 2 def power(values): 3 for value in values: 4 print "powing %s" % value 5 yield value 6 def add(values): 7 for value in values: 8 if value % 2 == 0: 9 yield value + 3 10 else: 11 yield value + 2 12 elements = [1, 4, 7, 9, 12,

Python基础(7)——迭代器&amp;生成器

1.列表生成式 1 [i*2 for i in range(10)] 2 [fun(i) for i in range(10)] 2.生成器 1 # Author Qian Chenglong 2 3 #列表生成器 4 a=(i*2 for i in range(10)) 5 #a[1]#只是将算法存储了,只有在调用时才会生成相应的数据,不能直接读取 6 a.__next__()#生成器只能一个一个往后取,且只存储当前值 7 8 #函数生成器 9 10 # def fib(max): 11 #

python基础-第六篇-6.1生成器与迭代器

迭代器 特点: 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容 不能随机访问集合中的某个值 ,只能从头到尾依次访问 访问到一半时不能往回退 便于循环比较大的数据集合,节省内存 names = iter(['alex','wupeiqi','eva']) print(names) print(names.__next__()) print(names.__next__()) print(names.__next__()) #在往下取就报错 # print(names.