python学习第一天---生成器表达式

复习:

  迭代器和生成器

  迭代器:

    魔法方法__iter__()很少直接调用的方法,一般情况下是通过其他方法触发的

    可迭代的 -- 可迭代协议  含有__iter__的方法 __iter__ in dir(obj)

    迭代器协议: 含有__iter__ __next__方法

    迭代器一定可迭代,可迭代的通过调用__iter__方法就能得到一个迭代器

    迭代器特点:

      很方便使用,一个迭代器只能取所有的数据一次

      节省内存空间

  生成器(本质是迭代器):

    生成器的表现形式:

      生成器函数

        含有yield关键字的函数就是生成器函数

        特点:

          调用函数的时候函数不执行,返回一个生成器

          调用__next__()方法的时候会取到一个值

          知道取到最后一个之后,会抛出错误

def wahaha():
    for i in range(20):
        yield 'wahaha%s' % i

g = wahaha()
list(g) # 数据类型的强制转化(占内存) g.
__next__() # 每次执行就是从生成器中取值,预示着生成器函数中的代码继续执行 count = 0 for i in g: num += 1 if num > 50: break print(i)

        生成器中取值的几个方法:

          next

          for

          数据类型的强制转化 

     生成器函数进阶

      

def generator():
    print(123)
    yield 1
    print(456)
    yield 2
    print(789)  # 没有yield函数会继续执行,最后抛出错误

g = generator()
ret = g.__next__()
print(ret)
ret = g.send(None) # send的效果和next一样 ret
= g.__next__() print(ret) ret = g.__next__() print(ret)

def generator():
    print(123)
    content = yield 1
    print('====',content)
    print(456)
    yield 2
    print(789)  # 没有yield函数会继续执行,最后抛出错误

g = generator()
ret = g.__next__()
print(ret)
ret = g.send(‘hello’)  # send的效果和next一样
ret = g.__next__()  
print(ret)
ret = g.__next__()
print(ret)

# send的获取下一个值的效果和next基本一致,
# 在获取的下一个值得时候,给上一值的位置传递一个数据

    send的注意事项:

      第一次使用生成器的时候,是用的next获取第一个yield的值

      最后一个yield不能接受外部的值,

   

      

猜你喜欢

转载自www.cnblogs.com/cjj426890/p/9916927.html