• python基础知识之生成器和列表生成器与迭代器


    生成器
    #生成器定义:@day4-n11-10min'''
    #生成器作用:节省内存,和提高效率,可以循环的同时生成需要的元素《按照一定的规则
    #将列表生成器的中括号改成小括号即可变成生成器,使用生成器器是没有生成这个数据的,只存储了一个算法,只有调用了它的时候它才真的按存的算法生成数据。
    #生成器不可再用列表的方式切片了
    '''**********************生成器小节:***************************
    1.只有在调用时才会生成相应的数据,它仅仅是储存了一个生成数据的算法。
    2.它只保留当前的值(前面的值它都丢掉了,因此节省了内存)
    3.只有2种调用方式
    #for循环调用(来迭代它)
    #__next__()下一步,进行算法里的下一个数据 #注意:python2.7 make 》next()#
    **************************************************************************'''
    #( i*2 for i range(100) )#最简单的生成器小括号里是算法

    #斐波那契数列:1,1,2,3,5,13,21,34,.....
    def fib(max):#斐波那契数列生成函数,max = "生成次数"
    n,a,b = 0,0,1
    while n < max:
    yield b #print()改成yield 就变成了一个生成器(generator),yield 是跳出循环返回当前的结果
    a,b =b, a + b
    n = n + 1
    return 'done'#当用__next__()执行完了则告诉你生成器的循环到头了,生成完了再next则返回一个异常信息为其返回值,当用for循环不会打印返回值。
    #print(fib(100))#打印出生成器内存地址
    #f = fib(10)
    #print(f.__next__())#调用一次
    #print(f.__next__())#调用一次
    '''yiedl 可以在单线程下实现并行效果,虽然仍然是串行的
    yield是保存当前状态跳出循环
    __next__()直接运行一次生成器
    send()向yield里传值并且带值运行一次生成器
    叫:协成'''

    '''**********yield的方式实现并行代码实例****************


    __author__ = "Alex Li"
    import time
    def consumer(name):
        print("%s 准备吃包子啦!" %name)
        while True:
           baozi = yield

           print("包子[%s]来了,被[%s]吃了!" %(baozi,name))

    c = consumer("ChenRonghua")
    c.__next__()

    # b1= "韭菜馅"
    # c.send(b1)
    # c.__next__()

    def producer(name):
        c = consumer('A')
        c2 = consumer('B')
        c.__next__()
        c2.__next__()
        print("老子开始准备做包子啦!")
        for i in range(10):
            time.sleep(1)
            print("做了1个包子,分两半!")
            c.send(i)
            c2.send(i)

    producer("alex")
    **************END************************'''

    '''迭代器

    可直接被for循环的对象称为可迭代对象iterable

    *可以被next函数调用并不断返回下一个值的对象称为迭代器:iterator*
    可以使用isinstance()判断一个对象是否是iterator对象,注意迭代器(iterator)和可迭代对象(iterable)的区别
    ——可迭代对象,不一定可以用__next__之类的方法进行操作。但是可以通过iter()函数转化成一个迭代器(interator)
    tip1:dir(对象)函数,可以看“对象”的可操作方法
    interator可以表示无穷大的数据流。而列表之类的是储存不这样的数据的。

    '''列表生成式:

    #列表生成式的实例
    a = []
    for i in range(10):
    a.append(i*2)
    print(a)

    num = [i*2 for i in range(10)]
    print(num)

    def func(num):
    num2=num*3
    return num2

    num = [func(i) for i in range(10)]
    print(num)
    #实例结束提醒#
  • 相关阅读:
    H53D旋转-遁地龙卷风
    Linux(CentOS 7)+ Nginx(1.10.2)+ Mysql(5.7.16)+ PHP(7.0.12)完整环境搭建
    CentOS 普通用户设置sudo权限
    CentOS 7 终端设置屏幕分辨率
    JavaScript 数组详解
    javascript 创建对象及对象原型链属性介绍
    Mac OS + Nginx + Mysql + PHP 本地环境搭建
    CocoaPods安装和使用教程
    Linux 下常用的压缩,解压方法
    启动 mysql 失败 Warning:The /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql'
  • 原文地址:https://www.cnblogs.com/home979/p/8033094.html
Copyright © 2020-2023  润新知