python总结-生成器与迭代器

生成器与迭代器

  • 生成器
    • 生成器定义
    • 为什么要有生成器
    • 创建生成器的方式一(生成器表达式)
  • 创建生成器的方式二(生成器函数)
    • 生成器函数的工作原理
    • 总结
  • 迭代器
    • 概念
    • 可迭代对象和迭代器区别
    • for循环的本质
    • 创建一个迭代器
  • 动态添加属性和方法
    • 运行过程中给对象、类添加属性和方法
    • types.MethonType的使用
    • 给类动态添加静态方法以及类方法
  • __slots__ 的作用

生成器

在这里插入图片描述

生成器定义

在Python中,一边循环一边计算的机制,称为生成器:generator

为什么要有生成器

列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。
如:仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间
都白白浪费了。
如果列表元素按照某种算法推算出来,那我们就可以在循环的过程
中不断推算出后续的元素,这样就不必创建完整的list,从而节省大
量的空间。

简单说:
时间换空间!想要得到庞大的数据,又想让它占用空间少,那就用生成器!
延迟计算!需要的时候,再计算出数据!

创建生成器的方式一(生成器表达式)

生成器表达式很简单,只要把一个列表推导式的 [] 改成 () ,就创建
了一个生成器(generator):

L = [x * x for x in range(10)]
print(L)
g = (x * x for x in range(10))
print(g)

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
<generator object at 0x1006e8520>

创建 L 和 g 的区别仅在于最外层的 [] 和 () , L 是一个list,而 g 是一个
generator。

创建生成器的方式二(生成器函数)

生成器函数:

  1. 如果一个函数中包含 yield 关键字,那么这个函数就不再是一个普通函数,调用函数就是创建了一个生成器(generator)对象。
  2. 生成器函数:其实就是利用关键字 yield 一次性返回一个结果,阻塞,重新开始。

生成器函数的工作原理

生成器函数返回一个迭代器,for循环对这个迭代器不断调用 next() 函数,不断运行到下一个 yield
语句,一次一次取得每一个返回值,直到没有 yield 语句为止,最终引发 StopIteration 异 常。

yield 相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从 yield 的下一条 语句(不是下一行)开始执行。

send() 和 next() 一样,都能让生成器继续往下走一步(下次遇到 yield 停),但 send() 能传一个 值,这个值作为
yield 表达式整体的结果

#coding=utf-8
"""
1. 函数有了yield之后,调用它,就会生成一个生成器
2. yield作用:程序挂起,返回相应的值。下次从下一个语
句开始执行。
3. return在生成器中代表生成器种植,直接报错:
StopIeratation
4. next方法作用:唤醒并继续执行
"""def test():print("start")i=0while i<3:temp = yield i  #下次迭代时,代码从`yield`的下一条语句(不是下一行)开始执行print(f"temp:{temp}")i += 1print("end")return "done"if __name__ == '__main__':a = test()print(type(a))print(a.__next__())print(a.__next__())print(a.__next__())   # next(a) 一样print(a.__next__())  # 抛出异常:StopIteration

总结

什么是生成器?
生成器仅仅保存了一套生成数值的算法,并且没有让这个算
法现在就开始执行,而是我什么时候调它,它什么时候开始
计算一个新的值,并给你返回。

迭代器

在这里插入图片描述

概念

1 迭代是Python最强大的功能之一,是访问集合元素的一种方式。
2 迭代器是一个可以记住遍历的位置的对象。
3 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
4 迭代器只能往前不会后退。
5 迭代器有两个基本的方法: iter() 和 next()

可迭代对象和迭代器区别

1 一个实现了 iter 方法的对象,称为"可迭代对象Ieratable"
2 一个实现 next 方法并且是可迭代的对象,称为"迭代器Iterator"
即:实现了 iter 方法和 next 方法的对象就是迭代器。

⚠️生成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable(可迭代对
象) ,却不是 Iterator(迭代器) 。

在这里插入图片描述
为什么 list 、 dict 、 str 等数据类型不是 Iterator ?
Python的 Iterator 对象表示的是一个数据流。可以把这个数据流看
做是一个有序序列,但我们却不能提前知道序列的长度,只能
不断通过 next() 函数实现按需计算下一个数据,所以 Iterator 的计算
是惰性的,只有在需要返回下一个数据时它才会计算。
所以,生成器一定是迭代器。
Iterator 甚至可以表示一个无限大的数据流,例如全体自然数。而
使用list是永远不可能存储全体自然数的。

for循环的本质

Python3的 for 循环本质上就是通过不断调用 next() 函数实现的。
本质是:

# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:# 获得下一个值:x = next(it)
except StopIteration:# 遇到StopIteration就退出循环break

创建一个迭代器

一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与
__next__()
__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过StopIteration 异常标识迭代的完成。
__next__() 方法会返回下一个迭代器对象。

class MyNumbers:def __iter__(self):self.num = 10return selfdef __next__(self):if self.num<40:x = self.numself.num += 10return xelse:raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

动态添加属性和方法

在这里插入图片描述
动态编程语言是高级程序设计语言的一个类别,在计算机科学领域
已被广泛应用。
它是指在运行时可以改变其结构的语言 :例如新的函数、 对象、甚
至代码可以被引进,
已有的函数可以被删除或是其他结构上的变化。

运行过程中给对象、类添加属性和方法

#coding=utf-8
import types
class Person():def __init__(self,name,age):self.name = nameself.age = age
p1 = Person("zhangsan",20)
p2 = Person("lisi",30)
#动态给对象添加属性和方法
p1.score = 100
print(p1.score)def run(self):print(f"{self.name},running...")
#动态的对象添加方法
p1.run = types.MethodType(run,p1)
p1.run()

types.MethonType的使用

p1.run = types.MethodType(run,p1)
# 即使换成
xxx = types.MethodType(run,p1)
# xxx()调用一样还用
# 因为之前提示缺少参数,主要是不知道self到底是谁,
# 而types.MethodType(run,p1)则是告诉解释器,self
指的就是p1

给类动态添加静态方法以及类方法

@staticmethod
def staticfunc():print("---static method---")
Person.staticfunc = staticfunc
Person.staticfunc()@classmethod
def clsfunc(cls):print('---cls method---')
Person.clsfunc = clsfunc
Person.clsfunc()

slots 的作用

__slots__ 对动态添加成员变量、成员方法有限制。对动态添加类属性、类方法没有限制。
__slots__ 只对本类有限制,不限制子类

class Person():__slots__ = {"name","age"}def __init__(self,name,age):self.name = nameself.age = agedef eat(self):print("人是铁饭是钢,要吃!")
if __name__ == '__main__':p1 = Person("gaoqi",18)
#   p1.gender = "man" #AttributeError:
'Person' object has no attribute 'gender'

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

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

相关文章

MySQL练习-DDL语法练习

文章目录 1、数据库操作2、表操作3、DDL数据类型 突然想起来好久没写过SQL了&#xff0c;写一下SQL练习一下&#x1f60a; 个人写sql比较喜欢用小写&#x1f601; 什么是DDL&#xff1a;DDL是对数据库和表的操作 在这里练习DLL的时候先不添加约束&#xff0c;后面会把约束集中…

Lumerical------关闭 drawing grid 去更好地显示 mesh grid

Lumerical------关闭 drawing grid 去更好地显示 mesh grid 引言正文 引言 在 Lumerical 结构设置的时候&#xff0c;有时候我们想要查看 mesh 结构的 grid&#xff0c;但是本身默认的 dtawing grid 黑框会阻碍我们的观察&#xff0c;这时&#xff0c;我们便可以通过设置关闭这…

2024阿里云服务器可用区选择方法

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

CAD安装教程

CAD安装教程 目录 一&#xff0e; 下载CAD二&#xff0e; 安装CAD 一&#xff0e; 下载CAD 如果需要CAD安装包请私信。 二&#xff0e; 安装CAD 解压压缩包AutoCAD2022中文版&#xff0c;以管理员身份运行AutoCAD_2022_Simplified_Chinese_Win_64bit_dlm.sfx。 选择解压路径。…

计算机毕业设计----SSM场地预订管理系统

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 用户角色包含以下功能&#xff1a; 按分类查看场地,用户登录,查看网站公告,按分类查看器材,查看商品详情,加入购物车,提交订单,查看订单,修改个人信息等功能。 管理员角…

简单 Web Server 程序的设计与实现 (2024)

1.题目描述 Web 服务是 Internet 最方便与受用户欢迎的服务类型&#xff0c;它的影响力也远远超出了专业技术范畴&#xff0c; 已广泛应用于电子商务、远程教育、远程医疗与信息服务等领域&#xff0c;并且有继续扩大的趋势。目前很多 的 Internet 应用都是基于 Web 技术的&…

Javaweb之Mybatis的XML配置文件的详细解析

2. Mybatis的XML配置文件 Mybatis的开发有两种方式&#xff1a; 注解 XML 2.1 XML配置文件规范 使用Mybatis的注解方式&#xff0c;主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能&#xff0c;建议使用XML来配置映射语句&#xff0c;也就是将SQL语句写在…

案例098:基于微信小程序的电子购物系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

大学物理实验重点——电路暂态过程

RC串联电路的暂态过程&#xff1a; RLC串联电路的暂态过程&#xff1a; 三种解&#xff1a; 半衰期测量法测量时间常数&#xff1a; 测振荡周期&#xff1a; 不断增大电阻直至振荡凸起峰刚好消失&#xff0c;此时即为临界阻尼状态&#xff0c;记下电阻箱的阻值R&#xff0c;…

如何保证本地缓存的一致性(和分布式缓存)

保证本地缓存和分布式缓存的一致性是一个关键的问题&#xff0c;因为这可以确保系统的健壮性和响应速度。以下是一些在Java中实现这一目标的方法&#xff1a; 1.使用一致性哈希&#xff1a;一致性哈希是一种特殊的哈希技术&#xff0c;它能够在节点增减时最小化哈希环上的数据分…

LabVIEW开发自动读取指针式仪表测试系统

LabVIEW开发自动读取指针式仪表测试系统 在工业领域&#xff0c;尤其是煤矿、变电站和集气站等环境中&#xff0c;指针式仪表因其简单的结构、抗干扰能力强以及能适应高温高压等恶劣环境条件而被广泛应用于设备运行状态监视。然而&#xff0c;传统的人工读表方式不仅成本高昂&…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷4

某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenStack搭建企业内部私有云平台&#xff0c;开源Kubernetes搭建云原生服务平台&#xff0c;选…