Python学习基础笔记二十二——生成器

news2024/11/15 19:47:30

一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。

def generator():
    print(1)
    return 'a'


ret = generator()
print(ret)

只要含有yield关键字的函数都是生成器函数。

1)yield只能写在函数里;

2)yield不能跟return共用;

def generator():
    print(1)
    yield 'a'


ret = generator()
print(ret)

结果:

生成器函数:执行之后会得到一个生成器对象作为返回值。

def generator():
    print(1)
    yield 'a'


ret = generator()
print(ret)

print(ret.__next__())

结果:

再看:

def generator():
    print(1)
    yield 'a'
    print(2)
    yield 'b'


g = generator()
print(g)

ret = g.__next__()
print(ret)
ret = g.__next__()
print(ret)

结果:

如果再加ret = g.__next__() print(ret)代码,就会发生溢出。会出现迭代器取不到的时候,有stopIteration的错误提示。

我们可以看到函数内部的执行,是受外部控制的。通过yield和__next__两者来对函数进行控制。

def generator():
    print(1)
    yield 'a'
    print(2)
    yield 'b'


g = generator()

for i in g:
    print(i)

既然有__iter__和__next__,那么我们可以使用for循环来管理。

那我们现在看例子:

def hello():
    for i in range(2000000):
        yield 'hello %s' % i


g = hello()

for i in g:
    print(i)

背后的原理是:这边生产一个,然后就给你一个打印,边生产边打印,这样就不会一下子在内存中产生大量的数据。不是一次性将所有的数据都生成出来,然后再提供给你。这样,就需要大量的内存空间。数据越存越多,越到后面,程序需要去找内存,非常麻烦。

如果只想打印50个:

def hello():
    for i in range(2000000):
        yield 'hello %s' % i


g = hello()

count = 0
for i in g:
    count  += 1
    print(i)
    if count > 50:
        break

# print(g.__next__())

for i in g:
    count  += 1
    print(i)
    if count > 100:
        break

这个应该有一个位置记录,迭代的过程中记录下一个位置。下一个for循环就从下一个位置开始获取值。

l = [1, 2, 3, 4, 5]

for i in l:
    print(i)
    if i == 2:
        break

for i in l:
    print(i)

这个例子里说for循环,是生成了一个迭代器。然后for循环结束之后,第二个for循环,迭代器又从头开始执行。

看一个工厂生产衣服的例子:

def produce():
    """生产衣服"""
    for i in range(2000000):
        yield "生产了第%s件衣服"%i

product_g = produce()
print(product_g.__next__()) #要一件衣服
print(product_g.__next__()) #再要一件衣服
print(product_g.__next__()) #再要一件衣服
num = 0
for i in product_g:         #要一批衣服,比如5件
    print(i)
    num +=1
    if num == 5:
        break

#到这里我们找工厂拿了8件衣服,我一共让我的生产函数(也就是produce生成器函数)生产2000000件衣服。
#剩下的还有很多衣服,我们可以一直拿,也可以放着等想拿的时候再拿

一个函数可以监听文件的输入:

def tail(filename):
    f = open(filename, encoding='utf-8')
    while True:
        line = f.readline()
        if line.strip():
            yield line.rstrip()


g = tail('log')
for i in g:
    if 'python' in i:
        print('hello', i)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/61466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微机原理与接口技术:数模转换和模数转换 详细笔记

文章目录1.数模转换1.1.数模转换原理1.1.1.权电阻D/A转换器1.1.2.R-2R T型电阻网络D/A转换器1.1.3.补充 D/A转换器的主要技术指标1.2.D/A转换芯片——DAC08321.2.1.引脚介绍1.2.2.工作方式直通输入方式单缓冲方式双缓冲方式2.模数转换2.1.信号变换中的采样、量化和编码2.1.1.采…

『NLP学习笔记』TextCNN文本分类原理及Pytorch实现

TextCNN文本分类原理及Pytorch实现 文章目录一. TextCNN网络结构1.1. CNN在文本分类上得应用1.2. 回顾CNN以及Pytorch解析1.2.1. CNN特点1.2.2. 一维卷积Conv1d1.2.3. 二维卷积 Conv2d1.2.3. 三维卷积 Conv3d1.2.4. 池化(pooling)操作1.2.4. nn.BatchNorm操作1.3. nn.ModuleLi…

大数据之数据的压缩与存储

文章目录前言一、Hive的压缩方式(一) 概念(二) 简介(三) 数据分层的压缩方式选择(四)开启Map输出阶段压缩(五)开启Reduce输出阶段压缩二、 Hive的数据存储格式…

再有人问你kafka 把这篇扔给他(建议收藏)

前言 最近重新读起kafka的内容,看到kafka官网文档里,有专门一栏讲kafka的设计,觉得很受益。我们常常会知道这个中间件是什么,是什么机制,这次想换个角度来聊,它在设计消息系统的时候,都做了哪些…

火山引擎虚拟数字人技术与应用

导读:火山引擎正在打造完善的虚拟数字人技术和应用体系,那么火山引擎是如何定义虚拟数字人的呢?火山引擎 2D 虚拟数字人和 3D 数字人采用了怎样先进的技术?火山引擎数字人有哪些应用和前景展望?今天我们就来一起探秘火…

【Transformer】Transformer理论知识

Transformer目录Transformer介绍Seq2seq结构Encoder结构Decoder结构Autoregressive Decoder(AT):Encoder和Decoder对比和联系Cross attention:Non-autoregressive Decoder(NAT):训练Seq2seq Mod…

基于ssm高校档案管理系统源码

档案管理作为企事业单位管理工作的基础,档案是企事业单位建设信息系统的重要组成部分,档案是提高企事业单位工作质量和工作效率的必要条件,甚至是维护历史真实面貌的一项重要工作。 1、档案信息数字化能够提供档案信息方便快捷的服务方式。 数…

量化风控的贷前实操课—详解的规则调优

风控全流程涉及贷前风控、贷中监控、贷后催收,每个模块都环环相扣,互相关联。而作为其中最关键模块的贷前风控,几乎是整个风控模块中最重要的部分,现金贷等互金产品重贷前、信用卡重贷中。 贷前风控是可以说整个防控中的第一道防线…

简单的CNN实现——MNIST手写数字识别

0.概述 此文章不涉及复杂的理论知识,仅仅只是利用PyTorch组建一个简单的CNN去实现MNIST的手写数字识别,用好的效果去激发学习CNN的好奇心,并且以后以此为基础,去进行一些改造。(前提是把基础代码看明白) 本…

java计算机毕业设计ssm社团管理系统0gl2e(附源码、数据库)

java计算机毕业设计ssm社团管理系统0gl2e(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。…

Android Room的使用详解

Android Room的使用详解 一:Room的基本介绍 Room 是 Android 架构组件的一部分,Room 持久性库在 SQLite上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。具体来说,Room 具有以下优…

【Linux Kernel 6.1 代码剖析】- 进程管理概论

目录 进程与线程的概念(内核线程和用户线程) 进程的3种基本状态 引入挂起后的7种基本状态 Linux 内核6.1 - 进程的8种详细状态 进程控制块 PCB SMP 架构 进程与线程的概念(内核线程和用户线程) 进程是正在运行的程序实体&a…

基于java+ssm+vue+mysql的旅游管理系统

项目介绍 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多企业的之中,随之就产生了“旅游信息管理系统”,这样就让旅游信息管理系统更加方便简单。 对于本旅游信息管理系统的设计来说&…

QDir(目录)

QDir 类提供对目录结构及其内容的访问,QDir 用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统,它也可以用来访问Qt的资源系统。 Qt使用“/”作为通用目录分隔符,就像URL中的“/”用作路径分隔符一样。如果您始终使用“/”作为…

2022年大一学生实训作业【基于HTML+CSS制作中华传统文化传统美德网站 (6页面)】

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

【YOLOv7/YOLOv5系列算法改进NO.47】改进激活函数为GELU

文章目录前言一、解决问题二、基本原理三、​添加方法四、总结前言 作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列…

SparkSQL - 介绍及使用 Scala、Java、Python 三种语言演示

一、SparkSQL 前面的文章中使用 RDD 进行数据的处理,优点是非常的灵活,但需要了解各个算子的场景,需要有一定的学习成本,而 SQL 语言是一个大家十分熟悉的语言,如果可以通过编写 SQL 而操作RDD,学习的成本…

ARM汇编之程序状态寄存器传输指令

ARM汇编之程序状态寄存器传输指令前言 首先,请问大家几个小小问题,你清楚: CLZ指令的常见使用场景;状态寄存器访问指令有哪些? 今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是…

[附源码]Python计算机毕业设计SSM金牛社区疫情防控系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]JAVA毕业设计老年人健康饮食管理系统(系统+LW)

[附源码]JAVA毕业设计老年人健康饮食管理系统(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项…