生成器简述 - 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.hqwc.cn/news/255583.html

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

相关文章

GPT开发实战:解决GPT API限速问题

一个健壮的、安全的开放平台的架构设计&#xff0c;必然会针对对外开放的API接口进行速率限制&#xff0c;来保证整体系统的可用性&#xff0c;OpenAI对外的API也不例外&#xff0c;我们可以简单的从官方发现API使用量的限制。【API Doc上的限制】【个人账户里的速率限定以及当…

KubeSphere Marketpalce 上新!Databend Playground 助力快速启动数据分析环境

12 月 5 日&#xff0c;Databend Labs 旗下 Databend Playground&#xff08;社区尝鲜版&#xff09;成功上架青云科技旗下 KubeSphere Marketplace 云原生应用扩展市场&#xff0c;为用户提供一个快速学习和验证 Databend 解决方案的实验环境。 关于 Databend Playground Dat…

全球市场调研:找准热门产品,开创跨境电商新蓝海

在全球数字化浪潮的推动下&#xff0c;跨境电商正蓬勃发展&#xff0c;成为连接世界各地消费者与商品的桥梁。然而&#xff0c;在竞争激烈的市场中要想脱颖而出&#xff0c;关键在于深入的全球市场调研。本文将探讨如何通过全球市场调研找准热门产品&#xff0c;开创跨境电商的…

如何使用phpStudy本地快速搭建网站并内网穿透远程访问

文章目录 使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2.2 映…

使用Rust 构建C 组件

协议解析&#xff0c;这不就很快了&#xff0c;而且原生的标准库红黑树和avl 树支持&#xff0c;异步tokio 这些库&#xff0c;编写应用组件就很快了 rust 标准库不支持 unix 的消息队列&#xff0c;但是支持 shm 和 uds&#xff0c;后者从多方面考虑都比&#xff0c;消息队列更…

STM32Cube高效开发教程<基础篇>(十一)----数据的“高速公路”:DMA(直接存储器访问)

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。    本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。 一、DMA功能概…

什么是SPA(Single Page Application)?它的优点和缺点是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【项目】学生信息管理系统

概述 本系统总耗时 6 6 6 天&#xff0c;包括 学生发展与数据驱动平台6.2.cpp、学生信息.txt、用户账号.txt、注意事项.txt。由于代码对文件的调用使用的是相对路径&#xff0c;所以要求这 4 4 4 个文件都需要在同一目录。使用代码前先仔细看 注意事项。 如图&#xff1a; …

Unity传送门特效: The Beautiful Portal/Level up/Teleport/Warp VFX

7种不同风格的传送门特效! 每个传送门都有一个轻型和重型版本。 每个版本都有一个"无循环”和一个"无限”预制件:D 总共有28个预制件 -VFX完全使用Unity的粒子系统和基本的Unity着色器。 使用标准渲染管道中制作了这个资产。所以VFX的功能就像视频宣传片一样。 同时,…

用perl解决小朋友问的2的10000次方是多少的问题

2的10000次方是多少&#xff0c;用perl单行命令搞定&#xff0c; perl -Mbigint -le print 2**10000如果是安装了strawberry perl &#xff0c;在Windows控制台上输入&#xff0c;单行命令的单引号要换成双引号。 perl -Mbigint -le "print 2**10000"在git-bash中执…

如何处理3dmax渲染完成后阴影部分?

使用3dmax软件&#xff0c;对效果图进行渲染过程中&#xff0c;有不少小伙伴&#xff0c;在渲染完成后出现问题。 较为常见的3dmax渲染问题有3dmax渲染有阴影&#xff1f; 对于一些新手伙伴遇到这类问题&#xff0c;不知如何解决&#xff0c;就会苦恼3dmax渲染有阴影怎么办&am…

封装校验规则(以及复选框和整体校验)-----Vue3+ts项目

登录校验页面 <script setup lang"ts"> import { ref } from vue import { mobileRules, passwordRules } from /utils/rules const mobile ref() const password ref() </script><!-- 表单 --><van-form autocomplete"off">&l…