• 迭代器与生成器


    一、迭代器

    1、定义:

    对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 

    2、特性:

    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

    迭代器有两个基本的方法:iter() 和 next()

    l = [1,2,3,4,5]
    test = l.__iter__()
    print(test.__next__())
    print(test.__next__())
    print(test.__next__())
    print(test.__next__())
    print(test.__next__())

    输出结果:

    1
    2
    3
    4
    5

    2、可迭代对象:

    可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下

    'hello'.__iter__
    (1,2,3).__iter__
    [1,2,3].__iter__
    {'a':1}.__iter__
    {'a','b'}.__iter__
    open('a.txt').__iter__

    3、迭代器对象:

    可迭代对象执行obj.__iter__()得到的结果就是迭代器对象

    而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象

    迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象

    4、与for循环的关系

    for循环的工作原理

    1: 执行in后对象的dic.__iter__()方法,得到一个迭代器对象iter_dic

    2: 执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码

    3: 重复过程2,直到捕捉到异常StopIteration,结束循环

    二、生成器

    1、定义:

    只要函数内部包含有yield关键字,那么函数名()得到的结果就是生成器,并且不会执行函数内部代码

    2、特性:

    生成器是一个返回迭代器的函数,只能用于迭代操作

    三、三元表达式、列表推导式、生成器表达式

    1、例子:

    #普通用法
    li = []
    for i in range(5):
        li.append('sb%s'%i)
    print(li)
    
    #列表推导式
    li = ['sb%s' %i for i in range(5)] #二元
    print(li)
    li = ['sb%s' %i for i in range(5) if i < 4] #三元
    print(li)

    输出结果:

    ['sb0', 'sb1', 'sb2', 'sb3', 'sb4']
    ['sb0', 'sb1', 'sb2', 'sb3', 'sb4']
    ['sb0', 'sb1', 'sb2', 'sb3']

    将列表推导式的[]换成()即为生成器表达式

    li = ('sb%s' %i for i in range(5) if i < 4) #三元
    print(next(li))
    print(list(li))

    输出结果:

    sb0
    ['sb1', 'sb2', 'sb3']

    区别:都是便利的编程方式,不过生成器表达式更节省内存,列表推导式都是直接输出列表,而生成器可以一步一步输出

  • 相关阅读:
    结构和联合
    字符串、字符和字节
    数组
    函数
    指针
    操作符和表达式
    语句
    数据
    TinyXML2 使用
    是否忘记了向源中添加“#include "StdAfx.h"”?
  • 原文地址:https://www.cnblogs.com/lishuangtu/p/8963594.html
Copyright © 2020-2023  润新知