生成器简述 - python 基础进阶知识点补全(一)

可迭代对象:

  可以用于for  ... in ..循环对对象都是可迭代对象,比如: list  tuple dict set

可以迭代的对象就是可迭代对象,python 中一切都是对象,在这里主要说的是变量

a = [1,2,3]    b = (1,2,3,)  c = "1234"

对象就是 a、 b 、 c  因为a、 b、 c 可以被迭代(可以通过for 循环获取其中每一个单位元素) 所以被称为可迭代对象。

可迭代对象需满足: 实现了魔法方法,__iter__方法

魔法方法: 是python内置方法,不需要主动调用,存在的目的是为了给python解释器调用

魔术方法在类或对象的某些事件出发后会自动执如果希望根据自己的程序定制特殊功能的类,那么就需要对这些方法进行重写。使用这些「魔法方法」,我们可以非常方便地给类添加特殊的功能。

自动执行:

   

 报错提示: 

 在代码最后:

b = Box(10, 20, 30)
# 在这我并没有对它(__init__方法 )做调用
print(b.getVolume())

虽然我对 __init__  方法没做调用 显然它是执行了,如何证明它是执行的, 我把实例化的

height  和 depath  属性给注释了,所以在我调用了 b.getVolume() 方法后他给我提示错误。

__iter__方法:

迭代器:

迭代器即用来迭代取值的工具,是一个可以记住遍历的位置的对象。   # 重要

迭代器对象从集合的第一个元素开始访问,直到抛出  StopIteration 异常 即是所有元素被访问完成。

迭代器特点: 

  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退

如果一个对象定义了下面两种方法,即是迭代器

__iter__(self)
__next__(self)

next()方法的作用是获取容器的下一个值,但如果调用了next方法,容器没有值可以返回,则会抛出一个StopIteration异常。

这就是为什么能记得住      遍历的位置

生成器: 

生成器的语法规则: 

(exp for iter_var in iterable if_exp)

从形式上看生成器和列表生成式非常相似,从形式上看生成器和列表生成式非常相似,生成器仅仅是将列表生成式的方括号换成了圆括号。而实际使用上却有很大的差别,列表生成式一次生成一个列表若列表的元素过多则占用很大的内存空间,而生成器一次仅生成一个元素即节省了内存空间又可以获取完整的列表内容。

列表生成式: 

excep =  [exp for iter_list in iterable if element_list ]

列表生成式,关键性的作用没有只是简化整理了步骤, 

就拿下面这个代码来看我用传统的写法写一遍

# 普通写法

a  = [1,2,3,4,5,6]

list_excep = [ ]

for exp in a : 

   if  exp > 2:

       b = exp * exp 

       list_excep.append(b)

print(list_excep )

# 列表生成式

a  = [1,2,3,4,5,6]

list_excep = [exp * exp for exp in a  if  exp > 2]

print(list_exp)

 列表生成式一次生成一个列表若列表的元素过多则占用很大的内存空间,而生成器一次仅生成一个元素即节省了内存空间又可以获取完整的列表内容。

                                      图 3 -1 

注意:图 3 - 1 这个返回对象 

      <generator object <genexpr> at 0x000001D7A0302180>

直译为“生成器对象genexp0x000001D7A0302180”,也就是说函数返回的不是列表,而是一个“生成器对象”。什么是生成器对象呢 ?

原来生成器对象是一个可以产生数据,我们可以对起进行迭代或称为遍历

生成器是一种迭代器,生成器拥有next方法并且行为和迭代器相同,都可以用于for循环。
生成器对延迟操作提供了支持,这使得python可以在需要的时候才生成结果,而不是立即产生结果。生成器更加高效的利用内存, 当需要产生大量数据时, 使用生成器返回一个惰性的迭代器, 而不是在内存中保存他们。

python 实现了  __next__ 方法的对象都可以称为迭代器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

生成器是在迭代器的基础之上的,生成器简单理解就是一个迭代器,因为上文以及图3- 1 中证明了它返回的是一个可迭代的对象。

yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。

当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并保存当前迭代的位置,并将 yield 后面的表达式作为当前迭代的值返回

a = [1,2,3,4]

for i in a : 

      # 第一迭代获取元素下标为 0 值 为 1

      # 第二次迭代获取元素下标为1 值为 2 

 现在遇到了yield   停在下标为 1 的位置 ,它会记住,奥我现在到了 列表对象   [1,2,3,4] 中下标为 1 的位置,并且我将 元素 2 作为当前迭代的值返回,并在保证在下一次执行  next() 方法时,从yield 记忆的位置也就时下标为1 的地方开,等到再次遇见 yield 时,我在记忆,在返回。

文章部分材料来源: 

http://t.csdnimg.cn/c7nyU  

谢谢各位同僚对本文章的支持,能力有限我会努力提升自己争取为大家提供更多有用的知识

学了这么久的程序,我觉得最大的感受,提升这个阶段,  往往意味着   在搜寻自己所需要的知识类,整理自己的知识面,我不知道这是不是学习能力,但是有几点我自己写代码的能力的确提高了对知识尤其是广度比较好,记得大一的时候,我还需要看着书一个一个写,目前看几眼就记住了,以前呢? 还有看缩进标点符号是否加错, 现在很少写错,即便不对一找就准,对知识的把握也就是,你知道需要什么,应该怎么去找,而且保证找到的内容是有效的,但是目前缺乏的能力是归纳整理,我为此尝试了 x -mind  思维脑图  ,并且我认为它是正确的 ,它的作用是用来加强知识面的理解记忆,但是确实很难,你在写的写的就忘记了写了, 这是人惰性包括 ,思维 跳跃提升需要改变,大脑它在抵抗,所以很麻烦。

                                                    图为  -  xmind   使用

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

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

相关文章

文献速递:多模态影像组学文献分享:生成一种多模态人工智能模型以区分甲状腺良性和恶性滤泡性肿瘤:概念验证研究

文献速递&#xff1a;多模态影像组学文献分享&#xff1a;生成一种多模态人工智能模型以区分甲状腺良性和恶性滤泡性肿瘤&#xff1a;概念验证研究 文献速递介绍 近年来&#xff0c;人工智能&#xff08;AI&#xff09;领域日益被探索&#xff0c;作为一种增强传统医学诊断和…

Failed to resolve org.junit.platform:junit-platform-launcher:1.9.3

springboot 跑 unit test 的时候&#xff0c;如果报错如题的话&#xff0c;可以更改idea 里的 Settings ——> HTTP Proxy 配置为&#xff1a;Auto-detect proxy settings

Google 发布最强大模型Gemini,能力与GPT-4相当

一、Gemini 介绍 Gemini 是一个多模式模型系列&#xff0c;在图像、音频、视频和文本领域展示了真正强大的功能。其中功能最强大的模型 Gemini Ultra 在 32 个基准测试中的 30 个中提升了最先进水平&#xff0c;其中包括 12 个流行文本和推理基准测试中的 10 个、9 个图像理解…

让工作更高效,那些不能错过的8款泳道图绘制工具

在现代企业的运营管理中&#xff0c;泳道图扮演了至关重要的角色。这种独特的图表工具以其直观、清晰的特点&#xff0c;帮助我们理解和改进复杂的工作流程&#xff0c;从而提升效率。本文将为你分享8款实用且高效的泳道图绘制工具&#xff0c;它们能够帮助你轻松创建出专业级别…

Java程序员,你掌握了多线程吗?【文末送书】

目录 摘要 01、多线程对于Java的意义 02、为什么Java工程师必须掌握多线程 03、Java多线程使用方式 04、如何学好Java多线程 参与方式&#x1f947; 推荐一个人工智能学习网站 https://www.captainbed.cn/bear 摘要 互联网的每一个角落&#xff0c;无论是大型电商平台的…

C语言内存函数讲解

目录 文章目录 内存函数针对的数据类型不确定可能是整型数据&#xff0c;字符数据&#xff0c;结构体数据...... memcpy的使用和模拟实现 memcpy的使用 memcpy打印字符数据 memcpy打印整型数据 memcpy的模拟实现 模拟实现的memcpy打印重叠情境 memmove的使用和模拟实现 memm…

为什么出海企业需要呼叫中心?

随着现代商业世界的发展&#xff0c;企业面临着越来越多的挑战和机遇。为了提高客户服务水平、客户满意度、企业形象和销售业绩&#xff0c;呼叫中心已成为越来越多企业的首选。那么&#xff0c;为什么出海企业需要呼叫中心呢&#xff1f; 1. 提高客户服务质量 首先&#xff…

Linux | tar,bc,uname指令

Linux | tar&#xff0c;bc&#xff0c; 文章目录 Linux | tar&#xff0c;bc&#xff0c;tar指令【重要】bc指令uname –r指令 tar指令【重要】 tar [-cxtzjvf] 文件与目录 … 参数&#xff1a; -c &#xff1a;建立一个压缩文件的参数指令(create 的意思)&#xff1b;-x &am…

为什么对中小企业来说,数字化转型很难?

引言 数字化转型对中小企业至关重要&#xff0c;然而&#xff0c;实施这一转型却充满挑战。中小企业面临着资源、技术、文化和安全方面的种种难题&#xff0c;这些困难限制了它们在数字化领域的发展和竞争力。这种挑战不仅影响企业内部运营&#xff0c;还直接影响其与客户和市…

中国的下一个风口:数字化!

——“中国的下一个风口是什么&#xff1f;数字化&#xff1f;你赞同吗&#xff1f;” ——“中国的下一个风口是不是‘数字化’&#xff0c;不敢妄下定论。” 但可以肯定的是&#xff0c;企业想站上未来产业的风口&#xff0c;“数字化”是必经之路。也就是说&#xff0c;数…

HarmonyOS 开发 Java 与 ArkTS 如何抉择?

本文详细分析 Java 与 ArkTS 在 HarmonyOS 开发过程的区别&#xff0c;力求解答学员的一些困惑。 何为 HarmonyOS&#xff1f; 在讨论语言的差异时&#xff0c;我们先了解下什么是 HarmonyOS。华为官方是这么解释 HarmonyOS 的&#xff1a; “鸿蒙操作系统”特指华为智能终端…

视频集中存储/智能分析融合云平台EasyCVR平台接入rtsp,突然断流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Halcon 机械视觉 使用仿射变换 机械手实现孔位定位

要推算机械手平面坐标系A与相机平面坐标系B的关系&#xff0c;我们可以首先找到两个平面坐标系之间的平移量和旋转量。 平移量&#xff1a;选择一个公共的参考点&#xff0c;比如某个标志物&#xff0c;假设在坐标系A中的坐标为(Ax, Ay)&#xff0c;在坐标系B中的坐标为(Bx, B…

GD32F303移植RT-Thread

我的平台&#xff1a; 芯片&#xff1a;GD32F303CCT6 编译器&#xff1a;KEIL5 一、下载keil专用 RT-Thread 安装包 https://www.keil.arm.com/packs/ 。。。。 。。。。 二、准备一个干净的GD32F303裸机工程&#xff0c;我就增加了串口功能 三、开始移植 1.rt-thread系统…

Java网络编程——非阻塞通信

对于用ServerSocket以及Socket编写的服务器程序和客户程序&#xff0c;它们在运行过程中常常会阻塞。例如当一个线程执行ServerSocket的accept()方法时&#xff0c;假如没有客户连接&#xff0c;该线程就会一直等到有了客户连接才从accept()方法返回。再例如当线程执行Socket的…

Chart 5 性能优化概述

文章目录 前言5.1 可移植性5.2 优化梗概5.3 OpenCL 移植的初始评估5.4 将CPU代码移植到OpenCL GPU5.5 并行化GPU和CPU工作负载5.6 瓶颈分析5.6.1 识别瓶颈5.6.2 解决瓶颈 5.7 API层面性能优化5.7.1 API函数调用的正确安排5.7.2 使用基于事件驱动的pipeline5.7.3 内核编译和构建…

0基础学习云计算难吗?

很多人经常会问云计算是什么&#xff1f;云计算能干什么&#xff1f;学习云计算能做什么工作&#xff1f;其实我们有很多人并不知道云计算是什么&#xff0c;小知今天来给大家讲讲学习云计算能做什么。 中国的云计算行业目前正处于快速发展阶段&#xff0c;随着互联网和数字化…

人脸识别安卓主板_MTK方案智能闸机门禁工业安卓主板定制开发

人脸识别主板广泛应用于各个领域&#xff0c;包括人脸支付系统、人脸识别监控系统、写字楼办公楼门禁闸机、校园、地铁、住宅门禁、考勤机、智能门锁、广告机、售卖机等。 主板基于联发科MTK方案&#xff0c;并由行业PCBA和MTK的核心板组成。根据产品需求&#xff0c;可以选择…

qt creator配置opencv库 (MSVC版本)

目录 1. MSVC版本 1.1 使用cmake编译opencv 1.2 再使用visual studio 2019生成opencv的lib,dll 1.3 配置opencv的系统环境变量 1.4 新建qt项目 1. MSVC版本 1.1 使用cmake编译opencv 1.2 再使用visual studio 2019生成opencv的lib,dll 1.3 配置opencv的系统环境变量 D:…

Educational Codeforces Round 159 (Div. 2) A~E

A.Binary lmbalance&#xff08;思维&#xff09; 题意&#xff1a; 给出一个01字符串&#xff0c;你可以对字符串进行无限次下列操作&#xff1a; 选择一个位置 i ( 1 ≤ i ≤ ∣ s ∣ − 1 , |s|为字符串s的长度 ) i(1 \le i \le |s| - 1,\text{|s|为字符串s的长度}) i(1≤…