第4.2节 神秘而强大的Python生成器精讲

12.1、Python 大神之路:生成器深度解析,让你代码优雅又高效! 每次调用 fib_gen 生成器的 next() 方法(在 for 循环中会自动调用),函数会执行到 yield 语句,返回 a 的值,然后暂停。squares_generator 是一个生成器对象,它并没有立刻生成所有的平方数,而是在你遍历它的时候才逐个生成。区别就在于,列表推导式生成的是一个列表,而生成器表达式生成的是一个生成器对象。read_large_file 函数是一个生成器,它每次读取文件的一行,并使用 yield 返回。这样,即使文件很大,也不会一次性加载到内存中,而是逐行读取,节约内存。 阅读详情

一、 生成器(generator)概念
生成器是一个特殊的迭代器,它保存的是算法,每次调用next()或send()就计算出下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIteration。生成器有两种类型,一种是生成器表达式(又称为生成器推导),一种是生成器函数。

二、 生成器表达式
生成器表达式是通过一个Python表达式语句去计算一系列数据,但生成器定义的时候数据并没有生成,而是返回一个对象,这个对象只有在需要的时候才根据表达式计算当前需要返回的数据:

  1. 生成器表达式来源于迭代和列表解析(列表解析后面章节介绍)的组合,生成器和列表解析类似,但是它使用小括号而不是中括号。生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表;
  2. 生成器表达式的语法如下:
    (expr for iter_var in iterable)
    (expr for iter_var in iterable if cond_expr)
    其中:
    expr为计算 生成器元素值的表达式
    for iter_var in iterable iter_var:表示针对在可迭代对象iter_var中的每个元素进行表达式运算
    if cond_exp:表示可迭代对象中的元素需要满足指定条件才会参与表达式运算
  3. 说明
    1)直接在一对既有的小括号内(如在函数调用中)使用生成器表达式时,无需再添加一对小括号。例如:sum(i ** 2 for i in range(10));
    2)生成器表达式与列表解析的语法非常象,由于涉及部分相关的函数,在列表解析相关的章节老猿再回头介绍一下生成器表达式有关的内容。

三、 生成器函数
生成器函数是一种语句中包含yield关键词的特殊的函数,它本身是一个迭代器,外部需要访问该迭代器数据的代码通过调用next函数(或迭代器的__next__方法)或send方法,触发函数执行计算并通过yield返回一个计算结果数据,返回数据后该函数立即停止执行,函数状态会保存在本地变量中,直到外部下次调用再激活,从上次停止执行部分开始执行。
1、 关于生成器函数与调用方的执行过程解析

  1. 生成器函数定义示意代码(非可执行代码)如下:
    def fun():
    初始化
    循环:
    计算得到k
    nRet=yield k
    其他循环代码

上面代码示意表示:生成器函数运行时计算得到结果k通过yield返回数据k给调用方,返回k给调用方之后,生成器函数停止执行,yield的调用执行结果并没有返回给生成器函数, nRet的赋值也并没有执行,等待下次调用后,再返回yield本身的执行结果,并继续后续循环代码,直到再次执行yield。
老猿通过验证理解有几个细节在此说明一下:
a) yield函数的执行是一条语句,但实际执行时该语句被分解成两部分,第一部分是将计算结果k返回给send或next调用处(下称触发方),保存当前环境,暂停执行,另一部分就是恢复当前环境,返回yield本身的执行结果给生成器函数的调用处,并继续往下执行后续循环。每次调用yield时,除了第一次是从第一部分执行,后续都是从第二部分开始执行。
b) yield返回值(nRet记下来的值)在触发方为next(含__next__方法,下同)时,为None,如果触发方是send,则该值为send方法参数中的发送值;
c) 生成器函数在调用时只是生成一个生成器实例,并没有真正执行,真正执行只有第一次通过next触发时才会进入函数执行,注意第一次触发不能是send方式触发。
2) 调用生成器代码示意
def main():
初始化
f= fun()
next(f)
循环:
其他循环代码
nRet=send(x)
其他循环代码

上面代码示意表示:调用方执行自身初始化,然后进行生成器函数的初始化,然后执行循环迭代访问生成器函数的数据。
同样有几个细节老猿在此说明一下:
a) f= fun(),这个语句不会进入函数执行,只是生成一个生成器实例f
b) 第一个next调用只有循环代码中使用send触发时才需要,如果循环中用next则无需先执行一次send;
c) 第一个next执行时会触发调用生成器函数,从生成器第一行代码开始执行;后续的next或send执行,不再执行生成器函数的初始化部分,只是从yield的第二部分开始执行,第二部分执行时应该在生成器函数的循环迭代代码内,因此此后执行还是在生成器函数的循环代码内循环,直到遇到yield语句,执行完yield语句的第一部分逻辑挂起函数等待再次出发;
d) nRet记录的返回值就是生成器函数yield后面返回给触发方的数据。

2、 下面是一个老猿编写的模拟存快递包裹的生成器函数及其调用代码,每执行一次存包裹的函数就挂起,主程序等待确认是否继续循环,如果不继续则退出,代码如下:

import random

def PutPackage():
print(‘PutPackage start…’)
nRet = 123
while True:
if nRet<1 : break
print(‘PutPackage:Before Yield…’)
nRet = yield ’ PutPackage’+str(nRet) #返回字符串PutPackage+上次循环yield的返回值
print(‘PutPackage:After Yield, nRet=’,nRet)
if not nRet: continue

def mainf():
print(‘mainf start call PutPackage …’)
vPutPackage=PutPackage() #只是返回生成器generator对象
bBreak = False
print(‘mainf start call next …’)
nRet=next(vPutPackage) #生成器初始化
print(‘mainf end call next,nRet=’,nRet)
while True:
if bBreak:
try: #为什么要捕获异常?
vPutPackage.send(-1) #触发—1给生成器函数提示函数退出
except StopIteration:pass
break
print(‘mainf loop start call send …’)
nRet=vPutPackage.send(random.randint(10000,99999)) #产生一个随机包裹编号触发给生成器函数
print(‘mainf loop after call send ,nRet=’,nRet)
sConfirm=input(“是否准备结束存件取件循环(Y或y是,否则继续循环):”)
if sConfirm.strip().upper()==‘Y’:
bBreak=True
print("\n")

mainf()

执行结果如下,大家对照前面的执行过程解析理解一下:
mainf start call PutPackage …
mainf start call next …
PutPackage start…
PutPackage:Before Yield…
mainf end call next,nRet= PutPackage123
mainf loop start call send …
PutPackage:After Yield, nRet= 66468
PutPackage:Before Yield…
mainf loop after call send ,nRet= PutPackage66468
是否准备结束存件取件循环(Y或y是,否则继续循环):n
mainf loop start call send …
PutPackage:After Yield, nRet= 22204
PutPackage:Before Yield…
mainf loop after call send ,nRet= PutPackage22204
是否准备结束存件取件循环(Y或y是,否则继续循环):y

PutPackage:After Yield, nRet= -1

上述代码中为什么要捕获异常?这是因为最后一个send(-1)时,是从yield第二部分执行,执行到循环“if nRet<1 : break”语句就会终止循环,不会再通过yield向触发方返回值,此时send执行就会出现迭代结束的异常。
3、 生成器函数的其他说明

  1. Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这有利于节省内存,特别是生成器进行科学计算时很有用;
  2. 生成器就是迭代器,除了next方法外,也可以通过for循环来遍历出生成器中的内容;
  3. 生成器除了前面介绍的__next__、send方法外,还有throw、close方法:
    a) throw(type[, value[, traceback]]):该方法在生成器暂停的位置引发 type 类型的异常,并返回该生成器函数所产生的下一个值。 如果生成器没有产生下一个值就退出,则将引发 StopIteration 异常。 如果生成器函数没有捕获传入的异常,或引发了另一个异常,则该异常会被传播给调用者。该方法可以解决上面案例捕获异常的处理
    b) close():在生成器函数暂停的位置引发 GeneratorExit。 如果之后生成器函数正常退出、关闭或引发 GeneratorExit(由于未捕获该异常) 则关闭并返回其调用者。 如果生成器产生了一个值,关闭会引发 RuntimeError。 如果生成器引发任何其他异常,它会被传播给调用者。 如果生成器已经由于异常或正常退出则 close() 不会做任何事。通过触发方调用close方法可以直接关闭生成器,而不需要象上面案例一样在生成器函数内判断send发送的数据来进行退出。

本节是在老猿结合手头资料并做了大量测试的基础上整理出来的生成器的知识,特别是关于生成器函数的执行过程详细谈了老猿的理解,老猿没有找到相关资料进行对照核实,只是从测试的代码执行路径分析,希望是正确的,否则就误导大家。其实最好的办法是找到yield的源码进行分析,可惜老猿暂时没有安排,希望以后有机会详细读一下源码确认一下。
老猿Python(https://blog.youkuaiyun.com/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!

Linux双网卡设置IP属于同一网段的ping方法以及现象记录分析 文章目录前言ping以及MAC地址总结 前言 写在前面:经常遇到客户将板卡上的两个网络设备的IP地址设置为同一网段的情况,比如eth0:192.168.0.232,eth1:192.168.0.30. 我的解释是,不能设置为同一网段,或者使用其中一个时候下线另外一个网卡。但是我不知道这个说法到底是根据什么,查了很多资料也没找到明确的说法,但是下面这个实验能够说明一些现象的原因。 ping以及MAC地址 首先查看网卡的信息 ifconfig 因为两个网卡都在同一个网段,所以如果这个时候直接和我们的主机(I 阅读详情

相关推荐

【遥感数字图像处理(朱文泉)】第一章 数字图像基础

关于图像的定义、类型、模拟图像和数字图像

甜子yu的博客 4403

生成器python原理_Python生成器传参数及返回值原理解析

一.生成器简介在python中,带yield的方法不再是普通方法,而是生成器,它的执行顺序不同与普通方法.普通方法的执行是从头到尾,最后return返回,或者没有返回值生成器是到yield就返回yield之后的值,然后阻塞,等待next()/send()继续调起生成器二.next()/send()的异同:next()/send()都可以调起生成器next()只能调起生成器返回值,send()还可以...

weixin_39703773的博客 238

基于eBPF的零侵入LLM智能体观测:AgentSight架构与实战

在分布式系统和云原生架构中,可观测性是保障应用稳定运行与高效排障的核心能力。其原理在于通过日志、指标和追踪三大支柱,从外部视角持续收集和分析系统状态,而非依赖应用内部埋点。这一技术价值在于能以统一、低开销的方式,理解复杂系统的内部行为,尤其在微服务、容器化及Serverless等动态环境中至关重要。应用场景广泛覆盖了性能监控、安全审计、故障诊断与根因分析。当我们将这一基础理念应用于当下快速发展的AI智能体领域时,便自然引出了对LLM智能体进行无侵入、系统级行为观测的需求。传统的应用层方案需要集成SDK,对闭

weixin_28696185的博客 322

【Python】高级语法:推导式、迭代器、生成器、装饰器、上下文管理器

我辈李想:文章原创,转载时请务必加上、作者信息和本声明。

黎明总是如期而至 1533

保姆级教程:用Labelme标注车辆关键点,并一键转成YOLOv8-pose训练格式

本文提供了一份详细的车辆底盘关键点标注教程,从使用Labelme进行标注到一键转换为YOLOv8-pose训练格式的全流程指南。特别针对工业检测和自动驾驶场景,分享了标注规范、格式转换脚本及常见问题解决方案,帮助开发者高效准备训练数据并优化模型性能。

weixin_27419879的博客 306

别再为Word转PDF表格变形发愁了!Aspose.Words for Java 19.5 保姆级避坑指南

本文详细介绍了使用Aspose.Words for Java 19.5解决Word转PDF时表格变形问题的完整方案。从格式转换原理到实战技巧,涵盖固定表格宽度、禁用自动调整、强制文本换行等核心方法,并提供高级场景应对策略和性能优化建议,帮助开发者高效处理复杂文档转换需求。

weixin_28702105的博客 266

python中的生成器(generator)

生成器是 Python 中非常有用的一种数据类型,它可以让你在 Python 中更加高效地处理大量数据。函数里有了yield后,执行到yield就会停住,当需要再往下算时才会再往下算。所以生成器函数即使是有无限循环也没关系,它需要算到多少就会算多少,不需要就不往下算。python中的generator保存的是算法,真正需要计算出值的时候才会去往下计算出值。第一种方法:把一个列表生成式的[]改成(),就创建了一个generator。关键字,函数就变成了一个generator。第二种方式:在函数中使用。

sinat_31608641的博客 4187

把数据库算力拉满的 ABAP CDS Table Function:从语法、权限到可运行样例的全景解析

文章摘要: 本文针对ABAP开发者探讨了CDS Table Function的应用场景与实现细节。当CDS View无法处理复杂计算(如窗口函数、递归等)时,可通过Table Function将逻辑下推到HANA数据库执行。关键点包括:1)CDS实体声明与AMDP实现的协作关系;2)多租户环境下的Client处理机制(@ClientHandling.type注解);3)激活与传输的阶段性特点可能导致的"暂不可用"问题;4)基于SFLIGHT的完整示例,展示如何定义Client依赖函数、实

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 299

深入了解python生成器(generator)

生成器是 Python 中强大的工具,用于高效地处理大量数据或流数据。它们通过 `yield` 关键字生成值,保持函数状态,支持惰性求值,并且内存效率高。了解生成器的工作原理和用法,对于编写高效、可维护的 Python 代码至关重要。

Jesse_Kyrie的博客 757

lammps 案例in文件汇总

进阶案例: 聚乙烯和石墨烯界面pull out模拟代码 反应力场reax/c设置方法及案例解析 石墨烯热导率模拟代码(NEMD方法) 圆锥形SiC纳米磨削单晶硅源代码 高熵合金FeNiCrCoCu纳米压痕模拟代码 fix indent命令实现纳米摩擦及摩擦力计算 Fe原子辐照轰击多层石墨烯模拟代码 铝基石墨烯复合物压缩变形in文件源代码 石墨烯自动卷曲到Fe纳米线模拟源代码 铝/石墨烯复合物结晶过程lammps模

lammps_jiayou的博客 9445

RK3568 HDMI输出调试:分辨率切换与EDID解析

厂商信息(Vendor ID)显示器型号(Product ID)支持的分辨率列表色彩特性音频支持情况检查项方法HPD 信号EDID 读取当前模式TMDS 时钟PHY 状态。

小灰灰的博客 1481

python神秘招式图_第4.2节 神秘而强大的Python生成器精讲

一、生成器(generator)概念生成器是一个特殊的迭代器,它保存的是算法,每次调用next()或send()就计算出下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIteration。生成器有两种类型,一种是生成器表达式(又称为生成器推导),一种是生成器函数。二、生成器表达式生成器表达式是通过一个Python表达式语句去计算一系列数据,但生成器定义的时候数据并没有生成,而...

weixin_39641697的博客 120

让 PyCharm 代码“发光”:高亮插件与特效全攻略

PyCharm 作为一款强大的 Python IDE,支持多种插件让代码“发光”——无论是动态输入特效、彩虹括号,还是霓虹主题,都能让你的代码脱颖而出!进入 File → Settings → Editor → Color Scheme → Rainbow Brackets。进入 File → Settings → Appearance & Behavior → Material Theme。进入 File → Settings → Editor → Color Scheme → General。

qq_43580271的博客 3834

python生成器

转:第4.2节 神秘而强大的Python生成器精讲 Python生成器 生成器是一个特殊的迭代器,它保存的是算法,每次调用next()或send()就计算出下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIteration。生成器有两种类型,一种是生成器表达式(又称为生成器推导),一种是生成器函数。 生成器表达式 生成器表达式是通过一个Python表达式语句去计算一系列数据,但生成器定义的时候数据并没有生成,而是返回一个对象,这个对象只有在需要的时候才根据表达式计算当前需要返回的数据。

sunghosts的专栏 125

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

生成器函数与函数的区别

生成器函数严格意义来说只是一种形式象函数但世界为生成器的特殊类型,二者相同点如下: 1、二者的定义格式相同,都是使用def语句; 2、二者都可以有return语句,也可以没有; 3、二者的函数体格式相同。 差异点如下: 1、生成器函数中主要使用yield返回数据,而函数主要使用return返回数据; 2、二者返回值不同,函数可以根据需要返回任何类型,生成器函数执行返回的是一个生成器; 3、函数除非...

老猿Python 3318

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【趣味Python】从一个神秘的 Base64 字符串到开发专属随机头像生成器

本文介绍了如何基于Multiavatar开源库开发一个随机矢量头像生成器。文章从发现一段神秘的Base64字符串开始,解密了其背后的SVG头像生成原理,详细阐述了输入字符串通过SHA-256哈希转化为特定头像特征的过程。作者使用Python和PyQt6框架实现了一个桌面应用,包含实时预览、随机生成和导出PNG功能,解决了SVG转PNG的技术难点。该工具可生成独特的矢量头像,适用于项目开发和个人使用。文章还提供了完整的代码实现和GitHub项目链接。

weixin_42636075的博客 667

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深入解析Python生成器:从惰性求值到异步编程的基石

在Python编程中,迭代器是处理序列数据的核心概念,它通过实现`__iter__`和`__next__`方法,支持对集合元素的顺序访问。其背后的原理是惰性求值,即仅在需要时才计算和返回数据,这带来了显著的内存节省和无限序列表示能力。这一技术价值在于能够高效处理大规模数据流,避免内存溢出,并构建清晰的数据处理管道。在实际应用场景中,它常用于文件读取、数据转换和流式处理。本文聚焦于Python生成器,作为迭代器的一种优雅实现,通过`yield`关键字和生成器表达式,进一步简化了惰性序列的创建,并成为协程和异步

weixin_34326558的博客 385

第4章 基础知识进阶目录

第4.1节 Python基础概念之迭代、可迭代对象、迭代器 第4.2节 神秘而强大的Python生成器精讲 第4.3节 Python中与迭代相关的函数 第4.4节 Python解析与推导:列表解析、字典解析、集合解析 第4.5节 缩进、注释、文档字符串及标识符 第4.6节 print、import及断言 第4.7节 Python特色的序列解包、链式赋值、链式比较 第4.8节 三目运...

老猿Python 1642

推荐几个代码自动生成器_代码生成器(2),2024年最新现在做Golang开发有前途吗

机械的增删改查基础代码和界面功能,自由拖拽定制,面向零基础,拖拽式编程,赋能企业,前后端代码一键生成,能够有效的提升效率。AutoCoder自动代码生成器是一个根据模板自动生成代码的代码生成工具,根据模板的不同,可以生成任何语言(如:ASP、C#、C++BUILDER、DELPHI、JAVA、JSP、PHP、VB、。一个超级强大的代码生成器网站,这个代码生成器非常完善, java,php,python,nodejs都支持,前后端分离,翻页,联合查询都做了,当之无愧的代码生成器中的战斗机。

2401_84248479的博客 1006

Python面试题:神秘公司的挑战!

🎁 Python 中的装饰器是一种非常强大的功能,它可以在不修改函数代码的情况下,动态地增加功能或修改函数行为!装饰器本质上是一个函数,它接受一个函数作为输入,并返回一个新的函数。🧩 Python 中的元类是用来创建类的类,可以控制类的创建过程,并在类创建时对其进行修改或扩展。元类通常是继承自 type 类的自定义类,通过重写 __new__() 或 __init__() 方法来实现对类的定制。🔒 Python 中的闭包是指在函数内部定义的函数,并且内部函数可以访问外部函数的局部变量。

weixin_74169116的博客 582

Python控制流程盘点及高级用法、神秘技巧大揭秘!

在这篇文章中我们将全面深入地介绍 Python 的控制流程,包括条件语句、循环结构和异常处理等关键部分,尤其会将列表解析、生成器、装饰器等高级用法一网打尽。此外,我还将分享一些独特的见解和研究发现,希望能给你带来新的启发。文章的结尾,我们将有一个 "One More Thing" 环节,我会分享一个很特别但又很少人知道的有用的 Python 控制流程的技巧。

Gefangenes的博客 1302

探秘Python编程艺术:列表推导式与生成器表达式的魔法实践之旅

在Python的世界里,简洁高效的代码编写往往体现着开发者智慧的火花。列表推导式和生成器表达式正是这种智慧结晶的两种重要形式,它们赋予了Python无尽的魅力与强大功能。本文将带领读者揭开这两种高级特性的神秘面纱,详述其基本概念、常用方法,并通过实战应用演示其威力所在。最后,我们将一起探讨它们在复杂场景下的设计哲学与潜在价值。

guting18893110463的博客 1350

Python美学的三重奏:深入浅出列表、字典与生成器推导式

Python推导式以其简洁优雅的语法著称,包含列表、字典和生成器三种形式。列表推导式(如[i*i for i in range(10)])能高效创建新列表;字典推导式(如{word:len(word) for word in words})可快速构建字典;生成器表达式(如(i for i in range(1000000)))则通过惰性求值节省内存,适合处理大数据。三者都能结合条件过滤(if)和嵌套循环,让代码更清晰高效。选择时需考虑数据结构需求和内存限制,列表和字典推导式会立即生成结果,而生成器表达式按需

软件科学-郝学胜 1401
上一篇: 第4章 基础知识进阶 第4.1节 Python基础概念之迭代、可迭代对象、迭代器
下一篇: 第4.3节 Python中与迭代相关的函数
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值