Python零基础从小白打怪升级中~~~~~~~生成器和迭代器

第十七节:生成器和迭代器

一、迭代器

本质: 一个实现了__iter__方法和__next__方法的对象

注意 Iterator对象和 Iterable对象,一个是迭代器,一个是可迭代对象

1、list、dict、str、tuple、set是可迭代对象但不是迭代器;

2、可迭代对象可以转为迭代器,for循环会自动转换成迭代器。或者调用iter函数

3、如果把所有数据丢到列表中 可以 优点 速度快 缺点 列表占内存太大,如果使用迭代器申请固定的空间也就是一个个的拿出来, 能节约内存,但是浪费时间;

4、需要用类来写迭代器,需要重写 _ iter _( ) 和 _ next _( )方法;思考一下

5、自定义迭代器最大的特点是,需要用类来写,显得代码冗长,不太方便。所以直接使用生成器

from collections.abc import Iterable, Iterator
class GenreratorPrime(object):

    def __init__(self):
        self.i = 2

	# 需要用类来写迭代器,需要重写 _ _iter_ _( ) 和 _ _next_ _( )方法;
    def __iter__(self):
        return self

    def __next__(self):
        if self.i == 2:
            self.i += 1
            return 2

        while True:
            self.i += 1
            for j in range(2, self.i):
                if self.i % j == 0:
                    break
            else:
                return self.i

gp = GenreratorPrime()
print(isinstance(gp, Iterable))
print(isinstance(gp, Iterator))
iter1 = iter(gp)
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))

二、生成器

生成器(generator)也是一种迭代器 ,在每次迭代时返回一个值,直到抛出 StopIteration 异常。它有两种构造方式:

  • 表达式来创建生成器
  • 包含有yield的函数来创建生成器

1、表达式创建生成器

print([x for x in range(6)])
print((x for x in range(6)))
numbers = (x for x in range(6))
# for n in numbers:
#     print(n)

print(hasattr(numbers, '__iter__'))
print(hasattr(numbers, 'next'))
print(hasattr(numbers, '__next__'))

print(numbers.__next__())

print(next(numbers))
print(next(numbers))
print(next(numbers))
print(next(numbers))
print(next(numbers))
print(next(numbers))
print(next(numbers))

总结:

可以看出生成器表达式无法像列表推导式那样直接输出,它和可迭代对象一样只能采用for循环调用next()函数,原因在于range返回的是一个可迭代对象,列表推导式之所以能直接print就是因为[]将可迭代对象转为列表。

2、含有yield关键字的函数

一个带有 yield 的函数就是一个生成器函数,当我们使用 yield 时,它帮我们自动创建了__iter__() 和 next() 方法,而且在没有数据时,也会抛出 StopIteration 异常,也就是我们不费吹灰之力就获得了一个迭代器,非常简洁和高效。

def generator_func():
    v1 = yield 1
    print(f'hello {v1}')
    v1 = yield 2
    print(f'value1 is {v1}')
    v2 = yield 3
    print(f'value2 is {v2}')
    v3 = yield 4
    print(f'value3 is {v3}')


g = generator_func()
print(g.__next__())
print(g.__next__())
print(g.send(100))
g.send(1)
print(g.send(2))

总结:

  1. yield 把函数变成了一个生成器。
  2. 调用该函数的时候不会立即执行代码,而是返回了一个生成器对象
  3. 当使用 next() (在 for 循环中会自动调用 next() ) 作用于返回的生成器对象时,函数 开始执行,在遇到 yield 的时候会『暂停』,并返回当前的迭代值;
  4. 当再次使用 next() 的时候,函数会从原来『暂停』的地方继续执行,直到遇到 yield语 句,如果没有 yield 语句,则抛出异常;
  5. 生成器函数的执行过程看起来就是不断地 =执行->中断->执行->中断的过程
  6. send() 方法就是 next() 的功能,加上传值给 上次暂停的yield 。
  7. close() 方法来关闭一个生成器。生成器被关闭后,再次调用 next() 方法,不管能否遇到 yield 关键字,都会抛出 StopIteration 异常,

3、案例

创建一个获取所有质数的生成器

def generator_prime():
    i = 2
    yield i
    while True:
        i += 1
        for j in range(2, i):
            if i % j == 0:
                break
        else:
            yield i


g = generator_prime()
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java面向对象编程

标题:Java面向对象编程 文章目录 标题:Java面向对象编程前言:面向对象的三条主线一、面向对象编程概述1.1 程序设计思路1.2 Java语言的基本元素:类和对象1.3 对象的内存解析 二、类的成员1—成员变量2.1 “变量”定义&分类2.2…

蓝桥杯备赛

关闭同步流: ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); 注意数据范围:数据范围较大时干脆所有变量类型都定义成longlong等。 stl: sort函数 时间复杂度为nlog(n); sort(数组指针,从指针开始多少个数,great…

如何辨别:DNS污染or DNS劫持?

DNS劫持和DNS污染的情况在互联网中并不少见,到底是出现了DNS污染还是DNS劫持。什么是DNS污染?什么是DNS劫持?我们该如何辨别DNS污染和DNS劫持? DNS劫持: DNS 劫持是指恶意攻击者通过非法手段篡改了网络中的 DNS 服务…

HTML快速入门

HTML简介 HTML(超文本标记语言)是一种用于创建网页和Web应用程序的标记语言。它由一系列标签组成,每个标签通过尖括号来定义,并用于标记文本、图像、链接和其他内容。HTML标签描述了网页中的信息结构和布局,并定义了文…

[MySQL数据库] 索引与事务

1. 索引 1.1 概念 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针.可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现. 1.2 作用 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍…

【Redis】面试题汇总

Redis什么是Redis、使用场景有哪些Redis 为什么这么快?Redis 数据类型及使用场景五种常见的 Redis 数据类型是怎么实现?Redis是单线程吗Redis 采用单线程为什么还这么快?Redis 如何实现数据不丢失?Redis 如何实现服务高可用&#…

【复习笔记】FreeRTOS(六) 队列操作

本文是FreeRTOS复习笔记的第六节,队列操作。 上一篇文章: 【复习笔记】FreeRTOS(五)时间片调度 文章目录 1.队列操作1.1.队列操作过程1.2.队列操作常用的API函数 二、实验设计三、测试例程四、实验效果 1.队列操作 队列是为了任务与任务、任务与中断之间…

极狐GitLab x LigaAI,AI 时代研发提效新范式

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 近日,极狐GitLab 和 LigaAI 宣布合作,双…

分布式锁设计

一、为什么需要分布式锁 1.1 单体项目同步实现 在单进程(启动一个jvm)的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线…

vue2中props属性设置一个对象或数组的默认值

在Vue.js中,如果您想要为一个props属性设置一个对象或数组的默认值,您应该使用一个函数来返回这个默认值。这是因为对象和数组是引用类型,直接将它们作为默认值可能会导致预设的默认值被所有实例共享,这不是我们想要的结果。 下面…

zabbix 自定义模板,邮件报警,代理服务器,自动发现与自动添加及snmp

目录 一. 自定义监控内容 1. 在客户端创建自定义 key 2. 在 web 页面创建自定义监控项模块 2.1 创建模板 2.2 创建应用集 2.3 创建监控项 2.4 创建触发器 2.5 创建图形 2.6 将主机与模板关联起来 登录测试 2.7 设置邮件报警 测试邮件报警 3. nginx 服务状况的检测…

Vue中SourceMap的使用方法详解

目录 一、概述 二、使用方法 三、生成SourceMap 四、优化 五、结语 一、概述 Vue.js是一套构建用户界面的渐进式框架,通过HTML模板或者直接写render函数可以快速开发单页应用。在开发过程中,很多时候我们需要调试代码,追踪错误。Vue官方…

Linux:调试器 - gdb

Linux:调试器 - gdb gbd基本概念gbd调试浏览断点运行变量 gbd基本概念 GDB (GNU Debugger) 是一个强大的命令行调试工具,用于调试各种编程语言(如C、C、Java、Python等)编写的程序。使用 gdb可以帮助开发人员更快地定位和修复程序中的缺陷,提高代码质量和开发效率。…

Python介绍(未完)

文章目录 Python 背景知识Python 是谁创造的?Python 可以用来干什么?Python 的优缺点 搭建 Python 环境安装 Python搭建 PyCharm 环境新工具到手,赶紧试试中文设置第一个Python程序 Python基础语法基础语法(1)常量和表…

Error : java 错误 : 不支持发行版本5 ( 完美解决)

解决方案 1. 原因 idea的默认配置JDK版本与当前项目所需版本不一样 方案一(每一个项目可能都要配置一遍) Ctrlshitalts 打开项目结构,设置项目所需的JDK版本,本项目需要JDK8 Modules的JDK版本为5,这时就会报Error …

最大公约数和最小公倍数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现最大公约数函数&#xff1b; int max(int x, int y) {//初始化变量值&#xff1b;int judge 1;//运算&#xff1b;judge x %…

Ubuntu 23.10.1 nginx源码安装

注&#xff1a;以下所有命令均在root管理员模式下&#xff0c;若不是&#xff0c;请在所有命令前加sudo 1、安装依赖库 1.1、安装gcc g的依赖库 apt-get install build-essential apt-get install libtool1.2、安装pcre依赖库 apt-get update apt-get install libpcre3 lib…

剑指Offer题目笔记33(并查集)

面试题116&#xff1a; 解决方案&#xff1a; ​ 一个班级可以包含一个或多个朋友圈&#xff0c;对应的图中可能包含一个或多个子图&#xff0c;每个朋友圈对应一个子图。因此&#xff0c;这个问题可以转化为如何求图中子图的数目。图的搜索算法可以用来计算图中子图的数目。扫…

企业Linux特殊权限位/为什么会存在SUID?/企业环境测试(原理剖析)-4989字解析

企业高薪思维&#xff1a; 坚持很难&#xff0c;优秀的人才是少数&#xff0c;很重要 坚持不下去&#xff0c;问自己想要什么&#xff1f; 问问自己想要好的生活状态&#xff1f;问自己有背景吗&#xff1f;你学历是亮点吗&#xff1f;有钱没&#xff0c;你也就是一般家庭&…

selenium 下载文件取消安全下载的方法

问题描述 我要从一个网站上下载文件&#xff0c;谷歌浏览器总是自动阻止下载&#xff0c;并询问我是否保留。 可是&#xff0c;我想要的是不要询问&#xff0c;默认下载即可。 运行环境 OS: macOSselenium: 4.19.0python: 3.10.11Chrome: 124.0.6367.62selenium chromedrive…
最新文章