我的Python3.0笔记之容器,迭代器,生成器

python进阶:深入理解迭代器和生成器 可以简单理解为函数运行到yield这一行的时候,程序会从这里暂停,然后生成一个值跳出程序,每次next()函数被调用的时候,暂停的程序又复活了,会把yield生成的值返回给调用者,周而复始;从代码层面上说,迭代器是实现了迭代器协议的对象,即具有__iter__()和__next__()方法,它用于提供一种顺序访问容器中元素的方式,而无需了解容器的内部实现细节。上述代码是生成一个包含一亿元素的列表,迭代器是用[]括起来的,每个元素在生成后都会保存在内存中,此时内存占用大概是迭代器对象 + 元素占用的内存。 阅读详情

      在面向对象的语言中,大都有容器这一数据结构,容器其实是一组相同类型对象的集合,基本上可以容纳所有类型的数据。

  C++中的容器类包括“顺序存储结构”和“关联存储结构”,前者包括vector,list,deque等;后者包括set,map等。Python中容器主要是:列表,元组,字符串,字典(映射),集合,自定义类型。


 一、 Python中的迭代器(iterator),一般迭代器对象都有__init__方法和__next__方法。可以这么说:一个实现了__init__方法的对象是可迭代的,一个实现了__next__方法的对象则是迭代器。__init__方法返回迭代器自身,__next__方法返回它的下一个值,如果没有值可以返回了,就会抛出一个StopIteration异常。


python迭代器的优势:

  1、用for循环加列表,读取列表时会一次性加载所有值,占用内存过多;迭代器则是有需要时才生成一个值返回;

  2、对于没有索引的数据类型,必须提供一种不依赖索引的迭代方式。

缺点:
  1. 无法获取迭代器对象的长度;
  2. 不如序列类型取值灵活,是一次性的,只能往后取值,不能往前退。


每次调用__next__()方法的时候做两件事: 

  1. 为下一次调用__next__()方法修改状态
  2. 为当前这次调用生成返回结果

每次调用__iter__()时返回它本身。


# 用Fibonacci数列举例:

###########

class Fibonacci:

  def __init__(self):

    self.a = 0

    self.b = 1

 def __next__(self):

    #为下一次调用__next__()方法修改状态

    self.a, self.b = self.b, self.a+self.b

    #为当前这次调用生成返回结果

    return self.a

  def __iter__(self):

    return self

#生成一个斐波那契对象

fibs = Fibonacci()

#每次调用__next__方法返回下一个值,打印前10个斐波那契数

for i in range(10):

  print(fibs.__next__())

#找到第一个大于1000的斐波那契数后打印并跳出循环

for f in fibs:

  if f > 1000:

    print(f)

    break

###########

  安全问题运行结果不能上传,以后补充。

  Python3以后,range()和xrange()都成为了range(),也就是说现在range()返回的也是一个特殊迭代器。如果想返回列表,给它套一个list()。

 


  二、Python中的生成器(generator),是一个特殊的迭代器(延迟操作),首先任何包含yield语句的函数称为生成器。它不用return返回值,而是每次产生多个值。每次产生一个值(使用yield语句),函数就会被冻结:函数停在那点等待被重新唤醒。被重新唤醒后就从停止的那点开始执行。因此特别适合不想同一时间将所有计算出来的大量结果集分配到内存当中时的场景,特别是当结果集里还包含循环的时候。

  也就是说,yield是一个语法糖,内部实现支持了迭代器协议,同时yield内部是一个状态机,维护着挂起和继续的状态。

  yield的功能:
  1.相当于为函数封装好__iter__和__next__
  2.return只能返回一次值,函数就终止了,而yield能返回多次值,每次返回都会将函数暂停,下一次next会从上一次暂停的位置继续执行。


###########

# 生成器函数

def fibonacci(n):

  a = 0

  b = 1

  for i in rang(n):

    a, b = b, a+b

    yeild a

# 对内存非常友好,百万位也没问题

for i in fibonacci(1000000):

  print(i)


###########


 生成器推导式,和列表推导式的工作方式类似,不过将[]变成(),且返回的不是列表而是生产器,要想得到每一个元素,可以用循环或者next()。


###########

li = [1,2,3,4,5,6,7]

#生成器推导式,类似list,把[]改为()

gen = (a for a in li)

for x in gen:

  print(x)

# 使用生成器表达式取代列表推导式可以同时节省cpu和内存RAM

# 如果你构造一个列表的目的仅仅是传递给别的函数,如tuple()或set(),就用生成式表达式代替吧


#例如直接把列表转化为元组

q = tuple(a for a in li)

print(q)


#Python内置的一些函数可以识别这是生成器表达式,生成器表达式可以在当前圆括号内直接使用

result1 = sum(a for a in range(3))

print(result1)

#列表推导式

result2 = sum([a for a in range(3)])

print(result2)

############

之后补充n皇后的例子,因为Python语句的强大,比C++可以写得更简洁。



Python笔记:迭代器、生成器、修饰器 迭代器(iterators)迭代器有一个特点,就是每次迭代容器里的一个数,把容器里的数迭代完之后就会停止迭代,出现 StopIteration  异常。可以把迭代器理解为洗发水,每次挤一点,挤完了就剩下个空瓶,可以丢掉了。使用容器内置函数__iter__()可以直接生成迭代器,使用iter()函数也可以生成迭代器。>>> nums = [1, 2, 3] >>> iter(nums) 阅读详情

相关推荐

【Python3教程】Python3基础篇之迭代器与生成器

在Python3中,迭代器和生成器是处理序列数据的重要工具,它们提供了一种高效、节省内存的方式来遍历集合中的元素。

No8g攻城狮的博客 352

[Python]深入理解容器、迭代器与生成器

An object capable of returning its members one at a time. 可迭代的对象iterator表现为数据流(stream of data)的形式的对象,而像list、tuple、dict等对象,表现为容器对象(container).在上文,已经了解了iterable对象,如果要遍历取值的话,一般通过for语句的内部机制,将iterable对象转为iterator对象,再取值。

m0_59162248的博客 216

脑影像分析软件推荐 | JuSpace

JuSpace是一种允许基于 MRI 测量与核成像衍生估计的跨模态关联的工具包,它涵盖各种神经递质系统,包括多巴胺能、血清素能、去甲肾上腺素能和 GABA(γ-氨基丁酸) 神经传递。JuSpace 由一组 Matlab 功能以及涵盖各种受体系统的 PET 受体图谱组成。

NHKJ_ZF的博客 1708

python迭代器详解

python迭代器详细说明

ai领域探索者,欢迎一起交流,目前从事具身智能行业。 1万+

【UE5】UE5 Dedicated Server专用服务器与网络同步

这篇文章是个人在学习UE4的网络同步方面的内容的一些记录,因为UE5出来了,顺带也一起熟悉熟悉UE5,所以也就直接使用UE5来实践了。说句实在话,UE4网络同步这块确实挺难的,我自己在网上搜索的博客的内容要么停留在很浅层面只搭建一个ds服务器,要么就直接深入源码去剖析UE4的网络机制,处在中间层面的内容少之又少,不得不自己好一阵研究,强烈推荐这几位博主的博文,我在学习的过程中也从中受益匪浅。 Ken_An、风蚀之月、 刘东无敌还有我师傅推荐给我的一本关于UE4网络的PDF。 一、什么是Dedicated

Goulandis 3万+

经典算法之——解决全排列问题以及详解

回溯”指的是“状态重置”,可以理解为“恢复现场”,是在编码的过程中,是为了节约空间而使用的,而在递归或者深度优先中根据需要的场合来配合回溯法可以进一步对自己的代码进行优化。, n-1, n},方向都为向左。邻位对换法是全排列生成算法中的其中一种,它的换位是双向的,通过保存数字的“方向性”来快速得到下一个排列。最后以 3 开头的全排列为[3, 1, 2], [3, 2, 1];以 1 开头的全排列为[1, 2, 3], [1, 3, 2];以 2 开头的全排列为[2, 1, 3], [2, 3, 1];

m0_68987535的博客 8795

完全理解 python 中的容器、迭代器、生成器

完全理解 python 中的容器、迭代器、生成器 容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)在Python中,常见的容器对象有:list(列表),set(集合),di...

FreeSpider 2695

从DWS到设备树:MTK平台LK阶段GPIO初始化的隐秘路径与调试实战

本文深入探讨了MTK平台LK阶段GPIO初始化的完整流程,揭示了从DWS配置到设备树生成的隐秘转换路径。通过分析MT6768等平台的启动框架,提供了针对preloader到LK阶段GPIO初始化异常的实战调试方法与最佳实践,帮助开发者有效解决硬件与软件配置不匹配的常见问题。

h9j8k7l6m5n的博客 1003

python3:迭代器

python支持在容器上迭代,通过两个方法实现,允许用户自定义,序列总是支持迭代方法,后面介绍序列的时候会涉及更多的细节。 容器中的迭代 容器需要定义下面的方法以提供迭代支持: container.__iter__() 返回一个迭代器对象,对象要求支持后面介绍的迭代器协议。如果一个容器支持不同类型的迭代,需要提供额外的方法指定请求的迭代器类型(例如一个树结构支持两种迭代方式:广度优先和深度

宁静致远 3740

DCDC--控制方式(Control Mode)

DCDC反馈控制方式

网始如芯个人博客 1万+

基于STM32的汽车主门电动窗开关系统设计方案

以下是基于 STM32CubeMX 和 HAL 库的示例代码,可实现基本的功能。

weixin_42300449的博客 996

python三大神器之一(生成器)

13、生成器 13.1 创建生成器 简易生成器: list1 = [x for x in range(5)] print(list1) obj1 = (x for x in range(5)) #简易生成器 print(obj1) 展示: [0, 1, 2, 3, 4] <generator object <genexpr> at 0x0000026142D51318&gt...

Sahar_的博客 372

预测股票价格趋势:使用MATLAB进行股票价格预测

通过收集股票数据、数据预处理、构建预测模型以及可视化结果,我们可以利用MATLAB强大的计算和分析功能来预测股票价格的走势。然而,需要注意的是,股票市场具有高度复杂性和不确定性,预测结果仅供参考,并不构成投资建议。然而,借助计算机编程和数据分析工具,我们可以利用历史股价数据来建立模型,并预测未来的股票价格走势。首先,我们需要获取股票的历史价格数据。完成模型的拟合后,我们可以使用该模型来进行未来股票价格的预测。最后,我们可以使用MATLAB的绘图功能将预测的股票价格与实际股票价格进行对比,并进行可视化展示。

2301_79326588的博客 1018

【Python迭代器探秘】:揭秘迭代器与生成器的魔法,掌握高效循环的艺术

定义了一个 my_generator() 函数,它使用 while True 循环不断返回 yield 所产生的值,并在 yield 语句中使用变量 val 来接收 send() 方法所发送的值。与 next() 方法不同,send() 方法可以在生成器中接收一个值,并且该值会成为生成器中 yield 的表达式的结果。Python内置了很多支持迭代器模式的对象,同时也提供了一些常用的内置迭代器函数,包括map()、filter()、zip()和reversed()等。() 方法,即可满足迭代协议。

书山有路勤为径,学海无涯苦作舟。 3809

【LLC快速上手系列】LLC轻载时,死区时间怎么调才对?别再傻傻乱搞了!

死区时间,就是指。如果你死区设得好,就能让开通前 ( V_DS to 0 ),完美实现!

weixin_43199439的博客 1856

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Python中迭代器和生成器理解

容器是一种把多个元素组织在一起的数据结构。容器是包含其他对象的对象,本质是也类。具体的容器就是类的实例化。Python容器类在系统中提供了不同的方法来操作它们所包含的数据,比如添加、删除,查询等。它们都继承自Python的基类,实现了特定的协议(如迭代协议),从而可以进行遍历、索引等操作。迭代是通过重复执行的代码处理相似的数据集的过程,并且本次迭代的处理数据要依赖上一次的结果继续往下做,上一次产生的结果为下一次产生结果的初始状态,如果中途有任何停顿,都不能算是迭代。1) 非迭代例子loop = 0")

raowangcheng的专栏 2126

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Python 迭代器与生成器

在Python当中:迭代器是实现迭代器协议的对象,它包含方法__iter__()和__next__()

m0_74995879的博客 1652

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Python进阶————迭代器与生成器

Python中的迭代器与生成器的区别与联系

记录学习笔记 2178

Python中的可迭代对象:容器、迭代器与生成器

相互关系 关系图 让我们先看两张图, 这张图展示了它们得从属关系 这张图解释了他们之间的从属关系和转换关系 定义 (1)可迭代对象:其中实现了__iter__方法的对象就叫做可迭代对象。 ( 严格来说,可迭代对象是任何实现了 iter() 方法或者实现了序列(Sequence)语义中的 getitem() 方法的任意自定义类对象。) (2)迭代器:既实现了__iter__,也实现了__next__()方法的对象叫做迭代器; (3)生成器:具有yield关键字的函数都是生成器; 各种可迭代对象

xys430381_1的专栏 1422

3.0 Python 迭代器与生成器

当我们需要处理一个大量的数据集合时,一次性将其全部读入内存并处理可能会导致内存溢出。此时,我们可以采用迭代器`Iterator`和生成器`Generator`的方法,逐个地处理数据,从而避免内存溢出的问题。 迭代器是一个可以逐个访问元素的对象,它实现了`python`的迭代协议,即实现了`__iter__()`和`__next__()`方法。通过调用`__next__()`方法,我们可以逐个访问迭代器中的元素,直到所有元素都被访问完毕,此时再次调用`__next__()`方法会引发`StopIterati

微软技术分享 1万+

Python中生成器和迭代器的区别

Python中生成器和迭代器的区别:

IT晓可程序员之路 4万+

二十、深入Python迭代器和生成器

学习python的过程中,迭代器与生成器是绕不开的话题, 什么是迭代器和生成器呢?

微信号:RunsenLiu 1472

Python3 迭代器与生成器

在类中,我们实现了 __iter__() 和 __next__() 方法,其中 __iter__() 方法返回迭代器对象本身,__next__() 方法返回容器中的下一个元素。在 __next__() 方法中,我们使用一个 if 语句来判断迭代器是否已经遍历到了结束位置,如果是,则抛出 StopIteration 异常。其中,__iter__() 方法返回迭代器对象本身,__next__() 方法返回容器中的下一个元素。在类的 __init__() 方法中,我们初始化了迭代器的当前值和结束值。

smarten57的博客 966

python迭代器与生成器的区别

迭代器与生成器的区别:

yekuishu的专栏 5654

python容器和迭代器_Python 生成器 迭代器 容器之间的关系

一、关系图Python的数据结构容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器 (generator)、列表/集合/字典推导式(list,set,dict comprehension)之间的关系图二、容器容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用 in , not in 关键字判断元素是否包含在容器中。通常这类数...

weixin_39732316的博客 160
下一篇: 读取csv文件的指定行 python3
CaptainR9
博客等级 码龄11年 24粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值