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

    迭代器部分

    一,可迭代对象

    对象内部含有__iter__ 方法

    可迭代对象满足可迭代协议

    print("__iter__" in dir(list))
    print("__iter__" in dir(str))
    View Code

    二,迭代器
    内部含有__iter__和__next__方法

    from collections import Iterable
    from collections import Iterator
    print(isinstance(str,Iterable))
    print(isinstance(str,Iterator))
    View Code

    迭代器特点
    1,迭代器可以直接取值,可迭代对象不能直接取值

    2,节省空间

    3,每次只能取一个值

    4,单向性,只能从前向后取值,取完值后再取值会报错

    while模仿for

    1,用__iter__方法将可迭代对象变成迭代器

    2,利用__next__取值

    3,利用异常处理停止报错

    a="hfaoofhajfajajfaj"
    b=a.__iter__()
    while 1:
        try:
            print(b.__next__())
        except StopIteration:
            pass
    View Code

    生成器部分

    生成器:自己通过代码写的迭代器,生成器的本质是迭代器

    一,函数生成器    将return换成yield

    return  结束函数,给函数执行者返回值

    yield   不会结束函数,把值返回给   生成器对象.__next__()

    生成器和迭代器的区别

    1,生成器可以定制

    2,内存的区别    迭代器是由可迭代对象转换成的,可迭代对象本身会占内存,而生成器是直接创建,不需要转化,从本质上节省内存

    def func():
        for i in range(1000):
            yield(i)
    a = func()    #函数不会执行,生成生成器函数对象
    for i in range(50):
        print(next(a))
    View Code

    send 和 next
    1,send跟next的执行一样,给生成器函数对象取值

    2,send可以给上一个yield传值,在用send取值的时候,第一次取值,必须用next(没有yield接受值),最后一个yield永远得不到send的传值

    def func():
        a=3
        f=yield a
        print(f)
        b=4
        yield b
    o=func()
    print(next(o))
    print(o.send("hello"))
    View Code

    二,生成器表达式
    1,列表推导式

    循环模式   [变量(加工后的变量) for 变量 in 可迭代对象] 

    筛选模式  [变量(加工后的变量) for 变量 in 可迭代对象  if条件]

    生成器表达式,将列表推导式的[ ]换成()就是生成器表达式

    对于数据比较小的用列表表达式,数据很大的用生成器表达式

    字典推导式

    集合推导式

  • 相关阅读:
    倒计时模块(获取的是服务器上的时间——适合购物网站的抢购模块)
    javascript 双色球选号器
    最短AJAX创建代码
    poj2387 Til the Cows Come Home
    POJ2236 Wireless Network
    HDU2102 A计划
    HDU2028 Lowest Common Multiple Plus
    HDU2612 Find a way
    HDU1495 非常可乐
    UVa10603 Fill
  • 原文地址:https://www.cnblogs.com/ruoxiruoxi/p/9502357.html
Copyright © 2011-2022 走看看