首页 > 编程语言 >Python生成器

Python生成器

时间:2023-10-23 16:58:48浏览次数:43  
标签:推导 Python 生成器 yield next time print

Python生成器

1、什么是生成器

根据程序员制定的规则循环生成数据,当规则不成立时则生成数据结束。数据不是一次性全部生成出来的,而是使用一个,再生成一个,可以节约大量的内存

创建生成器的方式:① 生成器推导式 ② yield关键字

2、生成器推导式

# 创建生成器
# 生成器推导式 =》 (生成器推导式 数据生成规则)
my_generator = (i*2 for i in range(5))
print(my_generator)

image-20231019155020124

  • 本质是一个对象,其内部没有具体的数据,对象中保存了所有数据的生成规则

生成器中有一个关键的函数:next()

next(): 每调用一次,其就会根据生成器的数据生成规,创建一个元素,然后向下移动,再次调用next函数,则根据生成器的生成规则,再创建一个元素

# next获取生成器下一个的值
value = next(my_generator)
print(value)  # 0
value = next(my_generator)
print(value)  # 2

for 循环遍历

# 遍历生成器
for i in my_generator:
    print(i) # 0 2 4 6 8

生成器相关的函数:

next 函数获取生成器中的下一个值

for 循环遍历生成器中的每一个值

生成器的意义:

降低程序的能耗,加快程序的执行时间(因为其不需要存储大量的数据,只是在调用next( )时,才生成一个元素,所以能耗大大降低)

import time
import memory_profiler as mem

start = time.time()
print(f'生成器推导式程序执行前的内存情况:{mem.memory_usage()}')
nums = (i * i for i in range(10000000))
print(f'生成器推导式程序执行后的内存情况:{mem.memory_usage()}')
end = time.time()
print(f'生成器推导式程序执行的时间为{end - start}')

print('-' * 50)

start = time.time()
print(f'列表推导式程序执行前的内存情况:{mem.memory_usage()}')
numbers = [i * i for i in range(10000000)]
print(f'列表推导式程序执行后的内存情况:{mem.memory_usage()}')
end = time.time()
print(f'列表推导式程序执行的时间为{end - start}')

image-20231019163313191

3、yield生成器

yield生成器分为两部分:① 首先定义一个函数 ② 在函数的内部存在一个yield关键字

注意:yield生成器是一个对象而不是一个函数

重点:理解yield生成器的执行流程

# yield生成器 : ①函数 ② yield关键字

def generator(n):
    for i in range(1, n + 1):
        print('开始生成数据')
        yield i  # 有点类似函数return的功能
        # 每次调用生成器,遇到yield都会暂停,后一次next才会执行上一次yield后面的语句
        print('-' * 30)
        print(f'完成第{i}次数据的生成')


# 在使用时,由于生成器需要传递参数,所以通常将生成器赋值给某个变量
g = generator(3)
print(next(g))
print(next(g))
print(next(g))

# print(next(g))  # 输出第3次数据的生成,并报错

image-20231019170545011

  • 代码执行到 yield 会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
  • 生成器如果把数据生成完成,再次获取生成器中的下一个数据会抛出一个StopIteration 异常,表示停止迭代异常
# 在for 循环中,取数据的方法就是next()
for i in g:
    print(i)
  • for 循环内部自动处理了停止迭代异常,使用起来更加方便

4、yield与斐波那契数列

"""
斐波那契数列(fibonacci): 1,1,2,3,5,8,13...
前两个数都是1,从第三个数字开始,为其前两个数之和
解题关键:
a 代表数列挨着的前两位中的第一位
b 代表数列挨着的前两位的第二位
这里可以隐含第一位为0(在不违背斐波那契数列输出结果的另一种解决方法)
"""


def fib(max_num):
    # max_num参数 代表输出斐波那契数列的前多少位
    n, a, b = 1, 1, 1
    while n <= max_num:
        yield a

        a, b = b, a + b
        n += 1


g = fib(4)
for i in g:
    print(i)

标签:推导,Python,生成器,yield,next,time,print
From: https://www.cnblogs.com/luoluoange/p/17782814.html

相关文章

  • Python:深拷贝与浅拷贝
    python:深拷贝与浅拷贝一、了解几个概念变量:是一个系统表的元素,拥有指向对象的连接空间对象:被分配的一块内存,存储所代表的值引用:是自动形成的从变量到对象的指针类型:属于对象,而非变量不可变对象:一旦创建就不可修改的对象(值内存地址固定后不可以再修改其值),包括字符......
  • 栩栩如生,音色克隆,Bert-vits2文字转语音打造鬼畜视频实践(Python3.10)
    诸公可知目前最牛逼的TTS免费开源项目是哪一个?没错,是Bert-vits2,没有之一。它是在本来已经极其强大的Vits项目中融入了Bert大模型,基本上解决了VITS的语气韵律问题,在效果非常出色的情况下训练的成本开销普通人也完全可以接受。BERT的核心思想是通过在大规模文本语料上进行无监督预......
  • python通过脚本路径获取对应脚本里的内容
    importinspectfromimportlib.utilimportspec_from_file_location,module_from_specscript_path="test.py"spec=spec_from_file_location("test",script_path)module=module_from_spec(spec)spec.loader.exec_module(module)print(modul......
  • Day19_叠加多个装饰器_生成器_三元表达式_列表、字典、集合生成式_生成器表达式
    1.叠加多个装饰器运行顺序: 2.生成器的运行: 3..send()方法可以为yield传输返回值: 4..send()一个None相当于把None添加到yield后: 5..close关闭之后无法传值: 6.三元表达式: 7.列表生成式: 8.字典生成式: 9.集合生成式: 10.生成器表达式: ......
  • python 计算指定日期是今年的第几周和这个月的第几周
    Python当前时间是一年中第几周_python计算一年的第几周-CSDN博客以上感觉可能索引是从0开始ISO8601每个日历星期从星期一开始,星期日为第7天。第一个日历星期有以下四种等效说法:1,本年度第一个星期四所在的星期;2,1月4日所在的星期;3,本年度第一个至少有4天在同一星期内的星......
  • 《安富莱嵌入式周报》第321期:开源12导联便携心电仪,PCB AI设计,150M示波器差分探头,谷歌
     视频版:https://www.bilibili.com/video/BV1ju4y1D7A8/1、开源12导联便携心电仪https://voltagedivide.com/2017/10/14/psoc-design-and-implementation-of-a-12-lead-portable-ecg/这个开源有完整的上位机,下位机和原理图,并且有一个详细的设计论文。12导联心电图是心电图检查中常......
  • Python工具箱系列(四十四)
    使用py7zr对目录与文件进行压缩打包 7z是一种主流高效的压缩格式,它拥有极高的压缩比。在计算机科学中,7z是一种可以使用多种压缩算法进行数据压缩的档案格式。该格式最初被7-Zip实现并采用,但是这种档案格式是公有的,并且7-Zip软件本身亦在GNU宽通用公共许可证(GNULGPL)协议下开......
  • ubuntu20.04下源码编译python 3.12
    需要注意的地方 1.安装依赖:https://devguide.python.org/getting-started/setup-building/#build-dependenciessudoapt-getinstallbuild-essentialgdblcovpkg-config\libbz2-devlibffi-devlibgdbm-devlibgdbm-compat-devliblzma-dev\libnc......
  • 图书推荐与管理系统Python+协同过滤推荐算法+Django网页界面
    一、介绍图书管理与推荐系统。使用Python作为主要开发语言。前端采用HTML、CSS、BootStrap等技术搭建界面结构,后端采用Django作为逻辑处理,通过Ajax等技术实现数据交互通信。在图书推荐方面使用经典的协同过滤算法作为推荐算法模块。主要功能有:角色分为普通用户和管理员普通用户可注......
  • [924] f-strings in Python
    ref:f-stringsinPythonref:Python'sF-StringforStringInterpolationandFormattingF-strings,alsoknownasformattedstringliterals,areafeatureintroducedinPython3.6thatprovideaconciseandconvenientwaytoembedexpressionsinside......