zoukankan      html  css  js  c++  java
  • python函数知识四 迭代器、生成器

    15.迭代器:工具

    1.可迭代对象:

    ​ 官方声明,只要具有__iter__方法的就是可迭代对象

    list,dict,str,set,tuple -- 可迭代对象,使用灵活

    #方法一:
    list.__iter__()
    dict.__iter__()
    
    #方法二:
    查看源代码
    
    #方法三:
    print(dir(list))
    #官方声明,只要具有__iter__方法的就是可迭代对象
    
    
    2.迭代器:

    官方声明:只要具有__iter__方法__next__方法就是迭代器

    f = open("",'w')
    f.__iter__()
    f.__next__()
    

    将可迭代对象,转换成迭代器

    lst = [1,2,3,4,6]
    new_lst = lst.__iter__()#将可迭代对象,转换成迭代器
    
    new_lst.__iter__()
    new_lst.__next__()
    print(new_lst.__next__())#每次获取一个值,第一次获取第一个值,以后向后推
    
    #自己写 for i in lst(): print(i)
    lst = [1,2,3,4,6]
    count = len(lst)
    new_lst = lst.__iter__()
    while count:
        print(new_lst.__next__())
        count -= 1
     #for的本质
    lst = [1,2,3,4,6]
    new_lst = lst.__iter__()
    while 1:
        try:
           print(new_lst.__next__())
        except:
            break
    
    3.总结:

    ​ 可迭代对象:

    ​ 优点:使用灵活,可以直接查看值

    ​ 缺点:占内存,不能迭代值

    ​ 迭代器:

    ​ 优点:节省内存,惰性机制

    ​ 缺点:使用不灵活,操作较繁琐,不能直接查看元素

    迭代器的特性:

    1. 一次性的(用完就没有了)
    2. 不能后退
    3. 惰性机制(节省内存)

    可迭代对象:具有__iter__()方法的

    可迭代器:具有__iter__()方法和__next__()方法的

    迭代器的使用时机:当容器中数据量较多的时候使用迭代器

    16.生成器:

    迭代器:python中内置的一中节省空间的工具

    生成器的本质就是一个迭代器

    生成器与迭代器的区别:

    ​ 迭代器:python自带

    ​ 生成器:程序员写的

    写一个生成器:

    ​ 将函数中的return改写成yield就是一个生成器,return和yield都是返回:

    1. return和yield都是返回
    2. return和yield都可以写多次
    3. return只执行一次,yield可执行多次
    4. 一个next对应一个yield,会记录停留的位置。超出会报错

    g = func()#产生一个生成器

    ​ 生成器可以使用for循环取值

    ​ yield from -- 将可迭代对象的元素逐个返回

    ​ 在函数内部,yield能将for循环和while循环进行暂停

    def func():
        print(123)
        yield "你好"
        print(321)
        yield "我好"
    print(func())
    #结果:<generator object func at 0x000001913911F0A0>
    g = func()
    g.__inter__()
    print(g.__next__())
    
    #会记录停留的位置
    def func():
        if 3 > 2:
            yield "你好"
        if 4 > 2:
            yield "我好"
        yield "大家好"
    g = func()
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    '''
    结果:
    你好
    我好
    大家好
    '''
    
    #for 循环
    for i in g:
        print(i)
    

    坑:会产生新的生成器

    #每次都是新的生成器
    print(foo().__next__())
    print(foo().__next__())
    #用赋值只产生一个生成器
    g = foo()
    
    def foo():
        for i in range(10):
            pass
        yield i
        count = 1
        while 1:
            yield count
            count += 1
    g = foo()
    #print(next(g))  = print(g.__next__()) --推荐使用next(g)
    print(next(g))
    print(next(g))
    print(next(g))
    #next可以在while中停住
    '''
    结果:
    9
    1
    2
    '''
    

    seed() -- 了解

    #send()第一次只能传None,用于激活,否则会报错,以后可以传各种数据
    def func():
        a = yield "send激活"
        print(a)
        b = yield "send开始"
    g = func()
    print(g.send(None))
    print(g.send(123))
    

    生成器应有场景:

    #当有大量的数据时
    def func():
        lst = []
        for i in range(1000000):
            lst.append(i)
        return lst
    print(func())
    #生成器改进
    def func():
        for i in range(1000000):
            yield i
    g = func()
    for i in range(50):
        print(next(g))
    

    yield from -- 将可迭代对象逐个返回

    def func():
        list1 = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
        yield from list1  #yield list1 会直接返回整个列表
    g = func()
    print(next(g))
    print(next(g))
    '''
    结果:
    牛羊配
    老奶奶花生米
    '''
    
    def func():
        list1 = ["牛羊配","老奶奶花生米","卫龙","虾扯蛋","米老头","老干妈"]
        lsit2 = ["小浣熊","老干爹","亲嘴烧","麻辣烫","黄焖鸡","井盖"]
        yield from list1
        yield from list2
    g = func()
    #将lsit1返回完,才会返回list2
    print(next(g))
    print(next(g))
    print(next(g))
    

  • 相关阅读:
    HDU 4069 Squiggly Sudoku
    SPOJ 1771 Yet Another NQueen Problem
    POJ 3469 Dual Core CPU
    CF 118E Bertown roads
    URAL 1664 Pipeline Transportation
    POJ 3076 Sudoku
    UVA 10330 Power Transmission
    HDU 1426 Sudoku Killer
    POJ 3074 Sudoku
    HDU 3315 My Brute
  • 原文地址:https://www.cnblogs.com/Onlywang/p/11218929.html
Copyright © 2011-2022 走看看