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

    一、生成器简介(generator)

    在进行较大数据的存储,如果直接存储在列表之中,则会可能造成内存的不够与速度的减慢,因为列表创建完是立即创建并存在的,而在python中生成器(generator)能够很大程度上解决这个问题,生成器并不一开始直接创建所有的数据,而是进行一种"惰性的运算",即创建的时候,我们创建的只是一个生成器的对象,里面记录的是方法,而没有生成数据,可以使用特殊的方法,进行随用随取,并且生成器只能遍历一遍。

    1、创建生成器

     第一种:表达式

    g=(x**2 for x in range(1,10))
    print(g) #<generator object <genexpr> at 0x0000022898B6C0F8>

    第二种:使用了 yield 的函数被称为生成器(generator)。
    def foo():
    print('ok1')
    yield 1
    print('ok2')
    yield 2
    return None

    2、调用生成器
    第一种:for循环遍历
    for i in g:
    print(i) #1 4 9
    for i in foo():
    print(i)

    第二种:s.__next__()方法或者next(s):
    print(g.__next__())  #1
    print(next(g)) #4 (常用写法)
    print(g.__next__()) #9

    3、装饰器send的使用:就是交互给yield前面的赋值,交互作用(要先next进去)
    def foo():
    print('ok1')
    count=yield 1
    print(count) #交互,打印123
    yield 2
    # return None

    b=foo()
    next(b)
    b.send('123')

    4、简单的例子:消费者生产者小程序

    import time
    def consumer(name):
    print('%s 准备吃包子了'%name)
    while True:
    baozi=yield #接收做的包子
    print('包子%s来了,被%s吃了'%(baozi,name))

    def producer(name):
    c=consumer('A')
    c2=consumer('B')
    next(c)
    next(c2)
    print("%s开始做包子了"%name)
    for i in range(10):
    time.sleep(1)
    print('做了两个包子')
    c.send(i) #做的包子传给消费者
    c2.send(i) #做的包子传给消费者
    producer('chen')

    二、迭代器
    1、迭代器简介

      迭代器是一个可以记住遍历的位置的对象。

      迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

      迭代器有两个基本的方法:iter() 和 next()

      字符串,列表或元组对象都可用于创建迭代器。

      生成器都是迭代器,迭代器不一定是生成器。

  • 相关阅读:
    linux安装skype
    (转)程序员最应该读的图书
    Smarty 学习笔记六 缓存
    Smarty 学习笔记二 常用内置变量
    Smarty 学习笔记七 debug
    文本文件与二进制文件区别
    zz 通用线程:Awk 实例,第 2部分
    MIT墙上的格言
    AWK学习笔记
    zz SED单行脚本快速参考 以及 AWK版本
  • 原文地址:https://www.cnblogs.com/chenxiaozan/p/12154197.html
Copyright © 2011-2022 走看看