• day11- python生成式和生成器


    列表生成式

    列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理。语法格式为:

    [exp for val in collection if condition]

    相当于

    result=[]
    for val in collection:
        if(condition):
            result.append(exp)
    例子:
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # @time: 2017/11/5 21:20
    # Author: caicai
    # @File: demon9.py
    #列表生产式
    li = [x*x for x in range(1,101) if x%2==0]
    print(li)
    
    #普通函数
    def funa():
        a = []
        for x in range(1,100):
            if x%2 == 0:
                a.append(x*x)
        return a
    print(funa())
    
    输出结果一致

    解释:

    1,  以此取出xrange(10)从0到9的数字

    2,  判断x*x是偶数,就保留,存在新的字典中

    3,  把所有符合x*x是偶数的元素都放到新的列表中返回

    通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

    所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。

    要创建一个generator,有很多种方法。第一种方法是把一个列表生成式的[]改成(),就创建了一个generator:

    例子:

    # 列表生成器
    #1.最简单的办法,把原来的生成式的[]换成()就ok
    lt = (x*x for x in range(1,101) if x%2==0)
    print(lt)
    print(lt.__next__())
    print(lt.__next__())
    print(lt.__next__())
    for i in lt:
        print(i)

    2、定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

    例子:

    #2.函数中定义列表生成器
    print('##############第二种方法##############')
    def fib(n):
        sum = 0
        i = 0
        while(i<n):
            sum = sum + i
            i+=1
            yield(sum)
    print(type(fib(10)))
    for x in fib(10):
        print(x)
    
    #列表生产式:一次性生成所有的数据,然后保存在内存中,适合小量的数据,
    #生成器:返回一个可迭代的对象,以及‘generator’对象,必须通过循环才可以一一列出所有的结果
    #可迭代对象:可以通过循环调用出来的,就是可迭代对象,如列表,元组,字典,生产式
    #迭代器:简单理解为生成器,必须通过next()函数调用并不断返回下一个值的对象称为迭代器。

    生成式和生成器二者的区别很明显:

    一个直接返回了表达式的结果列表, 而另一个是一个对象,该对象包含了对表达式结果的计算引用, 通过循环可以直接输出

    生成器不会一次性列出所有的数据,当你用到的时候,在列出来,更加节约内存的使用率。

    迭代器

    Iterable(可迭代对象)  和  Iterator(迭代器) 主要区别是 :

    凡是可以用 for 循环的 都是  Iterable(可迭代对象)   凡是需要通过next()函数获得值的可迭代对象都是 Iterator(迭代器)。

    (所以生成器可以 被next()函数调用并不断返回下一个值的对象称为迭代器 ) (可以简单理解为生成器 就是 迭代器的可迭代对象)

    凡是可作用于for循环的对象都是Iterable类型;

    凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

    学习例子

    函数表示9*9乘法口诀
    
    def pro():
        for i in range(1,10):
            for j in range(1,i+1):
                print("%d*%d=%d	" %(j,i,j*i)),
            print("
    ")
    print(pro())
    不要让以后的自己被嫌弃
  • 相关阅读:
    Spring中的@Transactional以及事务的详细介绍
    Shiro缓存使用Redis、Ehcache、自带的MpCache实现的三种方式实例
    使用shiro缓存用户身份信息的时候报:java.io.NotSerializableException: org.apache.shiro.util.SimpleByteSource
    rocketmq 延时消息
    用区块链技术做一个 不可被修改的 恋爱记录 app 我叫<<誓言>>
    java 调用区块链 发布和调用智能合约
    centos 以太坊多节点私链搭建
    数据库的死锁原因 和 处理办法
    聚簇索引
    Java 容易疑惑的一些杂记录
  • 原文地址:https://www.cnblogs.com/wxp997/p/7789137.html
Copyright © 2020-2023  润新知