zoukankan      html  css  js  c++  java
  • Python生成器

    生成器与列表生成式的区别

    列表生成式是根据生成式,将整个列表计算出来并填充到内存,以供程序使用。

    例如,以下的列表生成式会在内存中分配一段空间,并将生成的列表放到内存中,然后使l指向该列表。这样,如果我们需要的元素足够多,内存将会被占满。为了解决这个问题,python中可以使用生成器generator来提供所需要的元素。

    l = [x for x in range(10)]
    

    生成器是惰性计算的,可以将其理解为一种计算规则,python根据生成器的规则可以从第一个元素开始,不断计算出下一个符合规则的元素,而这些元素在没有被使用之前是不占用内存的,也就是说,生成器可以将所有符合规则的元素推导出来,相比列表生成式的可能需要无限大的内存,生成器无疑是很好的解决方案。

    最简单的生成器

    将列表生成式两侧的[]替换为(),就可以创建一个生成器了。

    g = (x*x for x in range(10))
    print("查看g的类型:")
    print(g)
    print("使用next()获取g的下一个元素")
    print(g.next())
    print(g.next())
    print(g.next())
    
    print("对g进行迭代")
    for i in g:
        print(i)
    print("迭代将会消耗所有的元素,所以下行会报错,因为已经没有继续可生成的元素了")
    print(g.next())
    

    查看g的类型:
    <generator object at 0x000001896F551900>
    使用next()获取g的下一个元素
    0
    1
    4
    对g进行迭代
    9
    16
    25
    36
    49
    64
    81
    迭代将会消耗所有的元素,所以下行会报错,因为已经没有继续可生成的元素了
    Traceback (most recent call last):
    File "c:Usersfocks.vscodeextensionsms-python.python-2020.2.64397pythonFilesptvsd_launcher.py", line 48, in
    main(ptvsdArgs)
    File "c:Usersfocks.vscodeextensionsms-python.python-2020.2.64397pythonFileslibpythonold_ptvsdptvsd_main_.py", line 432, in
    main
    run()
    File "c:Usersfocks.vscodeextensionsms-python.python-2020.2.64397pythonFileslibpythonold_ptvsdptvsd_main_.py", line 316, in
    run_file
    runpy.run_path(target, run_name='main')
    File "C:UsersfocksAppDataLocalProgramsPythonPython38lib unpy.py", line 263, in run_path
    return _run_module_code(code, init_globals, run_name,
    File "C:UsersfocksAppDataLocalProgramsPythonPython38lib unpy.py", line 96, in _run_module_code
    _run_code(code, mod_globals, init_globals,
    File "C:UsersfocksAppDataLocalProgramsPythonPython38lib unpy.py", line 86, in _run_code
    exec(code, run_globals)
    File "c:UsersfocksOneDrivelogpostPythoncode生成器.py", line 24, in
    print(next(g))
    StopIteration

    生成器函数

    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            # 当调用next()函数的时候,每当执行到yield便return一个值
            yield b
            # 下次再调用next()函数时,程序从yield后一句开始继续执行
            a, b = b, a + b
            n = n + 1
    
    f = fib(6)
    for i in f:
        print(i)
    

    1
    1
    2
    3
    5
    8

  • 相关阅读:
    mdx中nonempty 和 non empty的区别
    shrink log和查询数据库 backup,restore,shrink 进度 和 还原历史 的sql (for sqlserver)re
    方差分析 概述
    从 高斯 到 正态分布 到 Z分布 到 t分布
    数据集市 数据仓库 Immon Kimball模型的概念说明
    【React Native 实战】微信登录
    【React Native 实战】商品分类
    一步步学习PHP笔记(李炎恢瓢城web俱乐部-多用户留言系统)01
    wampserver下打开phpMyAdmin出现403错误的问题解决方法
    windows 支持curl命令
  • 原文地址:https://www.cnblogs.com/focksor/p/pythonGenerator.html
Copyright © 2011-2022 走看看