zoukankan      html  css  js  c++  java
  • python3 迭代器,生成器

    一 、什么是迭代
    1、 重复
    2、下次重复一定是基于上一次的结果而来
        while True:
            cmd=input(':')
            print(cmd)
    
    
        l=[1,2,3,4]
        count=0
        while count < len(l):
            print(l[count])
            count+=1

    二、 可迭代对象:obj.__iter__

    三 、迭代器:iter1=obj.__iter__()
    1 iter1.__next__
    2 iter1.__iter__

    iter1.__next__()
    iter1.__next__()
    iter1.__next__()

    迭代器:
    优点:
    1 不依赖索引
    2 惰性计算,节省内存

    缺点:
    1 不如按照索引的取值方便
    2 一次性,只能往后取,不能回退
        l=[1,2,3]
        for i in l: # obj=l.__iter__()
            print(i)
    

    迭代器的应用:
    1、提供了一种不依赖索引的统一的迭代方法
    2、 惰性计算,比如取文件的每一行

    list = [1,2,3,4,5]
    i = iter(list) #迭代器函数
    print(i.__next__())
    print(i.__next__())
    print(i.__next__())
    print(i.__next__())
    print(i.__next__())
    
    
    i = list.__iter__() #迭代器对象
    i.__next__()
    
    s1='hello'
    s1.__iter__()
    l=[1,2,3]
    l.__iter__()
    t=(1,2,3)
    t.__iter__()
    set1={1,2,3}
    set1.__iter__()
    d={'a':1,'b':2,'c':3}
    d.__iter__()
    
    
    f=open('db.txt',encoding='utf-8')
    print(f.__next__())

    生成器函数

    生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器

    def foo():
        print('first------>')
        yield 1
        print('second----->')
        yield 2
        print('third----->')
        yield 3
        print('fouth----->')
    
    g=foo()
    
    print(g)
    from collections import Iterator
    print(isinstance(g,Iterator))

    生成器就是迭代器

    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())


    for i in g:   #obj=g.__iter__() #obj.__next__()
    print(i)


    '''
    yield的功能:
    1.与return类似,都可以返回值,但不一样的地方在于yield返回多次值,而return只能返回一次值
    2.为函数封装好了__iter__和__next__方法,把函数的执行结果做成了迭代器
    3.遵循迭代器的取值方式obj.__next__(),触发的函数的执行,函数暂停与再继续的状态都是由yield保存的
    '''
    def countdown(n):
        print('starting countdown')
    
        while n > 0:
            yield n
            n-=1
        print('stop countdown')
    g=countdown(5)
    print(g)
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    
    for i in g:
        print(i)
    

     

    生成器函数补充:迭代器的特性,不能循环取值
    def countdown(n):
        while n > 0:
            yield n
            n-=1
    
    g=countdown(5)
    print(g.__next__())
    print(g.__next__())
    
    print('='*20)
    for i in g:
        print(i)
    
    print('*'*20)
    for i in g:
        print(i)
    
    
    
    for i in countdown(5):
        print(i)
    print('*'*20)
    for i in countdown(5):
        print(i)
    print('*'*20)
    for i in countdown(5):
        print(i)
    
    
    print(countdown(5).__next__())    #g才是迭代器
    print(countdown(5).__next__())
    print(countdown(5).__next__())
    print(countdown(5).__next__())
    print(countdown(5).__next__())
    print(countdown(5).__next__())
    print(countdown(5).__next__())
    print(countdown(5).__next__())
    print(countdown(5).__next__())
    print(countdown(5).__next__())
    print(countdown(5).__next__())
    print(countdown(5).__next__())
    
    
    
    print(countdown(5),countdown(5),countdown(5))
    

      

  • 相关阅读:
    同花顺黄金分割线及斐波那契数列分析网格(主图公式)
    走在城市计算的路上
    206. Reverse Linked List
    237. Delete Node in a Linked List
    876. Middle of the Linked List
    83. Remove Duplicates from Sorted List
    21. Merge Two Sorted List
    33. Search in Rotated Sorted Array
    852. Peak Index in a Mountain Array
    744. Find Smallest Letter Greater Than Target
  • 原文地址:https://www.cnblogs.com/lucaq/p/7050379.html
Copyright © 2011-2022 走看看