zoukankan      html  css  js  c++  java
  • 玩转迭代器和生成器

    1.迭代器

    一、迭代器的概念

     迭代器即迭代的工具,那什么是迭代呢?

    迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值
    # 比如
    while True:
            print('你好,你是谁')
    # 上面这个不是迭代器,单纯的循环不是迭代器的体现
    
    
    # 先定义一个列表
    ls = [1,2,3,4,5]
    
    count = 0
    
    while count < len(ls):   # 这里才是迭代的表现
            print(ls[count])
            count +=1

    二、迭代器怎么使用?可迭代对象和迭代器对象是什么?

    # 迭代器应该怎么使用呢?
    # 在我们学过的数据类型中,字符串、列表和元组都是有序的数据类型,对于有序的数据类型,我们通常通过索引来取值;然而,对于字典,集合和文件类型来说,它们都是无序的,所以不能够通过索引来取值,因此,对于迭代器来说,他就是不依赖索引来取值的。
    
    # 那么什么又是可迭代对象呢?
    # 可迭代对象有以下的特点:就是他的内置功能中存在__iter__()方法,类似于obj.__iter__().列如:
    
    'strnaem123'.__iter__()
    [1,2,3,4,5].__iter__()
    (1,2,3,4,5).__iter__()
    {'a':1,'b':2}.__iter__()
    open('user.txt').__iter__()
    
    # 那么什么是迭代器对象呢?
    # 类似于可迭代对象来说,可迭代对象的迭代结果就是迭代器对象,因此,迭代器对象中既存在可迭代对象的方法__iter__(),也存在__next__()方法。列如:
    
    open('user.txt').__iter__()
    open('user.txt').__next__()
    
    # 所以说,可迭代对象不一定是迭代器对象,但是迭代器对象百分之百是可迭代对象,毋庸置疑的存在。

    三、使用迭代器的案列

    # 定义一个字典,本身是一个可迭代对象
    dic = {'a':1,'b':2,'3':3}
    
    info = dic.__iter__()   # 得到的是迭代器对象,但是对于迭代器来说,对于迭代器来说使用__iter__()就是迭代器的本身了。
    
    
    print(info.__next__())
    print(info.__next__())
    print(info.__next__())
    print(info.__next__())  # 首先在定义字典中本身就存在三个值,在经过上面的迭代器对象的方法后,这里继续取值就睡报错了
    
    
    # 我们通过抛出异常来处理报错
    while True:
          try:
                mm= info.__next__()
                print(dic[mm])
          Exception:
                break
    
    #  但是如果每次都这样的话,我就很烦,对于程序员懒惰的群体来说,这太复杂了,必定会寻求简单的方法,取而代替。
    
    
    # 那就是for循环了
    ls = {'a':1,'b':2,'c':3}
    
    for k in ls:
        print(ls[k])  # 这样就会很简单了

    四、使用迭代器的优缺点

    # 优点:可以不依赖索引进行取值
    # 缺点:不能够计算数据的长度,不能根据索引进行取值(只能从前往后依次进行取值)

    五、生成器

    # 什么是生成器?
    # 只要在定义的函数里出现了yeild关键字,那么这个函数的返回就是一个生成器,也不会执行函数里的代码。
    # 列如:
    def my_range(min, max=0, step=1):
        if max == 0:
            min, max = max, min
        tag = min
        while True:
            tag += step
            if tag >= max:
                break
            yield tag
    
    
    # range_obj = my_range()
    # print(range_obj.__next__())
    # print(range_obj.__next__())
    # print(range_obj.__next__())
    
    for i in my_range(10):
        print(i)
     
  • 相关阅读:
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    落忆枫音(我们终将成为”枫音乡的过客“)
    PID221 / 烦人的幻灯片☆ x
    codevs 5971 打击犯罪 x
    洛谷 P2330 [SCOI2005] 繁忙的都市 x
  • 原文地址:https://www.cnblogs.com/wanglei957/p/10649218.html
Copyright © 2011-2022 走看看