• 迭代器


    1.什么是迭代器?

    迭代器即迭代取值的工具。

    迭代:迭代是一个重复的过程,每一次重复都是基于上一次的结果而来的。

    单纯的重复并不是迭代

    while True: # 并不是迭代,只是单纯的在重复打印。
    print('1111')

    迭代:
    l=['a','b','c']

    def iterator(item):
    i=0
    while i < len(item):
    print(l[i])
    i+=1
    iterator(l)

    2、 为什么要有迭代器
    基于索引的迭代取值方式只适用于列表、元组、字符串类型
    而对于没有索引的字典、集合、文件,则不在适用
    所以必须找到一种通用的并且不依赖于索引的迭代取值方式=》迭代器

    迭代器适用于可迭代的类型

    3.如何用迭代器:
    '''
    1、什么是迭代器
    迭代器即迭代取值的工具
    迭代:
    迭代是一个重复的过程,每一次重复都是基于上一次的结果而来的

    单纯的重复并不是迭代
    while True:
    print('1111')

    迭代:
    l=['a','b','c']

    def iterator(item):
    i=0
    while i < len(item):
    print(l[i])
    i+=1


    2、 为什么要有迭代器
    基于索引的迭代器取值方式只适用于列表、元组、字符串类型
    而对于没有索引的字典、集合、文件,则不在适用
    所以必须找到一种通用的并且不依赖于索引的迭代器取值方式=》迭代器

    迭代器适用于可迭代的类型

    3、如何用迭代器


    '''
    l=['a','b','c']
    i=0
    while i < len(l):
    print(l[i])
    i+=1

    l = ['a', 'b', 'c']
    s='hello'

    def iterator(item): #item='hello'
    i = 0
    while i < len(item):
    print(item[i])
    i += 1
    # iterator(l)
    iterator(s)


    可迭代的对象:在python中但凡内置有__iter__方法的对象都是可迭代的对象
    字符串、列表、元组、字典、集合、文件都是可迭代的对象
    num1=10
    num2=10.1
    s1='hello'
    l=[1,2,3]
    t=(1,2,3)
    d={'x':1}
    s2={1,2,3}
    f=open('a.txt','w')
    可迭代对象经过__iter__后得到的都是迭代器对象,本身就是迭代器对象的比如文件__iter__后还是迭代器对象,通常用于for循环
    整型,浮点型这些都是不可迭代的
    下面的几种类型都是可迭代的
    print(s1.__iter__)
    print(l.__iter__)
    print(t.__iter__)
    print(d.__iter__)
    print(s2.__iter__)
    print(f.__iter__)


    *****
    迭代器对象:指的是既内置有__iter__方法,又内置有__next__方法的对象
    执行可迭代对象的__iter__方法得到的就是内置的迭代器对象
    文件对象本身就是迭代器对象

    强调:
    1、迭代器对象一定是可迭代的对象,反之则不然(反之就是可迭代的对象都是迭代器对象:目前只有文件符合描述)



    info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}
    info_iter=info.__iter__() # info_iter 是迭代器对象
    # print(info_iter)

    res1=info_iter.__next__() # 迭代器对象可经过__next__方法调用值。
    print(res1)

    res2=info_iter.__next__() # 每使用一次__next__()就获得一个值
    print(res2)

    res3=info_iter.__next__()
    print(res3)

    res4=info_iter.__next__()
    print(res4) # (猜测)迭代器对象可以理解为可迭代对象经过__iter__()后变成了一个可以用__next__()进行迭代的迭代器

    info_iter.__next__() # 一旦迭代器取值取干净,再继续取就会抛出StopIteration



    info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}
    # info=[1,2,3,4,5]
    info_iter=info.__iter__() # 利用while循环对可迭代对象进行迭代取值。
    while True:
    try: # try except except是当遇到停止信号时循环会结束
    print(info_iter.__next__())
    except StopIteration: # StopIteration并不能完全看成报错,也是循环结束的一种信号
    break


    for循环:迭代器循环
    info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}
    in后跟的一定要是可迭代的对象
    for k in info: # info_iter=info.__iter__()
    print(k)

    f=open('a.txt','r')
    for k in f:
    print(k)


    迭代器对象:指的是既内置有__iter__方法,又内置有__next__方法的对象
    执行迭代器对象的__next__得到的是迭代器的下一个值
    执行迭代器对象的__iter__得到的仍然是迭代器本身*****

    iter_info=info.__iter__()
    print(iter_info)
    print(iter_info is iter_info.__iter__() is iter_info.__iter__().__iter__().__iter__().__iter__().__iter__())
    # 最终得到的还是迭代器对象


    总结迭代器对象的优缺点:
    优点:
    1、提供了一种通用的、可以不依赖索引的迭代取值方式
    2、迭代器对象更加节省内存
    f=open('movie.tar.gz','rb')
    f.__ next__()
    f=open('db.txt','rt',encoding='utf-8')

    print(f.__next__())
    print(f.__next__())
    print(next(f)) #f.__next__()

    s='hello'
    print(s.__len__())
    print(len(s))
    s.__iter__()
    print(iter(s))


    缺点:
    1、迭代器的取值不如按照索引的方式更灵活,因为它只能向前取不能往后退 *****
    2、无法预测迭代器值的个数
    可迭代对象和迭代器对象内置的__iter__() 和__next__()方法可以写成 iter()、next()
    names=['egon','alex_SB','wxx_SB']
    iter_names=iter(names) # -->> 得到一个迭代器对象 iter(names)
    print(next(iter_names)) # —>> 取迭代器对象的下一个值 next(iter_names)
    print(next(iter_names))

    iter_names=iter(names)
    print(next(iter_names))
    print(next(iter_names))
    # print(next(iter_names))

    print(names[1])
    print(names[1])



    s=set('helllllo')
    print(s)


    for i in 10:
    pass # 报错,in后面不是可迭代对象

    list(10) # 报错,里面应该是可迭代对象。如果是字典,则把key循环出来放在列表里

    names=['a','b','c','d']
    iter_names=iter(names)

    l1=list(iter_names) # list里面能放迭代器对象和可迭代对象,可迭代对象警告过iter方法可转变成迭代器对象。
    print(l1)

    l2=list(iter_names)
    print(l2) # 打印出来结果为空列表。没有重新生成迭代器对象

    ['a', 'b', 'c', 'd']
    []

    f=open(r'C:UsersLENOVOPycharmProjectsuntitled2db.txt','rt',encoding='utf-8')

    print(list(f)) # 第一个会打印出txt里内容,后面几个都是空列表。
    print(list(f))
    print(list(f))
    print(list(f))
    print(list(f))


    # 迭代器对象循环结束需要重新调用
    l1=[1,2,3,]
    diedaiqi=l1.__iter__()
    print(list(l1))
    print(list(l1))
    print(list(l1))
    print(list(l1))
    print(list(l1))
    print(list(l1))
    print(list(diedaiqi))
    print(list(diedaiqi))
    diedaiqi=l1.__iter__() # 需要重新生成迭代器对象
    print(list(diedaiqi))














  • 相关阅读:
    html pre 元素
    获取不重复随机数
    CSS查找匹配原理和简洁高效
    排序
    javascript 去数组重复项
    asp.net页面生命周期
    经典 Javascript 正则表达式
    深入理解JavaScript定时机制
    排序简介
    理解 JavaScript 闭包
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9173882.html
Copyright © 2020-2023  润新知