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

news2024/11/25 19:33:06

可迭代对象:

  可以用于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.coloradmin.cn/o/1292244.html

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

相关文章

docker---数据卷

数据卷&#xff08;数据共享&#xff09; 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改操作立刻可见&#xff0c;并且更新数据不会影响镜像&#xff0c;从而实现数据在宿主机与容器之间的迁移。数据卷的…

TCP协议一对一聊天UDP协议群聊

一对一聊天 服务端&#xff1a; package 一对一用户;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; …

进行生成简单数字图片

1.之前只能做一些图像预测,我有个大胆的想法,如果神经网络正向就是预测图片的类别,如果我只有一个类别那就可以进行生成图片,专业术语叫做gan对抗网络 2.训练代码 import torch import torch.nn as nn import torch.optim as optim import torchvision.transforms as transfo…

排序分析(Ordination analysis)及R实现

在生态学、统计学和生物学等领域&#xff0c;排序分析是一种用于探索和展示数据结构的多元统计技术。这种分析方法通过将多维数据集中的样本或变量映射到低维空间&#xff0c;以便更容易理解和可视化数据之间的关系。排序分析常用于研究物种组成、生态系统结构等生态学和生物学…

java--枚举

1.枚举 枚举是一种特殊类 2.枚举类的格式 注意&#xff1a; ①枚举类中的第一行&#xff0c;只能写一些合法的标识符(名称)&#xff0c;多个名称用逗号隔开。 ②这些名称&#xff0c;本质是常量&#xff0c;每个常量都会记住枚举类的一个对象。 3.枚举类的特点 ①枚举类的…

Java 第21章 网络通信

网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素封装成不同的类&#xff0c;用户只要创建这些类的对象&#xff0c;使用相应的方法&#xff0c;即使不具备有关的网络支持&#xff0c;也可以编写出高质量的网络通信程序。 …

JPA(Java Persistence API)是什么

JPA的官网地址&#xff1a;https://jcp.org/en/jsr/detail?id338 当前最新的版本是2.2版本&#xff1a;https://jcp.org/aboutJava/communityprocess/mrel/jsr338/index.html JPA是一个Java持久化的API&#xff0c;通过这个API&#xff0c;在Java EE和Java SE 环境中管理持…

鸿蒙开发ServiceAbility基本概念

时间过长&#xff0c;开发者必须在Service里创建新的线程来处理&#xff08;详见线程间通信&#xff09;&#xff0c;防止造成主线程阻塞&#xff0c;应用程序无响应。 创建Service 介绍如何创建一个Service 创建Service的代码示例如下&#xff1a;查看获取鸿蒙开发 (qq.com)…

HTTP 缓存机制

一、强制缓存 只要浏览器判断缓存没有过期&#xff0c;则直接使用浏览器的本地缓存而无需再请求服务器。 强制缓存是利用下面这两个 HTTP 响应头部&#xff08;Response Header&#xff09;字段实现的&#xff0c;它们都用来表示资源在客户端缓存的有效期&#xff1a; Cache…

ChatGPT学习笔记

1 ChatGPT架构图 &#xff08;ChatGPT_Diagram.svg来自于【OpenA | Introducing ChatGPT】&#xff09; 2 模型训练 ChatGPT在训练时使用了PPO方法&#xff1b;

pandas空格及网页空格符NBSP替换处理

df3[动作一课程内容]df3[动作一课程内容].str.replace( ,) df3[动作一课程内容]df3[动作一课程内容].str.replace( ,) 截图中代码为python展示代码&#xff0c;由于网页空格符和常规空格符看起来大致相同&#xff0c;但却不能用常规空格替换解决

基于个微机器人的开发

简要描述&#xff1a; 下载消息中的动图 请求URL&#xff1a; http://域名/getMsgEmoji 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明…

树莓派4B iio子系统 mpu6050

编写基于iio的mpu6050 遇到的问题&#xff0c;在读取数据时&#xff0c;读出来的数据不能直接拼接成int类型 需要先将其转换成short int&#xff0c;再转换成int 效果如图所示 注&#xff1a;驱动是使用的modprobe加载的 画的思维导图&#xff08;部分&#xff0c;上传的…

预付费远传水表和传统水表有什么不同?

随着科技的发展&#xff0c;预付费远传水表作为一种新型智能水表&#xff0c;与传统水表相比有着许多不同之处。那么&#xff0c;预付费远传水表和传统水表究竟有什么不同呢&#xff1f; 首先&#xff0c;预付费远传水表具备智能化功能。与传统水表只能记录用水总量不同&#x…

代码随想录算法训练营第五十七天【动态规划part17】 | 647. 回文子串、516.最长回文子序列

647. 回文子串 题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路 动规五部曲 1.确定dp数组及其下标含义 布尔类型的dp[i][j]&#xff1a;表示区间范围[i,j] &#xff08;注意是左闭右闭&#xff09;的子串是否是回文子串&#…

springboot 整合 Spring Security 中篇(RBAC权限控制)

1.先了解RBAC 是什么 RBAC(Role-Based Access control) &#xff0c;也就是基于角色的权限分配解决方案 2.数据库读取用户信息和授权信息 1.上篇用户名好授权等信息都是从内存读取实际情况都是从数据库获取&#xff1b; 主要设计两个类 UserDetails和UserDetailsService 看下…

linux高级篇基础理论七(Tomcat)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

主食罐头哪个牌子好?猫主食罐头品牌盘点

养猫的这几年德罐也买了不少了&#xff0c;很早以前德罐给我的感觉就是&#xff0c;物美价廉&#xff0c;而且质量保障也不错&#xff0c;很美丽。但最近的德罐恕在下高攀不起了。 猫罐头侠登场&#xff01;养猫这么久了我就把我吃的不错的猫罐头分享一下&#xff01;别纠结了…

Dockerfile 指令的最佳实践

这些建议旨在帮助您创建一个高效且可维护的Dockerfile。 一、FROM 尽可能使用当前的官方镜像作为镜像的基础。Docker推荐Alpine镜像&#xff0c;因为它受到严格控制&#xff0c;体积小&#xff08;目前不到6 MB&#xff09;&#xff0c;同时仍然是一个完整的Linux发行版。 FR…

【FPGA】Quartus18.1打包封装网表文件(.qxp)详细教程

当我们在做项目的过程中&#xff0c;编写的底层Verilog代码不想交给甲方时怎么办呢&#xff1f;此时可以将源代码打包封装成网表文件&#xff08;.qxp&#xff09;进行加密&#xff0c;并且在工程中进行调用。 Quartus II的.qxp文件为QuartusII Exported Partition&#xff0c;…