Python基础 G-01 列表生成式&生成器&迭代器

Python基础-生成器/迭代器/作用域/闭包/装饰器(14) 生成器(generator) py中把一边循环一边计算的机制称为生成器,你不调用它,他就不进行计算。 使用next()函数获取生成器的下一个返回值 生成器是一个对象 当迭代到生成器最后一个对象时,继续迭代会抛出StopIteration异常 生成器是可以使用for循环的,因为生成器是可迭代对象。 生成器只能使用一次 特点: 节约内存 迭代到下一次的调用时,所使用的参数都是第一次所保留下来的 生成器的创建: lambda表达式创建生成器 a=(x for x in range(2)) %创建生成 阅读详情

列表生成式&生成器&迭代器

一、列表生成式

Python内置的一种极其强大的生成列表 list 的表达式。返回结果必须是列表。

1.1、基本语法

[ 变量表达式 for 变量 in 表达式 ]

1.2、示例

a = [x ** 2 for x in range(1, 10)]
b = [x * x for x in range(1, 11) if x % 2 == 0]
c = [m + n for m in 'ABC' for n in '123']
d = {'Java': "99", 'C': "99", 'C++': "99"}
L = [k + '=' + v for k, v in d.items()]
print(a)
print(b)
print(c)
print(L)

1.3、说明

这样的写法就叫做列表生成式。通过列表生成式,可以直接创建一个列表。

二、生成器(generator)

2.1、背景

前面我们学习到了,通过列表生成式,我们可以直接创建一个列表。但是,受到内存的限制,列表容量是有限的,当列表元素很大的时候,会很浪费内存空间。(如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了)。为了解决这种问题,在Python中,提供了生成器(generator),生成列表的前几个元素,当需要用到后面的时候,在计算生成。从而节省内存空间。

2.2、定义

在Python中,这种一边循环一边计算后面元素的机制,称为生成器:generator。

2.3、使用

2.3.1、如何创建生成器
a、使用()类似列表生成式的生成器
使用方法

把列表生成式的中括号 [] 修改为圆括号即可 ()

代码示例
a = (x ** 2 for x in range(1, 10))
b = (x * x for x in range(1, 11) if x % 2 == 0)
c = (m + n for m in 'ABC' for n in '123')
d = {'Java': "99", 'C': "99", 'C++': "99"}
L = (k + '=' + v for k, v in d.items())
print(a)
print(b)
print(c)
print(L)

输出结果:

<generator object <genexpr> at 0x1052ec2b0>
<generator object <genexpr> at 0x1052ec468>
<generator object <genexpr> at 0x1052ec4c0>
<generator object <genexpr> at 0x1052ec518>
b、使用包含 yield 关键字的函数生成器
背景

generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。比如,著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13, 21, 34, … 这个就无法使用类似列表生成式定义。就要使用到函数生成器
实现100以内的斐波那契数代码:

def fib(max):
    a,b = 0,1
    n = 0  # 斐波那契数
    while n < max:
        n = a + b
        a = b # 把b的旧值给到a
        b = n # 新的b = a + b(旧b的值)
        print(n)
fib(100)
使用方法

在上述代码中,添加 yield 关键字,我们就可以将该函数变为函数生成器。

代码示例
def fib(max):
    a,b = 0,1
    n = 0  # 斐波那契数
    while n < max:
        n = a + b
        a = b # 把b的旧值给到a
        b = n # 新的b = a + b(旧b的值)
        #print(n)
        yield n # 程序走到这,就会暂停下来,返回n到函数外面,直到被next方法调用时唤醒
f = fib(100) # 注意这句调用时,函数并不会执行,只有下一次调用next时,函数才会真正执行
print(f)
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())

输出结果:

1
2
3
5
说明

这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:
这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句暂停并返回数据到函数外,再次被next()调用时从上次返回的yield语句处继续执行。

2.3.2、如何访问生成器中的元素
a、使用 next 调用元素
作用:
  • next 方法会一个个的返回元素值,调用一次,返回一次下一个位置的元素。
  • 该方法在没有元素可以调用的时候,会返回 StopIteration 的错误
代码示例
>>> g = (x * x for x in range(10))
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
49
>>> next(g)
64
>>> next(g)
81
>>> next(g)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration
b、使用for循环遍历
作用
  • 上面这种不断调用next(g)实在是太变态了,正确的方法是使用for循环,因为generator也是可迭代(遍历)对象
  • 通过for循环来迭代它,就不需要关心StopIteration的错误了。
代码示例
>>> g = (x * x for x in range(10))
>>> for n in g:
...     print(n)
...
0
1
4
9
16
25
36
49
64
81

三、迭代器

3.1、可迭代对象(Iterable)

3.1.1、什么是可迭代对象

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

  • 一类是集合数据类型,如list、tuple、dict、set、str等;
  • 一类是generator,包括生成器和带yield的generator function。
    这些可以直接作用于for循环的对象统称为可迭代对象:Iterable,可迭代的意思就是可遍历、可循环。
3.1.2、如何判断可迭代对象

可以使用isinstance()判断一个对象是否是Iterable对象:

代码示例
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False

3.2、迭代器(Iterator)

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

字符串,列表或元组对象都可用于创建迭代器:

>>> list=[1,2,3,4]
>>> it = iter(list)    # 创建迭代器对象
>>> print (next(it))   # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>
b、创建类迭代器
说明

把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。

  • __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
  • __next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。
    创建一个返回数字的迭代器,初始值为 1,逐步递增 1:
代码示例
class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    x = self.a
    self.a += 1
    return x
 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

输出结果:

1
2
3
4
5
补充

StopIteration异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
代码示例:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
  print(x)
3.2.3、迭代器元素访问
使用 next() 函数
#!/usr/bin/python3
 
import sys         # 引入 sys 模块
 
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
 
while True:
    try:
        print (next(it))
    except StopIteration:
        sys.exit()
使用常规for语句进行遍历
#!/usr/bin/python3
 
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")
3.2.4、总结
  • 凡是可作用于for循环的对象都是Iterable类型;
  • 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
  • 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
快速学习Python之迭代器和生成器 迭代器什么是可迭代对象?我们知道list、tuple、dict、set、str可以用for循环遍历,这种遍历称为迭代(Iteration),被遍历的list或tuple等被称为可迭代对... 阅读详情

相关推荐

告别手动归档:基于Allegro Skill的XTools一键生成Gerber与生产文件实践

本文详细介绍了基于Allegro Skill的XTools工具如何实现一键生成Gerber与生产文件,大幅提升PCB设计效率。通过自动化流程,解决了传统手动归档中的重复劳动、人为失误和标准不统一等问题,特别适合需要频繁输出生产文件的工程师。文章包含安装配置、实战操作、问题排查及进阶技巧,帮助用户快速掌握这一高效工具。

weixin_30505225的博客 460

Python基础学习06(列表生成式&生成器&迭代器)

Python基础学习06 ppt看完了8,看到9 列表生成式 简而言之,用来创建list的生成式 举个栗子,不使用列表生成式时 E.g &amp;gt;&amp;gt;&amp;gt;list(range(1,11)) &amp;gt;&amp;gt;&amp;gt;L=[] &amp;gt;&amp;gt;&amp;gt;for x in range(1,10) L.append(x*x) &amp;gt;&amp;gt;&amp;gt;L 使用列表生成式 &amp;gt;&amp;gt;&amp;

weixin_43420243的博客 151

智能车实战——极速越野组GPS与惯导融合定位导航全解析

本文深入解析了智能车极速越野组中GPS与惯导模块的融合定位导航技术。通过对比GPS的全局定位与惯导的高频姿态感知,详细阐述了如何利用MM32SPN27主控,将两者数据融合以实现精准、实时的车辆控制。内容涵盖硬件选型、软件数据处理、PID控制及系统调试等实战环节,为智能车开发者提供了一套完整的解决方案。

pz8901234的博客 1203

python之列表生成式、生成器、可迭代对象及迭代器详解

列表生成式 所谓的列表生成式,顾名思义,就是说可以生成list列表的表达式,是Python内置的非常简单却强大的可以用来创建list的生成式 基本的一个语法如下: [变量表达式 for 变量 in 表达式 if 判断条件] 本质就是将for循环强制性写在一行,把结果写在for循环的最前面,然后使用[]括起来, 得到的就是一个由结果集组成的一个列表 案例1:实现list1 = [1,4,9,16,...

TaoismHuang的博客 377

主流仿真软件Sigrity/HFSS/Siwave/Hyperlynx/ADS差异

在电子设计自动化(EDA)领域,各种仿真软件如Cadence Sigrity、Mentor Graphics的HyperLynx、Keysight的ADS以及ANSYS的SIwave等,都广泛应用于不同的应用场景中。综上所述,这些EDA仿真软件在各自的应用场景中发挥着重要作用,帮助工程师在设计阶段就能够评估和优化电子产品的性能,提高设计的可靠性和效率。:Sigrity由全球最大的EDA公司Cadence推出,Cadence还推出了Orcad和Allegro等著名软件。:由安捷伦(现是德科技)公司开发。

Geektec的专栏 9402

Frenet坐标系下动态街道场景的最优轨迹生成

本文详细解读了Lattice Planner

BigDavid123的博客 2390

Python高级:迭代器与生成器(全面解析)

迭代器与生成器一、知识目标二、知识点01、生成器①、生成器表达式②、yield函数02、迭代器 一、知识目标 1、掌握可迭代对象、迭代器与生成器的概念 2、理解可迭代对象的分类方法 3、掌握迭代器与生成器的使用 二、知识点 01、生成器 ①、生成器表达式 ②、yield函数 02、迭代器 ...

Argonaut_的博客 5507

全志 mipi屏幕和触摸驱动调试记录

mipi屏幕与触摸调试记录

u011996684的博客 3217

python 生成器和迭代器

生成器和迭代器,斐波那契数列

m0_51736952的博客 2703

YOLOv8改进 - 注意力篇 - 引入CAA注意力机制

YOLOv8改进 - 注意力篇 - 引入CAA注意力机制

浪子L的博客 5223

livox雷达斜装修改

指的是,使用外部的陀螺仪的话,雷达到外部陀螺仪的转换,而mid360的陀螺仪是内置在360里面的,且方向和点云方向是一致的,所以不能通过修改此处去改变陀螺仪方向。同时livox_ros_driver2中的MID360_config.json里面的。这里面的外参,只能改变点云相对陀螺仪的位姿,而不能将陀螺仪映射到你期望的倾斜角度。fast_lio中的mid360.yaml中的外参。

z1872385的博客 2708

Python自学记录——列表生成式、生成器、迭代器

前段时间因工作问题和家中的电脑无法开机,学习Python的计划搁置了一段时间。借此感觉到以前学习的速度过慢,为了达成自己制定的学习目标,决定延长每次Python的学习时间,增加记录内容。下面正题开始: 列表生成式 即快速生成 list 的写法,它内置于Python中,简单又强大。 举个例子,生成一个数字1到10的列表,写法如下: L = range(1,11) L [1,2,3,4,5,...

qq_37647296的博客 346

YOLOv8独家原创改进:原创自研 | 自研独家创新DSAM注意力 ,基于BiLevelRoutingAttention注意力升级

提出新颖的注意力DSAM(Deformable Bi-level SpatialAttention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的Deformable Bi-level Attention+Spartial Attention

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1511

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

python3之路 基础-生成器、迭代器

列表生成式 在总结迭代器、生成器先总结一个小知识【列表生成式】 #第一种生成列表方法 a = [1,2,3,4,5] #第二种生成列表方法 [i for i in range(1,6)] #灵活的体现 [func(i) for i in range(1,6)] 上面两个列表的结果是一样的,但是第二种会更加灵活,而且是代码更简洁。这就是列表生成式。 生成器 通过列表生成式,我们可以直接创建一个列表...

weixin_43947279的博客 194

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Python——生成器和迭代器

一、生成器 列表元素可以按照某种算法推算出来,可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。 第一种创建方法,只要把一个列表生成式的[]改成(),就创建了一个generator: &gt;&gt;&gt; L = [x * x for x in range(10)] &g...

Vici__ 402

IEM模型,地表粗糙度模拟

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

python基础(12迭代器&生成器)

本文主要介绍什么是可迭代对象、迭代器对象,两者之间的区别和用法,以及什么是生成器,生成器的表达式等知识点。本文首先简单介绍了什么是可迭代对象、以及什么是迭代器对象。迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象。生成器本身也是一种迭代器。

637

Python基础之列表,元组,字典,集合,推导式,迭代器

序列是Python中最基本的数据结构序列中的每个值都有对应的位置值,称之为索引,第一个索引是0,第二个索引是 1,依此类推。Python有 6 个序列的内置类型,但最常见的是列表和元组列表都可以进行的操作包括索引,切片,加,乘,检查成员。此外,Python已经内置确定序列的长度以及确定最大和最小的元素的方法。列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。列表的数据项 不需要具有相同的类型创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。

上善若泪 1290

迭代器和生成器

迭代器就是用来迭代取值的工具,而迭代是重复反馈过程的活动其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复不是迭代​index = 0print(goods[index]) # 将列表中每一个元素都单独输出一次index += 1通过索引的方式进行迭代取值,很简单但仅适用于序列类型:字符串,列表 ,元组。对于没有索引的字典、集合等非序列类型。

g1446992400的博客 869

Python记录12:迭代器+生成器+生成式

'''1. 什么是迭代器 什么是迭代:迭代就是一个重复的过程,但是每一次重复都是基于上一次的结果而进行的 单纯的重复不是迭代: while True: print(1) 迭代的过程 l=['a','b','c'] i=0 while i ...

81

python遍历二维秋天_【python】迭代器&生成器

源Link:http://www.cnblogs.com/huxi/archive/2011/07/01/2095931.html迭代器迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么, 因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时...

weixin_34669890的博客 296

python列表推导式随机数列_Python函数——列表推导式、生成器与迭代器

列表推导式产生背景现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求你把列表里的每个值加1,你怎么实现?第一种方法:a = [1,3,4,6,7,7,8,9,11]for ind, val inenumerate(a):a[ind]+= 1print(a)第二种方法:a = [1,3,4,6,7,7,8,9,11]print(list(map(lambda x:...

weixin_39586395的博客 669

python生成器和迭代器作用_如何更好的理解Python 生成器和迭代器,yield语句

什么是迭代器顾名思义,迭代器就是用于迭代操作(for 循环)的对象,它像列表一样可以迭代获取其中的每一个元素,任何实现了 __next__ 方法 (python2 是 next)的对象都可以称为迭代器。它与列表的区别在于,构建迭代器的时候,不像列表把所有元素一次性加载到内存,而是以一种延迟计算(lazy evaluation)方式返回元素,这正是它的优点。比如列表含有中一千万个整数,需要占超过40...

weixin_39607450的博客 141

Python迭代器和生成器

在Python中,迭代器、生成器毫无疑问是最有用的特性之一,功能也非常强大,在Python中经常出现,但是常常被我们忽视,或者说不太理解它们的原理机制,本文就围绕迭代器、生成器、可迭代对象这些来详细阐述一下它们之间的关系以及它们的强大之处。 可迭代对象 说到迭代器和生成器,一定绕不过去的点就是可迭代对象,那么什么是可迭代对象呢,最简单的解释就是:可以使用for···in···语句进行循环的对象,就是可迭代对象,像我们熟知的字符串、列表、元组、字典等都属于可迭代对象。 那么如何判断一个对象是否属于可迭代

weixin_50097774的博客 308

Python学习:迭代器与生成器

Python学习:迭代器与生成器

Python热爱者的博客 149

生成器 python0 1 8 27 64_【python】迭代器&生成器

源Link:http://www.cnblogs.com/huxi/archive/2011/07/01/2095931.html迭代器迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么, 因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时...

weixin_39603604的博客 122
上一篇: Python基础 F-04 函数-闭包与装饰器
下一篇: Python模块 A-01 模块与包介绍
无魂冬冬
博客等级 码龄14年 4粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值