当前位置: 首页 > news >正文

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'

相关文章:

python总结-生成器与迭代器

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

MySQL如何从数据中截取所需要的字符串

MySQL如何从数据中截取所需要的字符串 背景 有这样的一个场景,我想从我的表里面进行数据截取&#xff0c;我的数据内容大致如下&#xff1a; 张三-建外SOHO-2-16 POA 20210518.pdf 我想获取数据中的&#xff1a;20210518这一日期部分&#xff0c;需要如何实现&#xff1f; 解…...

动态加载和动态链接的区别

动态加载&#xff08;Dynamic Loading&#xff09;和动态链接&#xff08;Dynamic Linking&#xff09;是两个与程序运行时加载和使用代码相关的概念&#xff0c;它们有一些区别&#xff1a; 动态加载&#xff08;Dynamic Loading&#xff09;&#xff1a; 定义&#xff1a; 动…...

js数组循环,当前循环完成后执行下次循环

前言 上图中&#xff0c;点击播放icon&#xff0c;图中左边地球视角会按照视角列表依次执行。u3D提供了api,但是我们如何保证在循环中依次执行。即第一次执行完成后&#xff0c;再走第二次循环。很多人的第一思路就是promise。对&#xff0c;不错&#xff0c;出发的思路是正确的…...

决策树(Decision Trees)

决策树&#xff08;Decision Trees&#xff09;是一种基于树形结构进行决策的模型&#xff0c;广泛应用于分类和回归任务。它通过对数据集进行递归划分&#xff0c;构建一棵树&#xff0c;每个节点代表一个特征&#xff0c;每个分支代表一个决策规则&#xff0c;叶节点存储一个…...

湖南大学-计算机网路-2023期末考试【部分原题回忆】

前言 计算机网络第一门考&#xff0c;而且没考好&#xff0c;回忆起来的原题不多。 这门学科学的最认真&#xff0c;复习的最久&#xff0c;考的最差。 教材使用这本书&#xff1a; 简答题&#xff08;6*530分&#xff09; MTU和MSS分别是什么&#xff0c;联系是什么&#x…...

LCD—液晶显示

本节主要介绍以下内容 显示器简介 液晶控制原理 秉火3.2寸液晶屏简介 使用FSMC模拟8080时序 NOR FLASH时序结构体 FSMC初始化结构体 一、显示器简介 显示器属于计算机的I/O设备&#xff0c;即输入输出设备。它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具。…...

论正确初始化深度学习模型参数的重要性

遇到的问题&#xff1a;在一般的深度学习训练过程中&#xff0c;我们建立好模型以后&#xff0c;程序就有自动的初始化一些模型的参数&#xff0c;比如全连接层中每一个节点的权重等等&#xff0c;在之前的网络训练过程中&#xff0c;我总是事先设下随机种子以后&#xff0c;让…...

ALSA学习(5)——ASoC架构中的Machine

参考博客&#xff1a;https://blog.csdn.net/DroidPhone/article/details/7231605 &#xff08;以下内容皆为原博客转载&#xff09; 文章目录 一、注册Platform Device二、注册Platform Driver三、初始化入口soc_probe() 一、注册Platform Device ASoC把声卡注册为Platform …...

LeetCode 0447.回旋镖的数量:哈希表

【LetMeFly】447.回旋镖的数量&#xff1a;哈希表 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-boomerangs/ 给定平面上 n 对 互不相同 的点 points &#xff0c;其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 &#xff0c;其中 i 和…...

容器相关笔记

目录 1.容器 1.什么是容器 2.java中的容器 3.容器里存放的是引用数据类型&#xff08;存对象的地址&#xff0c;不是对象本身&#xff09;&#xff0c;不能存基本数据类型 4.容器存放的两种格式 5.容器类所在的包 6.容器的分类 1.Collection&#xff0c;存放单一的类型 1.List&…...

cissp 第10章 : 物理安全要求

10.1 站点与设施设计的安全原则 物理控制是安全防护的第一条防线&#xff0c;而人员是最后一道防线。 10.1.1 安全设施计划 安全设施计划描述了组织的安全要求的轮廓&#xff0c; 并且着重强调为了提供安全性所用的方法和机制。 这样的计划通过被称为关键路径分析的过程进行开…...

聊一聊 .NET高级调试 内核模式堆泄露

一&#xff1a;背景 1. 讲故事 前几天有位朋友找到我&#xff0c;说他的机器内存在不断的上涨&#xff0c;但在任务管理器中查不出是哪个进程吃的内存&#xff0c;特别奇怪&#xff0c;截图如下&#xff1a; 在我的分析旅程中都是用户态模式的内存泄漏&#xff0c;像上图中的…...

海外代理IP在游戏中有什么作用?

随着科技的飞速发展&#xff0c;手机和电脑等电子产品已成为互联网连接万物的重要工具&#xff0c;深度融入我们的日常生活&#xff0c;我们借助互联网完成工作、休闲和购物等任务&#xff0c;以求提升生活质量。 不仅如此&#xff0c;网络游戏也是人们心中最爱&#xff0c;它…...

高防ip适合防御网站和游戏类的攻击吗?

​  作为站长&#xff0c;要学会并承受得住网站外来攻击的压力&#xff0c;尤其是所属为 DDoS 攻击高发行业的网站类业务及游戏行业&#xff0c;是很容易被竞争对手或者一些伪黑客爱好者盯上的。 加上&#xff0c;有些站长并没有提前了解&#xff0c;就盲目进军了这两个行业&…...

HTML5和JS实现明媚月色效果

HTML5和JS实现明媚月色效果 先给出效果图&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html> <head><title>明媚月光效果</title><style>body {margin: 0;overflow: hidden;background-color: #000; /* 添加一个深色背景以便看到…...

Django5+DRF序列化

概述 本教程将介绍如何创建一个简单的粘贴板代码高亮 Web API。在此过程中&#xff0c;它将介绍构成 REST 框架的各种组件&#xff0c;让你全面了解所有组件是如何组合在一起的。 本教程相当深入&#xff0c;因此在开始学习之前&#xff0c;你可能需要先吃一块饼干&#xff0…...

什么是编译程序和解释程序

一、编译程序 1、编译器接收源代码作为输入&#xff0c;它会一次性地将整个源代码程序转换成目标代码&#xff08;通常是机器语言或汇编语言&#xff09;&#xff0c;这个过程包括词法分析、语法分析、语义分析、优化以及最终的目标代码生成。2、编译后的目标代码是一个独立的…...

文档审阅批注的合并和对比

#创作灵感# 最近在改论文&#xff0c;Feedback返回的时候&#xff0c;把之前的批注都删了&#xff0c;这就增加了工作量&#xff0c;看起来不方便&#xff0c;所以就需要将删掉的批注全部复原。 那在原来的文档重新在修改一遍&#xff0c;工作量还是很大的&#xff0c;所以这里…...

广义零样本学习综述的笔记

1 Title A Review of Generalized Zero-Shot Learning Methods&#xff08;Farhad Pourpanah; Moloud Abdar; Yuxuan Luo; Xinlei Zhou; Ran Wang; Chee Peng Lim&#xff09;【IEEE Transactions on Pattern Analysis and Machine Intelligence 2022】 2 conclusion Generali…...

java每日一题——输出9x9乘法表(答案及编程思路)

前言&#xff1a; 打好基础&#xff0c;daydayup! 题目&#xff1a;输出下图9x9乘法表 编程思路&#xff1a;java只能输出行&#xff0c;不能输出列&#xff0c;所以考虑好每一行输出的内容即可 public class demo {public static void main(String[] args) {for (int i 1; i…...

Android 车联网——基础简介(一)

传统的车载功能单一,无太多娱乐性,而随着智能化时代的发展,车载系统也被赋予了在系统中预装 Android 应用的能力,基于Android平台的车载信息娱乐系统 —— Android AutoMotive 应运而生。 一、AutoMotive简介 Android Automotive OS 车载操作系统,是一个基本 Android 平台…...

自动驾驶货车编队行驶系统功能规范

货车编队行驶功能规范 Truck Platooning Functional Specification 目录 1 概述... 7 1.1 目的... 7 1.2 范围... 7 1.3 术语及缩写... 7 1.4 参考法规标准... 8 2 功能规范... 9 2.1 功能描述... 9 2.1.1 功能用途…...

javafx

JavaFX JavaFX简介 JavaFX是一个用于创建富客户端应用程序的图形用户界面&#xff08;GUI&#xff09;框架。它是Java平台的一部分&#xff0c;从Java 8开始成为Java的标准库。 JavaFX提供了丰富的图形和多媒体功能&#xff0c;使开发人员能够创建具有吸引力和交互性的应用程…...

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 编译构建及此过程中的踩坑填坑(3)

接前一篇文章&#xff1a;玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 编译构建及此过程中的踩坑填坑&#xff08;2&#xff09; 上一篇文章结束时在等待提示的各依赖包下载安装后的编译结果&#xff0c;但是很遗憾&#xff0c;编译并没有最终完成&#xff0c;既未成功也没有失…...

SQL ORDER BY 关键字

ORDER BY 关键字用于对结果集进行排序。 SQL ORDER BY 关键字 ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。 ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序&#xff0c;您可以使用 DESC 关键字。 SQL ORDER BY 语法 SELECT …...

多线程-生产者消费者模型

一、基本信息 1、场景介绍&#xff1a;厨师和吃货的例子&#xff0c;吃货吃桌子上的面条&#xff0c;吃完让厨师做&#xff0c;厨师做完面条放桌子上&#xff0c;让吃货吃&#xff0c;厨师如果发现桌子上有面条&#xff0c;就不做&#xff0c;吃货发现桌子上没有面条就不吃。 …...

解压命令之一 gzip

文章目录 解压命令之一 gzip更多信息 解压命令之一 gzip gzip用于对后缀为gz文件进行解压&#xff1a; $ gzip -d data.gz这个命令将解压examplefile.gz&#xff0c;并且在当前目录下生成一个名为data的解压后的文件。 但特别需要留意的是&#xff0c;这个操作会删除源文件&…...

力扣:438. 找到字符串中所有字母异位词 题解

Problem: 438. 找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 预备知识解题思路复杂度Code其它细节推荐博客或题目博客题目滑动窗口哈希表 预备知识 此题用到了双指针算法中的滑动窗口思想&#xff0c;以及哈希表的运用。c中是unordered_map。如果对此不了解的u…...

QT 高DPI解决方案

一、根据DPI实现动态调整控件大小&#xff08;三种方式&#xff09; 1、QT支持高DPI&#xff08;针对整个进程中所有的UI&#xff09; // main函数中 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling)tips&#xff1a;&#xff08;1&#xff09;如果不想全局设置&am…...

武汉品牌网站建设公司/免费手机优化大师下载安装

1.单词回顾 clamor n喧闹&#xff1b;强烈的要求 v喧嚷&#xff0c;强烈的要求 tumult n骚动&#xff0c;骚乱&#xff0c;吵闹&#xff0c;激动 deranged adj 不理智的&#xff0c;疯狂的 2.大概内容 Gatsby告诉Daisy&#xff0c;她只要说自己从未爱过Tom&#xff0c;便能…...

网站开发 百度编辑器/做网上营销怎样推广

菜鸟教程网站分析 Okay&#xff0c;第一遍大致浏览了前端网页的功能、特性、语言等等&#xff0c;现在进入下一个环节&#xff0c;即是“再读和实例分析”&#xff0c;这里采用先两者同步进行的方式&#xff0c;即通过分析网页来查漏补缺。 今天需要剖析的是什么呢&#xff1…...

重庆网站建设熊掌号/交换友情链接吧

NSString&#xff0c;NSNumber&#xff0c;NSArray&#xff0c;NSDictionary等简单对象可以方便的存储在本地沙盒文件中&#xff0c;而复杂的对象&#xff0c;诸如属性、方法较多的类对象&#xff0c;就需要使用归档反归档方法&#xff08;序列化与反序列化&#xff09;&#x…...

物流网站建设方案权限管理/微信搜索seo优化

1、const成员函数&#xff0c;和 非const成员函数&#xff0c;可以构成重载。 2、const成员变量是可以的&#xff0c;而且初始化必须要在参数化列表初始化。 3、int f(int &x) { cout << x << endl; } f(3*3); 这样是不行的&#xff0c;无法引用一个临时变量&a…...

金数字网站建设/怎么进入百度推广账户

【剑指offer15】【C】二进制中1的个数【快速幂模板】题目题解题目 请实现一个函数&#xff0c;输入一个整数&#xff0c;输出该数二进制表示中 1 的个数。例如&#xff0c;把 9 表示成二进制是 1001&#xff0c;有 2 位是 1。因此&#xff0c;如果输入 9&#xff0c;则该函数输…...

dedecms做资源下载网站/seo外包顾问

一、数组练习: 1.使用两种方式定义一个整形的一维数组,获取数组中的值,为数组中的元素赋值,遍历一维数组 代码:class SingleDimensionArray {public static void main(String[] args) {int[] arr1 new int[3];//动态方法定义int类型数组arr1[0] 1;arr1[1] 2;arr1[2] 3;for …...