软件测试升职加薪必看系列:自动化测试Python进阶(八)

Android T GPS 定位流程 Gps 定位 阅读详情

Python进阶8

迭代器和生成器

python的迭代协议

引言

  • 迭代器是访问集合内部元素的一种方式,一般用来遍历数据。
  • 迭代器和用下标索引访问的方式不一样,迭代器是不能返回值的
  • 迭代器提供了一种惰性访问数据的方式,需要的时候才产生数据。
  • 可迭代类型都实现了迭代协议,实际上就是__iter__()这个魔法函数。

可迭代类型和迭代器

前面讲过,collections.abc模块中定义了很多内置的抽象基类,现在我们重点关注其中的两个:Iterable 和 Iterator

Iterable

image

里面定义了一个抽象方法,__iter__(),也就是说某个类只要实现了这个魔法函数,它就是可迭代的类型

Iterator

image

首先,Iterator继承了Iterable,在它的基础上,又增加了一个抽象方法:__next__(),它是用来让迭代器获取下一个元素。

小结

可迭代类型和迭代器并不一样,前者只需要实现__iter__()函数,而对后者而言,__next__()才是它的核心。

比如list类型,它是一个可迭代类型,但并不是一个迭代器。

a = [1, 2, 3]
print(isinstance(a, Iterable), isinstance(a, Iterator))

# result:
# True False

补充

在魔法函数那一小节,我们讲过这样一个例子:

class Language(object):
    def __init__(self, language_list):
        self.lans = language_list
        
    def __getitem__(self, item):
        return self.lans[item]

language = Language(["Python", "C", "Lisp"])
for lan in language:
    print(lan)

# result:
# Python
# C
# Lisp

在Language这个类中,我们定义的是__getitem__这个魔法函数,然后对这个类产生的实例我们可以使用for来遍历元素了。也就是说它成为了一个可迭代类型,但它并没有实现刚才我们讨论的__iter__()函数。

这是因为,在Python内部,很多地方做了兼容处理,当我们是用for进行迭代遍历,解释器首先会寻找__iter__()函数,如果没有,它就会退一步去寻找__getitem__(),这个是序列类型中会实现的一个魔法函数,只要它接收从 0 开始的整数为参数,这个对象也是会被当做可迭代类型的。

实际上,仅仅满足了可迭代类型还不够,真正能进行迭代取值的是迭代器。通过iter()函数,我们可以返回一个可迭代对象的迭代器,有了它才能进行迭代取值。

class Language(object):
    def __init__(self, language_list):
        self.lans = language_list
        
    def __getitem__(self, item):
        return self.lans[item]

language = Language(["Python", "C", "Lisp"])
my_iterator = iter(language)

print(my_iterator)

# result:
# <iterator object at 0x000002043CEE4F28>

如果我们不实现__iter__()或__getitem__(),获取迭代器的过中会出错

class Language(object):
    def __init__(self, language_list):
        self.lans = language_list

language = Language(["Python", "C", "Lisp"])
my_iterator = iter(language)

print(my_iterator)

# result:
# TypeError: 'Language' object is not iterable

有了迭代器,迭代取值需要另外一个函数next(),每调用一次,就会返回一个值,直到抛出一个迭代结束的异常。

class Language(object):
    def __init__(self, language_list):
        self.lans = language_list
        
    def __getitem__(self, item):
        return self.lans[item]

language = Language(["Python", "C", "Lisp"])
my_iterator = iter(language)

print(next(my_iterator))
print(next(my_iterator))
print(next(my_iterator))
print(next(my_iterator))

# result:
# Python
# C
# Lisp
# StopIteration

上面的结果已经很接近直接使用for进行迭代了,但是,依赖__getitem__()函数,底层还是隐藏了很多细节,如果我们想纯粹地通过__iter__()来实现迭代过程,要怎么做呢?

__iter__()用来返回一个迭代器,通过这个迭代器来迭代取值,对应显示调用iter()的逻辑。

__next__()用来让迭代器取下一个值,对应显示调用next()的逻辑。

使用for的时候,这两个魔法函数会被自动调用,完成迭代取值过程。

from collections.abc import Iterator

class MyIterator(Iterator):
    def __init__(self, data_list):
        self.iter_list = data_list
        self.index = 0
    
    def __next__(self):
        # 这里是通过记录索引,单次取值达到迭代目的
        # 更好的方式是通过生成器来进行迭代取值
        try:
            data = self.iter_list[self.index]
        except IndexError:
            raise StopIteration
        self.index += 1
        return data

class Language(object):
    def __init__(self, language_list):
        self.lans = language_list
        
    def __iter__(self):
        return MyIterator(self.lans)
        

language = Language(["Python", "C", "Lisp"])
for lan in language:
    print(lan)
    
# result:
# Python
# C
# Lisp

生成器函数使用

引言

  • 函数里面只要存在yield关键字,它就是生成器函数
  • 生成器是惰性计算的一个关键

使用案例

def gen_func():
    yield "MetaTian"
    
def func():
    return "MetaTian"
    
gen, res = gen_func(), func()
print(gen)
print(res)

# result:
# <generator object gen_func at 0x000001B102C3C0F8>
# MetaTian

for val in gen:
    print(val)
    
# result:
# MetaTian

第一个函数返回的是一个生成器对象,它是一个可迭代类型,因此,可以通过for进行访问。

def gen_func():
    yield 1
    yield 2
    yield 3
    
gen = gen_func()
for val in gen:
    print(val)
    
# result:
# 1
# 2
# 3

生成器的原理

Python中函数工作原理

对于编译型语言,函数的调用会维持一个函数调用栈,某个函数执行完成后,它就会被出栈处理,也就是说,函数执行后,它的生命周期就结束了。

对于Python这样的解释型语言,函数的调用也要依赖栈结构,但是,函数对象是存放在堆内存中的,也就意味着,一个函数被调用执行了,它还在那儿。

什么是堆内存和栈内存?

解释器用一个叫做PyEval_EvalFrameEx的C函数来执行Python程序。对于一个Python中的函数,解释器接受一个栈帧(stack frame)对象,并在这个栈帧的上下文中执行Python字节码,完成函数调用。在字节码执行中,如果遇到了要调用其他函数的指令,解释器会创建一个新的栈帧用来执行新调用的函数。

生成器+函数

def gen_func():
    yield 1
    name = "MetaTian"
    yield 2
    
    return "done"

在Python将函数编译为字节码时,如果遇到yield关键字,它就知道这是一个生成器函数,内部会做一个标记。当我们调用这个函数的时候,解释器看到这个标记后就会创建一个生成器,而不是去运行它,后续函数的执行交给生成器控制。

这个生成器内部有两个东西,一是对栈帧的引用,二是函数字节码的引用。栈帧中有一个指针,指向最近执行的那条指令,因为执行到和yield有关的字节码后,函数会停止执行,相当于打了个断点,同时将yield后面的值返回。通过next(),可以让函数继续执行(因为生成器也是迭代器),直到遇到下一个yield。

生成器对象也是分配在堆内存中的,也就是说,只要我们在程序运行的任何地方拿到了这个对象,都可以用它来控制函数的执行。这也是后面携程的一个理论基础。

重构自己的可迭代类型

引言

  • 前面将Language这个类,构建成为了我们自定义的一个可迭代类型。
  • 生成器也是迭代器,通过使用生成器,可以更简洁地达成目的。
from collections.abc import Iterator


def gen_func():
    yield "MetaTian"
    
gen = gen_func()
print(isinstance(gen, Iterator))

# result:
# True

使用案例

class Language(object):
    def __init__(self, language_list):
        self.lans = language_list
        
    def __iter__(self):
        i = 0
        try:
            while True:
                val = self.lans[i]
                yield val
                i += 1
        except IndexError:
            return
    
language = Language(["Python", "C", "Lisp"])
for lan in language:
    print(lan)
    
# result:
# Python
# C
# Lisp

总结

这里再来回顾一下前面讲过的内容,使用for遍历的时候,首先会看作用对象是否为一个可迭代类型,如果是,那么会隐式调用__iter__(),得到一个迭代器对象,有了它,再隐式调用__next__()来不断获取下一个元素,直到遇到一个停止迭代的异常。我们也可以通过内置的两个函数iter()和next()来人工干预迭代的过程。

在Language类中,__iter__()内部加入了一个生成器的逻辑,结合前面的生成器函数,可以知道,遇到yield语句后,会产生一个生成器对象,由它来控制这个函数的后续执行。

因为生成器也是迭代器,所以__next__()的逻辑对它同样适用,每次 next 都会在__iter__()函数中的while循环中不断取值,直到抛出一个IndexError,迭代结束,__iter__()函数结束,for逻辑完成。

如果大家对于学习Python有任何问题,学习方法,学习路线,如何学习有效率的问题,可以随时来咨询我,或者缺少系统学习资料的,我做这行年头比较久,自认为还是比较有经验的,可以帮助大家提出建设性建议,这是我的Python交流qun:785128166,有任何问题可以随时来咨询我。

生成器读取大文件

引言

  • 有一个数据文件,大小为 10GB
  • 数据只有一行,行中有特殊的分隔符,现在需要剔除分隔符,获得每一个被分隔的元素。
比如,数据文件长这样:
dj134o0kgfdkjfkdjfk<end>'6823sdkfslkfsldkfj'<end>sdkfslfjyerojskfj<end>...

<end> 是其中的分隔符

实现过程

def extract(f, sep):
    buff = ""
    
    while True:
        block = f.read(1024*4)
        if not block:   # 没读到内容,说明读到尾部了
            yield buff      # 上次留下来的内容
            break
        
        buff += block
        while sep in buff:
            cut = buff.index(sep)   # 定位
            yield buff[:cut]    # 分隔符前的一个元素
            buff = buff[cut + len(sep)]     # 跳过分隔符和前面的元素


with open("data.txt") as f:
    for line in extract(f, "<end>"):
        print(line)
Altera下载器驱动配置:手把手教程(从零实现) 详解Altera USB-Blaster驱动安装全过程,从设备识别到软件配置一步一图,解决常见连接问题,确保开发下载器正常工作,适合初学者快速上手FPGA下载调试。 阅读详情

相关推荐

从CST到AD:高效PCB阵列设计与介质优化实战

本文详细解析了从CST电磁仿真软件到Altium Designer(AD)的PCB阵列设计全流程,重点解决毫米波天线等精密设计中模型导出、介质优化和阵列构建的核心难题。通过实战技巧,指导工程师高效处理DXF文件导入、复杂铜皮填充、空气介质实现等关键步骤,确保高精度设计从仿真到制造的顺利转换,提升工作效率与设计可靠性。

weixin_28256233的博客 439

Python3报错TypeError: '***' object is not iterable

首先看一下这个报错信息“TypeError: '***' object is not iterable”,意思是说:“类型错误:'***'对象不可迭代”。 首先了解一下什么事迭代。 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。...

weixin_44316575的博客 9万+

高通平台camera构架sensor驱动详解

优先阅读。

a5566255的专栏 3249

个人报错TypeError: ‘type‘ object is not iterable

django报错 ‘type’ object is not iterable,个人报错原因解析 E:\django_project\my_blog\article\models.py changed, reloading. Watching for file changes with StatReloader Exception in thread django-main-thread: Traceback (most recent call last): File "E:\Python\Python

人无远虑,必有近忧. 1万+

基于扩展卡尔曼滤波(EKF)结合到达时间(TDOA)、到达频率(FDOA)实现多无人机无源定位,MATLAB代码

该程序实现了一种结合到达时间差(TDOA)和到达频率差(FDOA)技术的多无人机定位方法,利用扩展卡尔曼滤波(EKF)对单一目标进行定位。程序通过模拟多无人机的运动及其与目标的相对位置,估计目标的状态(位置和速度)。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 1265

XDS110 USB Debug Probe连接错误-260:CCS Theia环境下的诊断与修复指南

本文详细解析了CCS Theia环境下XDS110 USB Debug Probe连接错误-260的诊断与修复方法。从硬件连接到驱动状态、固件更新到软件配置,提供了全面的排查指南,帮助开发者快速解决这一常见的调试器通信障碍问题,确保嵌入式开发工作流畅进行。

hope8的博客 281

python入门系列:迭代器和生成器

python的迭代协议 引言 迭代器是访问集合内部元素的一种方式,一般用来遍历数据。迭代器和用下标索引访问的方式不一样,迭代器是不能直接返回值的。迭代器提供了一种惰性访问数据的方式,需要的时候才产生数据。可迭代类型都实现了迭代协议,实际上就是iter()这个魔法函数。可迭代类型和迭代器 前面讲过,collections.abc模块中定义了很多内置的抽象基类,现在我们重点关注其中的两个:Iterab...

weixin_33920401的博客 137

YOLOv8改进 | 主干网络 | 将主干网络替换为轻量化的ShuffleNetv2【原理 + 完整代码】

yolov8,yolov8创新,yolov8改进

kay_545 2563

spyder3中运行结果出现generator object <genexpr> at 0x0000017BEBAB46D8

在spyder3中输入print((i) for i in range(1, 10) if i % 2 == 0) 出现结果<generator object <genexpr> at 0x0000017BEBAB46D8> 原因是: print((i) for i in range(1, 10) if i % 2 == 0)生成了一个迭代器( python gene...

芒果summer小仙女 1万+

在 SAP BTP ABAP 环境里直连 ABAP On-Premise OData

摘要 SAP BTP ABAP Environment 2311版本后,OData集成链路迎来重大改进:Service Consumption Model升级为v2版本,通过压缩模型到单一类减少对象数量;通信管理推荐采用Communication Arrangement替代传统Destination,提供更清晰的治理边界。新版支持同时生成OData v2/v4消费模型,并通过标准工厂类创建代理。配置需关注四层对象:Outbound Service声明协议入口,Scenario定义认证方式,System描述通

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

YOLO26剪枝 lamp剪枝测试精度仅掉0.7个点,速度提高11.8fps!

针对没有如何去选择剪枝的内容LAMP是层自适应幅度调整剪枝,无需任何参数,通过算法内部自己计算每个层的重要程度进行剪枝。基于权重重要程度和该层权重大小关系,权重越大表明该层越重要的思想进行优化。这个跟我前面说的非结构化全局剪枝是一个解法(MP),也就是lamp是在我前面那个非结构化剪枝的基础上进行优化的。但是这个逐层进行非结构剪枝目前还没有一个清晰的概念,确定每个层要剪枝多少。LAMP得分是一个平方权重大小,由层中所有“幸存权重”的总和归一化。

m0_64661770的博客 673

Python 出现错误TypeError: ‘NoneType' object is not iterable解决办法

TypeError: 'NoneType' object is not iterable  这个错误提示一般发生在将None赋给多个值时。?12345def myprocess():    a == b       if a != b:                          return True, value; flag, val = myprocess()  在判断语句中,当if条...

qq_41984637的博客 6万+

机器视觉应用工程师职位深度解析与面试指南

广东奥普特科技招聘机器视觉应用工程师,要求大专以上理工科专业背景,熟悉C/C++或PLC编程,具备自动化设备调试经验。岗位职责包括视觉项目方案评估、系统安装调试、售后技术支持及异常处理,需接受外派出差。该职位面向专业对口的应届生或实习生,强调动手能力、沟通技巧和吃苦耐劳精神。机器视觉工程师需掌握图像处理算法、硬件配置等核心技术,在工业自动化领域具有良好发展前景。求职者应注重编程能力和实践经验的积累,以胜任这一技术密集型岗位。

郑伟强dev的专栏 431

软件测试升职加薪必看系列:自动化测试Python进阶(三)

Python进阶3 深入类和对象 鸭子类型和多态 引言 在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。 例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭子的对象,并调用它的走和叫方法。 在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的走和叫方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名...

测试小小小的博客 320

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Statistics and Machine Learning Toolbox

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

软件测试升职加薪必看系列:自动化测试Python进阶(一)

Python进阶1 Python中一切皆对象 引言 Java语言也是面向对象的语言,但是Python要更加彻底 Python的面向对象特性,是它使用起来灵活的根本所在 对象的特点 可以赋值给一个变量 # 函数也是对象 def test(name): print(name) my_func = test # 注意 只写函数名 和 函数名加括号 的区别 my_func("MetaTian") # 打印:MetaTian 可以添加到集合中去 def plus

测试小小小的博客 261

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

软件测试升职加薪必看系列:自动化测试Python进阶(二)

Python进阶2 魔法函数 引言 魔法函数是Python中定义的,以__开头,__结尾,形如__func__()的函数,一般使用已经存在的魔法函数即可。 使用这样一些函数,可以让我们自定义的类有更加强大的特性。 魔法函数是隐式调用的,不需要我们显示调用。 class Language(object): def __init__(self, language_list): self.lans = language_list # 如果要遍历所有的语言,可以:

测试小小小的博客 332

深度学习工具包 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")

紧急通知,错过这次机会,升职加薪将等到三个月之后

俗话说:"不积跬步无以至千里,不积小流无以成江海”,坚持做正向的事情,慢慢积累,你当下的每一步都是未来的基石和铺垫。在软件测试的职业生涯中也是如此,在工作中坚持做正向积累,你终会到达你想要的那个目标!

YJT1002的博客 884

软件测试升职加薪必看系列:自动化测试Python进阶(十)

Python进阶10 多线程 python中的GIL GIL(Global Interpreter Lock),就是一个锁。 Python中的一个线程对应于 C语言 中的一个线程。 GIL使得同一时刻只有一个线程在一个cpu上执行字节码,无法将多个线程分配到多个cpu上进行同步运行。如果在单核cpu上,线程是并发运行,而不是并行。 image 首先,这样效率不高,但是看似也不会产生数据访问冲突的问题,毕竟同一时刻只有一个线程在一个核上运行嘛,然而: sum = 0 def add(

测试小小小的博客 380

软件测试升职加薪必看系列:自动化测试Python进阶(六)

Python进阶6 对象引用、垃圾回收、可变性 Python中的变量是什么 引言 Python和java中的变量本质不一样,java的变量可以理解为一个盒子,用来容纳我们的对象,使用前要先声明它,好分配给我们合适的内存空间。Python的变量可以理解为一个标签,先构造出对象,再将变量贴在对象上。 Python变量没有类型,对象才有,本质上是指针。同一个变量,可以表示不同对象。 使用案例 """ a 和 b 都贴在了同一个对象上 """ a = [1, 2] b = a a.append(6

测试小小小的博客 266

软件测试升职加薪必看系列:自动化测试Python进阶(七)

Python进阶7 元类编程 Python属性函数 引言 Python中我们对于自己设置的类,尽量要使其属性私有化,获得更好的封装性。 如果要访问和修改私有属性,要为其设置set和get方法。 Python中,可以使用特殊的装饰器将set和get方法属性化,这样就能够使用更简洁的语法去调用这些方法。 使用案例 class Person: def __init__(self, name, age): self.__name = name self._

测试小小小的博客 334

软件测试升职加薪必看系列:自动化测试Python进阶(五)

Python进阶5 深入Python的set和dict dict常用操作 引言 clear(): 清空字典 copy(): 返回一个浅拷贝 fromkeys(): 将可迭代对象中的每一个元素作为key和同一个value拼成字典 get(): 根据key返回value,若无对应的键值对,则返回None,也可以指定默认返回值,和索引访问相比,不会产生异常。 items():返回一个dict_items类型,支持迭代,键值对以元组形式组织 setdefault(): 获取key对应的valu

测试小小小的博客 395

软件测试升职加薪必看系列:自动化测试Python进阶(四)

Python进阶4 自定义序列类型 序列类型的分类 按照序列存储数据的类型 容器序列:list, tuple, deque 扁平序列:str, bytes, array.array, bytearray 按照序列是否可变 可变序列:list, deque, array.array, bytearray 不可变序列:str, tuple, bytes 序列的abc继承关系 引言 collections.abc模块中有很多内置的抽象基类 序列主要和两个抽象基类有关:Sequence和..

测试小小小的博客 354

软件测试升职加薪必看系列:自动化测试Python进阶(九)

Python进阶9 Python socket编程 引言 sockets的历史悠久,它们最早在 1971 年的 APPANET 中使用,后来成为1983年发布的Berkeley Software Distribution(BSD)操作系统中的API,称为Berkeley sockets。 Web服务器和浏览器并不是使用sockets的唯一程序,各种规模和类型的客户端 - 服务器(client - server)应用程序也得到了广泛使用。 今天,尽管socket API使用的底层协议已经发展多年

测试小小小的博客 280

❤️程序人生 | 为什么越来越多的人用Python来做自动化测试?

这段时间网上很流行一句话: 让自己变得更好,才是解决一切问题的关键。 也许你还从来没想过: 如果现在失业,你的存款能够支撑你多久的日常生活,它能应付哪种级别的风险,例如失业、破产、裁员、意外…… 其实生活中有很多“照妖镜”,让你能清楚地看到自己有几分抗风险能力。 可能一场疫情让你处于两难的境地,谁又能保证明天会不会发生些什么。很多时候,你处于岁月静好的生活中,其实暗流涌动,崩塌只在旦夕之间。 而一个真正强大的人,是永远不会停下学习这件事的。因为他知道,落后就意味着被淘汰,这是永恒不变.

2354

学了就能升职加薪?大厂软件测试面试必问的自动化测试框架你真会了吗?

最近我注意到了一个现象,就是每年一到3、4月左右的时候,就会有一大批粉丝朋友来咨询我跳槽、面试这块的问题。

软件自动化测试技术交流、资源分享 101

大厂软件测试面试必问的“自动化测试框架”你真的会了吗?功能测试人备战2022升职加薪最新攻略

做测试这几年来,我注意到了一个现象,就是每年一到12月份左右的时候,就会有一大批粉丝朋友来咨询我跳槽、面试技巧等这方面的问题。

软件自动化测试技术交流、资源分享 193
上一篇: 软件测试升职加薪必看系列:自动化测试Python进阶(七)
下一篇: 软件测试升职加薪必看系列:自动化测试Python进阶(九)
测试小小小
博客等级 码龄6年 265粉丝 364原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值