首页 > 其他分享 >可迭代对象、迭代器、生成器

可迭代对象、迭代器、生成器

时间:2024-10-20 21:47:06浏览次数:6  
标签:迭代 对象 生成器 list yield 列表 my

可迭代对象

如果实现了__iter__方法,就认为对象是可迭代的. 使用内置的iter函数可以获取迭代器的对象.

  • 检查对象x是否为迭代器,最好的方式是 调用 isinstance(x, abc.Iterator)
  • 序列都是可迭代的

迭代器(Iterator):

  • 迭代器是一个对象,它实现了 iter() 和 next() 两个基本方法。
  • iter() 方法返回迭代器对象本身,用于判断一个对象是否是一个迭代器。
  • next() 方法返回迭代器的下一个元素。
  • 迭代器允许你逐个访问序列中的元素,直到所有元素都被访问完毕。
  • 迭代器可以是任何实现了这两个方法的对象,例如列表、元组、字典、集合等。

生成器(Generator):

  • 生成器是一种特殊的迭代器,它使用 yield 语句来产生值。
  • 生成器是使用函数定义的,当函数中出现 yield 语句时,它就变成一个生成器。
  • 当生成器函数被调用时,它返回一个生成器对象,而不是直接执行。生成器函数是生成器的工厂
  • 每次调用生成器的 next() 方法时,生成器函数会从上次 yield 语句处恢复执行,直到再次遇到 yield 语句或函数结束。
  • 生成器非常适合处理大数据集或无限序列,因为它不需要一次性将所有数据加载到内存中。

区别:

  • 内存使用:生成器通常比迭代器更节省内存,因为它们可以按需生成数据,而不是一次性生成所有数据。
  • 实现方式:迭代器可以由任何实现了 iter() 和 next() 方法的对象实现,而生成器是由包含 yield 语句的函数实现的。
  • 数据源:迭代器通常用于访问已经存在的数据集合,而生成器用于创建新的数据序列。
  • 函数和对象:迭代器是一个对象,而生成器是一个函数。
  • 迭代器也是可迭代对象,但是可迭代对象不是迭代器
  • 可迭代对象有一个__iter__方法,每次都实例化一个新的迭代器
    示例:
# 迭代器示例
my_list = [1, 2, 3, 4]
for item in my_list:
    print(item)

# 生成器示例
def my_generator():
    yield 1
    yield 2
    yield 3
    yield 4

gen = my_generator()
for item in gen:
    print(item)

在第一个示例中,my_list 是一个列表迭代器。在第二个示例中,my_generator 是一个生成器函数,每次调用时都会生成一个新值。

测试问题: 用迭代器和生成器实现列表的遍历?

迭代器和生成器都可以用于遍历列表,但是它们的实现方式不同。下面是两种方法的示例:
使用迭代器遍历列表
在 Python 中,列表(以及其他内置的集合类型,如元组、字典和集合)都是迭代器。你可以直接使用 for 循环来遍历它们。

# 定义一个列表
my_list = [1, 2, 3, 4, 5]

# 使用迭代器(for 循环)遍历列表
for item in my_list:
    print(item)

在这个例子中,my_list 本身就是一个迭代器,for 循环会自动调用 my_list 的 iter() 和 next() 方法来获取列表中的元素。
使用生成器遍历列表
生成器通常用于创建一个可以按需生成值的序列。如果你想要手动实现一个生成器来遍历列表,你可以定义一个生成器函数。

# 定义一个生成器函数来遍历列表
def list_generator(lst):
    for item in lst:
        yield item

# 创建一个列表
my_list = [1, 2, 3, 4, 5]

# 创建生成器对象
gen = list_generator(my_list)

# 使用生成器遍历列表
for item in gen:
    print(item)

在这个例子中,list_generator 是一个生成器函数,它接受一个列表作为参数,并使用 yield 语句逐个产生列表中的元素。当你创建 gen 对象时,它会按照 list_generator 函数的逻辑来生成值。
虽然在这个特定的例子中,使用生成器来遍历列表可能看起来有些多余,因为列表本身就是一个迭代器,但生成器在处理大型数据集或需要按需生成数据时非常有用。例如,如果你有一个非常大的文件列表,你可能不想一次性将它们全部加载到内存中,而是希望按需处理它们,这时生成器就会非常有用。

标签:迭代,对象,生成器,list,yield,列表,my
From: https://www.cnblogs.com/zyl007/p/18487972

相关文章

  • vue3 ref 或者reactive被赋值其他对象数据,用的是同一块内存,而不是深拷贝
    <template><divclass='box'>{{abcDemo?.a?.b?.c}}<button@click="changeAbc">ChangeABC</button><div>{{abdDemo?.a?.b?.c}}</div></div></template><sc......
  • 10.18Python基础迭代器生成器_函数式编程
    Python迭代器与生成器1.迭代器Iterator什么是迭代器迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器可以重复使用,而不会像列表那样在迭代时被修改。迭代器函数iter和next函数说明iter(iterable)从可迭代对象中返回一个迭代器,iterabl......
  • Unity3D c# 使对象物体始终面向摄像机
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassLookAtMainCamera:MonoBehaviour{ //Usethisforinitialization voidStart(){ } //Updateiscalledonceperframe voidUpdate(){......
  • Java面向对象之多态,向上转型我们大家庭的由来
    各位看官早安午安晚安呀如果您觉得这篇文章对您有帮助的话欢迎您一键三连,小编尽全力做到更好欢迎您分享给更多人哦大家好我们今天来学习Java面向对象的三大特性之一的继承,我们大家庭就要来啦~一:多态的概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当......
  • 三,Java面向对象的特点其三:多态
    Java面向对象:深入理解多态性在Java编程中,多态性(Polymorphism)是指同一个事物在不同时刻下的不同状态。多态性是面向对象编程中的一个重要概念,它允许我们根据需要在运行时动态地改变对象的行为。多态概述多态允许一个类有多个形态,即在运行时可以改变对象的行为。多态性是继承和方......
  • 16.java面向对象:面向对象的三大特征总结
    java面向对象:面向对象的三大特征面向对象的三大特征1.封装get和set规范属性的合法化2.继承类继承子类调用父类方法super的用法通过super调用父类public的属性super注意点super对比this方法重写静态方法中奇怪的现象非静态方法3.多态多态存在的条件多态中成员访问特点......
  • 14.java面向对象:继承
    继承继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。extands的意思是“扩展”。子类是父类的扩展。JAVA中类只有单继承,没有多继承!继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。继承关系的俩个类,一个为子类(派生类),一......
  • 面向对象 加法运算符重载
    ////Createdby徐昌真on2024/10/18.//#include<iostream>usingnamespacestd;//定义一个复数类classComplex{public:Complex():real(0),image(0){}Complex(intreal,intimage){//这是一个传参构造函数用于传入成员变量的值this-......
  • 面向对象综合训练
    练习1:文字版格斗游戏最原始的写法:Javabean类:importjava.util.Random;publicclassRole{privateintblood;privateStringname;publicRole(){}publicRole(intblood,Stringname){this.blood=blood;this.name......
  • QD1-P45 JS 练习、以及document对象
    title:QD1-P45JS练习、以及document对象description:本节学习:1、JavaScript简单练习。2、了解document对象。video:[https://www.bilibili.com/video/BV1n64y1U7oj?p=45](https://www.bilibili.com/video/BV1n64y1U7oj?p=45)subject:前端学习笔记1‍‍......