首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

学习Python一年,基础忘记了,看看面试题回忆回议,Python面试题No3

要创建定制的迭代器,可以编写一个具有next方法的类。...实际上,在使用next()函数的时候,调用的就是迭代器对象的__next__方法(Python3中是对象的__next__方法,Python2中是对象的next()方法)。...但这还不够,python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现__iter__方法,而__iter__方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可...定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。 _iter_() 该方法返回的是当前对象的迭代器类的实例。...; 对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。

48441
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python面向对象编程-魔术方法-__iter__和__next__方法(一)

    在Python面向对象编程中,魔术方法是一种特殊的方法,其名称以双下划线开头和结尾。这些方法在类定义中使用,用于定义对象的行为。...其中,__iter__和__next__方法是用于定义迭代器对象的魔术方法,它们在for循环中起到重要作用。__iter__方法是迭代器对象的入口点,用于返回一个迭代器对象。...在调用for循环时,Python会自动调用对象的__iter__方法获取迭代器对象,并依次调用其__next__方法获取每个元素,直到所有元素都被遍历完毕。...在__init__方法中,我们初始化了迭代器的起始值、结束值和当前值。在__iter__方法中,我们直接返回了迭代器对象自身,因为OddIterator类本身就是一个迭代器对象。...需要注意的是,在实现__next__方法时,我们需要将当前值更新为下一个奇数,以便下一次调用__next__方法能够正确返回下一个元素。

    45131

    python迭代器与生成器

    # 迭代器和可迭代对象 实现了__iter__的对象是可迭代对象. 实现了__iter__和__next__的是迭代器....两者之间的关系: Python从可迭代的对象中获取迭代器 可迭代对象的抽象基类是abc.Iterable 迭代器的抽象基类是abc.Iterator # 如何实现迭代器?...定义__iter__方法返回带有__next__方法的对象,__iter__可以简单的返回self. 当没有数据返回时,会抛出StopIteration异常停止返回数据。...就是生成器函数 # 生成器函数创建生成器 下面的__iter__是一个生成器函数,通过该生成器函数创建生成器对象,包装生成器函数的定义。...(i for i in range(10)) 虽然下面的__iter__没有yield关键字,但是却有具有生成器表达式,所以__iter__得到的也是一个生成器对象。

    23620

    Python基础-9 类

    ---- 面向对象有一些特定的术语,如类、方法、数据成员等,Python3 面向对象 | 菜鸟教程 (runoob.com)。可以搜索面向对象等关键字找到这些概念。...3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx : ---- 派生类的执行过程: 派生类定义的执行过程与基类相同。...方法引用将按以下方式解析:搜索相应的类属性,如有必要将按基类继承链逐步向下查找,如果产生了一个函数对象则方法引用就生效。 派生类可能会重写其基类的方法。...因为方法在调用同一对象的其他方法时没有特殊权限,所以调用同一基类中定义的另一方法的基类方法最终可能会调用覆盖它的派生类的方法。 在派生类中的重载方法实际上可能想要扩展而非简单地替换同名的基类方法。...带有多个基类的类定义语句如下所示: class 派生类(基类1, 基类2, 基类3): 一些语句 #需要用 基类1.方法 来调用基类方法 例如: class A: def __init

    36450

    魔法方法(2)

    (可以将这个属性替换成更有趣的属性,如矩形的面积或其对角线的长度。)这些代码并非完全错误,但存在缺陷。使用这个类时,程序员应无需关心它是如何实现的(封装)。...如果你编写了一个类,如前面的Rectangle类,只需再添加一行代码。...---- 注意 如果特性的行为怪异,务必确保你使用的是新式类(通过直接或间接地继承object或直接设置__metaclass__)。...---- __getattr__、__setattr__等方法 可以拦截对对象的所有访问企图,其用途之一是在旧式类中实现特性(在旧式类中,函数property的行为可能不符合预期)。...---- 注意 在Python3中,迭代器协议有细微的变化。在以前的迭代器协议中,要求迭代器对象包含方法next而不是__next__。 ---- 这有什么意义呢?为何不使用列表呢?

    72730

    Python学习笔记整理(十五)类的编写

    2、其他方法调用的可能。 这种通过类调用方法的模式(类中调用类的方法(不一定自己)),是扩展继承方法行为(而不是完全取代)的 一般基础。...Python2.2新增的选项:静态方法、可以编写不预期第一个参数为实例对象的方法。这类方法可像简单 的无实例的函数那样运作,其变量名属于其所在类的作用域。不过,这是高级的选用扩展功能。...但是取代时,Sub又回调了Super所导出的版本,从而实现了默认的行为,换句话说,Sub.mothod只是扩展了Super.mothod的行为,而不是完全取代他。...抽象类就是会调用方法的类,但没有继承或定义该方法,而是期待该方法由子类填补。当行为无法预测,非得等到更为具体的子类编写时才知道,可用这种方式把类通用化。这种“填空”的代码结构一般就是OOP软件的框架。...__add__) __iter__    迭代环境        用于循环,测试,理解,列表,映射及其他 所有重载方法的名称前后都有两个下划线字符,以便把同类中定义的变量名区别开来。

    91410

    Python的迭代器协议

    迭代器是Python中的一个高级概念,迭代器是一个实现了迭代器协议的对象,那何为迭代器协议呢? 满足下面两个条件就行。...(1)该对象实现了__iter__()方法;(2)该对象实现了next()方法,返回当前元素,并指向下一个元素的位置,如果当前位置已无元素,则抛出StopIteration异常。 看下面例子 ?...占用的内存并没有因为元素的增多而增加,所以在编写代码时要多多使用迭代器或者迭代协议。...Python中内置了一个iter()函数,可以返回一个迭代器对象,它接受的参数是一个实现了__iter__()方法的容器(也就是可迭代对象)或者迭代器。...对于有__iter__()方法的容器,__iter__()也返回一个迭代器对象。 python中有itertools模块,里面的函数都是用迭代器实现的,效率很高,有时间你可以去了解下。

    1.1K10

    Python中怎么判断一个对象是否为可迭代对象?

    以下是几种常见的方法: ### 方法一:使用 `collections.abc` 模块中的 `Iterable` 抽象基类 通过 `collections.abc` 模块中的 `Iterable` 抽象基类...collections.abc.Iterable来检查对象是否是可迭代的,存在一些局限性和潜在的漏洞:不是所有可迭代对象都继承自Iterable: Python中的迭代器协议定义了一个对象是可迭代的,如果它有一个...__iter__()方法或者一个__getitem__()方法。...例如,一些自定义的迭代器类可能直接实现了__iter__()或__getitem__()方法,而没有显式地继承Iterable。...:检查对象是否实现了 `__iter__` 或 `__getitem__` 方法 可迭代对象通常实现了 `__iter__` 方法(返回一个迭代器),或者实现了 `__getitem__` 方法(支持通过索引访问元素

    51810

    PyTorch 小课堂开课啦!带你解析数据处理全流程(一)

    和 DataLoader 这三个类中都会用到包括 __len__(self),__getitem__(self) 和 __iter__(self) 的抽象类的魔法方法。...· __getitem__(self):定义获取容器中指定元素时的行为,相当于 self[key] ,即允许类对象拥有索引操作。 · __iter__(self):定义当迭代容器中的元素时的行为。...· 可迭代对象(Iterable):一般指含有 __iter__() 方法或 __getitem__() 方法的对象。...一个容器或者类如果是迭代器,那么就必须实现 __iter__() 方法以及重点实现 __next__() 方法,前者会返回一个迭代器(通常是迭代器对象本身),而后者决定了迭代的规则。...· Python3 中, next() 内置函数调⽤的是对象的 __next__() ⽅法,iter() 内置函数调⽤的是对象的 __iter__() ⽅法。

    1.1K10

    迭代器

    迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的。如计算机中的迭代开发,就是基于软件的上一个版本更新。...特点: 内置有__iter__方法的都叫可迭代的对象。 ? 迭代器对象(掌握) 只有字符串和列表都是依赖索引取值的,而其他的可迭代对象都是无法依赖索引取值的。...因此我们得找到一个方法能让其他的可迭代对象不依赖索引取值。 在找到该方法前,首先我们给出迭代器对象的概念:可迭代的对象执行__iter__方法得到的返回值。...特点: 内置__next__方法,执行该方法会拿到迭代器对象中的一个值 内置有__iter__方法,执行该方法会拿到迭代器本身 文件本身就是迭代器对象。...如lis = [1,2,3,4,5,...]相当于一个一个鸡蛋,而lis = [1,2,3,4,5,...].__iter__相当于一只老母鸡,如果你需要蛋,只需要__next__即可。

    52830

    Python: 对迭代器的小结

    迭代器 迭代器是在python2.2中被加入的,它为类序列对象提供了一个类序列的接口。有了迭代器可以迭代一个不是序列的对象,因为他表现出了序列的行为。...如何迭代 本质上说迭代器是个对象,但是这个对象有个特殊的方法next()(在python3中使用__next__()代替了next方法)。...__iter__()和__next__(),这两个方法便是支持迭代器协议所需要实现的方法。...创建迭代器对象 除了使用iter()函数将内置的序列对象转换成相应的迭代器,我们可以自己实现迭代器协议创建迭代器对象,要实现迭代器协议也就是要在类中实现__iter__()和__next__()方法。...迭代器对象是实现了__next__()方法的对象,其中他的__iter__()返回的是迭代器对象本身。

    75960

    python的抽象基类

    与jvm上的语言不一样,python的语言没有interface关键字,而且除了抽象基类,每个类都有相应的接口:类实现或继承的公开属性(方法或数据类型) 在定义里,受保护的属性和私有属性不在接口中:即便...__setitem__ = setitem shuffle(a) 9 19 10 setitem的参数的名只是约定一样,只不过python会往里面传参数,类的方法本质上也只是一个函数而已。...“鸭子类型”:忽略对象的真正类型,转而关注对象有没有实现所需的方法,签名和语义。 继承抽象基类很简单,只要实现python里的特殊方法__len__之类的,这样python就会自动识别。...抽象基类的继承大多都是在collections模块,现在打开这个模块的文档看看。...,一共有16个基类,分为三层: --顶层是Iterable,Container,Sized,Callable,Hashable: 其中Iterable,Container,Sized是各个集合该继承的三个抽象基类

    89810

    Python迭代和解析(2):迭代初探

    for的关键字在于"迭代"和"遍历"。首先要有容器数据结构(如列表、字符串)存储一些元素供迭代、遍历,然后每次取下一个元素通过in来测试元素的存在性(从容器中取了元素为何还要测试?...,每次读完一行就将指针指向那一行的后面做下标记,以便下次能从这里开始继续向后读取一行。...这里只是解释这几个概念和__iter__()、__next__(),在后面会手动编写这两个方法来自定义迭代对象。...再者,它的__iter__()返回的是自身,而自身又实现了这两个方法,所以它是可迭代对象: >>> f = open('a.txt') >>> f....关于iter(), __iter__(), next(), __next__(),它们两两的作用是一致的,只不过基于类设计的考虑,将__iter__()和__next__()作为了通用的类型对象属性,而额外添加了

    81220

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

    一、迭代器的基本概念 迭代器是Python语言中的一个重要特性,用于遍历可迭代对象(如列表、元组、字典等)中的元素。...1.2 迭代器的编写方法 迭代器的编写方法非常简单,只需要定义一个支持__iter__()和__next__()方法的类即可。...for char in my_iterator: print(char) 自定义了一个迭代器类MyIterator,并在其中实现了__iter__()和__next__()方法。...序列类型,如 list、tuple 和 string; 非序列类型,如 dict、set、file 等。...通过调用 next() 方法启动生成器后,我们可以使用 send() 方法向其发送数据,从而在每次调用时产生新值。同时,我们还可以通过判断接收到的值是否为空来控制程序的行为。

    17510

    第二章、深入类和对象

    __getitem__方法,它就是可迭代的,并不关心对象的本身,只关心行为,然后就可以当做extend的参数。...抽象基类就是定义各种方法而不做具体实现的类,任何继承自抽象基类的类必须实现这些方法,否则无法实例化 (1)判断类时候有某种属性 #判断类是否有某种属性 class Company(object):...,方法也是类的属性 print(hasattr(com,"__len__")) #True #虽然用hasattr可以判断,但正确的方式是定义一个抽象基类 #我们在某些情况下希望判定某个对象的类型...#模拟一个抽象基类 #写一个抽象基类,它的子类必须要重写抽象基类里面的方法 import abc #定义一个抽象基类 class CacheBase(metaclass=abc.ABCMeta):...set(self,key,value): # pass redis_cache = RedisCache() #模拟一个抽象基类 #写一个抽象基类,它的子类必须要重写抽象基类里面的方法

    91300
    领券