zoukankan      html  css  js  c++  java
  • python 生成式和生成器

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # @Time   : 2017/10/17 21:46
    # @Author : lijunjiang
    # @File   : test.py
    
    """
    列表生成式
    
    一个用来生成列表的特定语法形式的表达式。可以对一组元素进行过滤或得到对列表元素进行处理后得到的结果
    可以快速的根据已存在的可迭代对象推导出一个新的list
    
    语法格式:
    [exp for val in collection if condition]
    执行过程:
    先对传入的列表进行for循环得到将符合条件的元素再进行if判断返回给exp
    执行exp表达式,最后将处理后的结果以列表的形式返回一个列表
    
    """
    tuple_test = [x*x for x in xrange(10) if x*x%2 == 0]
    print(type(tuple_test))
    print(tuple_test)
    # 执行结果:
    # <type 'list'>
    # [0, 4, 16, 36, 64]
    # 等价于
    tuple_test1 = []
    for i in xrange(10):
        if i*i%2 == 0:
            tuple_test1.append(i)
    print(type(tuple_test1))
    print(tuple_test1)
    # # 执行结果:
    # <type 'list'>
    # [0, 2, 4, 6, 8]
    
    """
    生成器
    在Python中,这种一边循环一边计算的机制,称为生成器
    生成器是按照某种算法不断生成新的数据,直到满足某一个指定的条件结束
    每次只生成一个元素,不必创建完整的list,从而节省大量的空间
    
    构造生成器的两种方式:
    
    1、使用类似列表生成式的方式生成 (2*n + 1 for n in range(3, 11)) 将生成式的[],换为()
    2、使用包含yield的函数来生成
    
    如果计算过程比较简单,可以直接把列表生成式改成generator;
    但是,如果计算过程比较复杂,就只能通过包含yield的函数来构造generator。
    """
    
    # 使用类似于列表生成式的方式来构造生成器
    print('使用类似于列表生成式的方式来构造生成器')
    print('generatot = (x*x for x in xrange(10) if x*x%2 == 0)')
    generatot = (x*x for x in xrange(10) if x*x%2 == 0)
    print(type(generatot))
    print(generatot)
    for i in generatot:
        print(i)
    
    print('使用包含yield的函数构造生成器')
    
    def func1():
        for i in xrange(10):
            if i*i%2 == 0:
                yield i*i
    generatot1 = func1()
    print(type(generatot1))
    print(generatot1)
    for i in generatot1:
        print(i)
    # 执行结果:
    # 使用类似于列表生成式的方式来构造生成器
    # generatot = (x*x for x in xrange(10) if x*x%2 == 0)
    # <type 'generator'>
    # <generator object <genexpr> at 0x0000000002BA1480>
    # 0
    # 4
    # 16
    # 36
    # 64
    # 使用包含yield的函数构造生成器
    # <type 'generator'>
    # <generator object func1 at 0x0000000002C2AF78>
    # 0
    # 4
    # 16
    # 36
    # 64
    """
    生成式和生成器的区别:
    生成式直接返回了表达式的结果列表, 
    生成器返回的是一个对象,该对象包含了对表达式结果的计算引用, 通过循环可以直接输出
    生成器不会一次性列出所有的数据,当你用到的时候,在列出来,更加节约内存的使用率。
    """
    
    """
    可迭代对象(Iterable)
    即可直接用于for循环的对象统称为可迭代对象(Iterable)。
    类型有:list、tuple、dict、set、str、生成器
    可以使用isinstance()来判断一个对象是否是Iterable对象
    
    迭代器(Iterator)
    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
    
    Python中的Iterator对象表示的是一个数据流,
    Iterator可以被next()函数调用被不断返回下一个数据,直到没有数据可以返回时抛出StopIteration异常错误。
    可以把这个数据流看做一个有序序列,但我们无法提前知道这个序列的长度。
    同时,Iterator的计算是惰性的,只有通过next()函数时才会计算并返回下一个数据
    http://www.cnblogs.com/yyds/p/6281453.html
    """
    # 实现99乘法表
    
    def func3():
        for i in xrange(1, 10):
            for j in xrange(1, i+1):
                print('{0}*{1}={2}'.format(j, i, i*j)),
            print('
    ')
    func3()
    
    #执行结果:
    # 1*1=1 
    # 
    # 1*2=2 2*2=4 
    # 
    # 1*3=3 2*3=6 3*3=9 
    # 
    # 1*4=4 2*4=8 3*4=12 4*4=16 
    # 
    # 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 
    # 
    # 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 
    # 
    # 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 
    # 
    # 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 
    # 
    # 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 
    
    
    
    
    
  • 相关阅读:
    JavaScript—— scroolleftoffsetleft 系列的含义以及浏览器兼容问题
    GCD
    Treap
    快速* 模板
    线性筛素数
    珂朵莉树
    One Night
    长整数相加运算(内含减法)。。= =
    骑士周游 非完美版。。= =
    《Windows取证分析》
  • 原文地址:https://www.cnblogs.com/lijunjiang2015/p/7782759.html
Copyright © 2011-2022 走看看