• (三)3-5 Python生成式和生成器


    生成式和生成器

    列表生成式是Python最受欢迎的语法之一,通过间接的语法可以对一组元素进行过滤,还可以对元素处理,格式为[exp for val in collection if condition]
    相当于:

    result = []
    for val in collection:
        if (collection):
            result.append(exp)

    例如:

    a = [x * x for x in xrange(10) if x*x%2 ==0]
    print(type(a))
    print(a)

    运行结果:

    <type 'list'>
    [0, 4, 16, 36, 64]

    注:1、以此取出xrange(10)从0到9的数字
    2、判断x*x是偶数,保留存在新的列表中
    3、把所有符合x*x是偶数的元素都放到新的列表中返回
    使用普通函数实现:

    def fun():
        list = []
        for x in xrange(1,10):
            if x%2 ==0:
                list.append(x*x)
        return list 
    print(fun())

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

    lt = (x*x for i in range(1,10) if x%2 ==0)
    print(lt)
    print(lt)
    for i in lt:
        print(i)

    运行结果:

    <generator object <genexpr> at 0x00000000025CDD80>
    4
    16
    36
    64

    注:gengerator 保存的是算法,每次调用next(),就计算出下一个元素的值,知道计算到最后一个元素为止。
    生成器是一次生成一个值的特殊函数,调用该函数返回一个可用于生成连续x值的生成器generator,在函数执行过程中,yield语句会把需要的值返回给调用生成器的地方,然后退出函数,下一次调用生成器函数又从上次中断的地方开始执行,而生出去内的所有参数都会被保存下来供下一次使用。

    第二种方法:如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
    在了解这个方法之前,我们先看一个例子

    def fib(n):
        sum = 0
        i = 0
        while(i<n):
            sum +=i
            i +=1
            print(sum)
    fib(5)

    运行结果:

    0
    1
    3
    6
    10

    使用yield可以改写为:

    def fib(n):
        sum = 0
        i = 0
        while(i<n):
            sum +=i
            i +=1
            yield sum
    for x in fib(5):
        print(x)
    print(type(fib(5)))

    运行结果:

    0
    1
    3
    6
    10
    <type 'generator'>

    上面2种方式结果一样,包含yield语句的函数会被特地编译成生成器,当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口,每当遇到yield关键字的时候,函数的return语句,yield后面的值就是返回的值。但是不像一般的函数在return后退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态,在函数恢复时再度有效,下次yield下面的部分开始执行。


    生成器和生成式的区别
    两者之间的区别:一个直接返回表达式的结果列表,二另一个是对象,该对象包含了对表达式结果的计算引用,通过循环可以直接输出
    生成器不会一次性列出所有的数据,当你用到的时候,在列出来,更加节约内存的使用率
    生成式:一次性生成所有数据,然后保存在内存中,适合小量数据
    生成器:返回一个可以迭代的对象,及“generator”对象,必须通过循环才可以意义取出所有的结果
    可迭代对象:可以通过循环调用出来的就是可迭代对象。

    迭代器
    iterable(可迭代对象)和iterator(迭代器)主要区别:
    凡是可以用for循环的都是iterable(可迭代对象)
    凡是需要通过next()函数获得值的可迭代对象都是iterator(迭代器)
    生成器就是迭代器的可迭代对象

    ——————————————————————————————————————————————————

    练习:用函数实现9*9乘法口诀 

    #!/usr/bin/env python 
    #coding:utf8
    import  codecs
    def write_file(res):
        with codecs.open("9_9.txt","ab") as fd :
            fd.write(res)
    def get_9_9():
        for i in range(1,10):
            # print(i)
            for j in range(1,i+1):
                print  "{0} * {1} = {2} ".format(j,i,i*j),
                res = "{0} * {1} = {2} ".format(j, i, i * j)
                # print res
                write_file("{0}".format(res))
            print
            write_file("
    ")
    if __name__ == "__main__":
        get_9_9()

    运行结果:

    保存文件9_9.txt内容:

  • 相关阅读:
    ARM Linux 3.x的设备树(Device Tree)
    ubuntu 14.04 编译内核出现unable to locate package ncurses-devel 问题的解决
    Device Tree Usage( DTS文件语法)
    Ubuntu 14.04中gedit打开文件出现中文乱码问题
    Jenkins中集成jmeter-maven插件
    Linux(centos6.5)下安装jenkins
    IM系统架构设计之浅见
    一些常用软件的网络端口协议分类介绍
    Jenkins执行批处理文件失败
    八大持续集成工具
  • 原文地址:https://www.cnblogs.com/pythonlx/p/7780718.html
Copyright © 2020-2023  润新知