Python笔记(4):面向对象,迭代器,生产器

第4关:迭代器 本关的编程任务是补全ListCalculate.py文件中的部分代码,具体要求如下: 当输入一个列表时,填入将列表List转换为迭代器的代码; 填入用next()函数遍历迭代器IterList的代码。 阅读详情

Python 构造函数:

class FooBar:
    def __init__(self):
        self.somevar = 42
运行结果
>>> f = FooBar()
>>> f.somevar
42

接受参数的构造函数:

class FooBar:
    def __init__(self, value=42):
        self.somevar = value
结果:
>>> f = FooBar('This is a constructor argument')
>>> f.somevar

析构函数

__del__

由于Python有carbage colletion的机制,所以,建议尽量不要使用析构函数

调用超类super的构造函数

由于在子类中,超类的构造函数被重载,所以超类构造函数里面定义的变量,在子类中都不会声明,要避免这种情况,需要在子类的构造函数中调用超类的构造函数,这里有两种方法。
第一种,直接利用超类名来构造。
class SongBird(Bird):
    def __init__(self):
        Bird.__init__(self)
        self.sound = 'Squawk!'
    def sing(self):
        print self.sound

第二种方法,利用super函数。
__metaclass__ = type # super only works with new-style classes
class Bird:
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
        print 'Aaaah...'
        self.hungry = False
        else:
        print 'No, thanks!'
class SongBird(Bird):
    def __init__(self):
        super(SongBird, self).__init__()
        self.sound = 'Squawk!'

        def sing(self):
                print self.sound

最好使用super函数的方法,这有很多好处,特别是在有多个超类的时候。

Basic Sequence and Mapping protocol

Sequence 和 Mapping是最基本的数据的集合。要实现他们的行为,如果是immutable的需要完成两个protocol,如果是mutable的话需要完成4个protocol

__len__(self): 用来返回集合中的元素个数,如果是Sequence的话,返回值则是Sequence里面的元素的个数,如果是Mapping的话,返回的值是key-value对的数目。如果__len__返回0,那么在需要布尔值的情况会转换为false。.
__getitem__(self, key): 用来返回key所对应的值。入股是Sequence,这个key就是一个小于元素个数的整数。如果是mapping那么就可以是任意一个值。

__setitem__(self, key, value): 将value存储在key所对应的位置。
__delitem__(self, key): 当使用del语句时,用来删除key对对应的元素。

exstra:

在一个Sequence中如果这个整数是一个负数,那么则相当与从底端开始x[-n] 相当与x[len(x)-n]

当键值不匹配的时候抛出一个TypeError异常

当索引的类型正确,但是越界了,则抛出一个IndexError

下面是一个无穷数列的代码:

def checkIndex(key):
    """
    Is the given key an acceptable index?
    To be acceptable, the key should be a non-negative integer. If it
    is not an integer, a TypeError is raised; if it is negative, an
    IndexError is raised (since the sequence is of infinite length).
    """
    if not isinstance(key, (int, long)): raise TypeError
    if key<0: raise IndexError
class ArithmeticSequence:
   def __init__(self, start=0, step=1):
      """
      Initialize the arithmetic sequence.
      start - the first value in the sequence
      step - the difference between two adjacent values
      changed - a dictionary of values that have been modified by
      the user
      """
      self.start = start
      # Store the start value
      self.step = step
      # Store the step value
      self.changed = {}
      # No items have been modified
   def __getitem__(self, key):
      """
      Get an item from the arithmetic sequence.
      """
      checkIndex(key)
      try: return self.changed[key]           # Modified?
      except KeyError:                             # otherwise...
         return self.start + key*self.step    # ...calculate the value


    def __setitem__(self, key, value):
        """
        Change an item in the arithmetic sequence.
        """
        checkIndex(key)
        self.changed[key] = value             # Store the changed value
结果:

>>> s = ArithmeticSequence(1, 2)
>>>s[4]
9
>>>s[4] = 2

>>>s[4]
2
>>>s[5]
11


类中的属性,用访问器(accessor)来访问的话,可以通过property函数来使得他与普通的属性访问方法相同,比如:
__metaclass__ = type
class Rectangle:
    def __init__(self):
        self.width = 0
        self.height = 0
    def setSize(self, size):
        self.width, self.height = size
    def getSize(self):
        return self.width, self.height
    size = property(getSize, setSize)

运行结果:

>>> r = Rectangle()
>>> r.width = 10
>>> r.height = 5
>>> r.size
(10, 5)
>>> r.size = 150, 100
>>> r.width
150

访问起来,类似于C++中重载了 =操作符,一点要注意的是property函数第一个参数是getter,第二个是setter,还有这是new style的class。

property可以接受,0个,1个,2个,3个和四个参数,四个参数分别为fget, fset, fdel, doc,如果是0个参数,那么就不可读也不可写,如果是1个参数,那么是只读;两个参数是可读可写,三个参数是可以删除,第四个是document。

静态方法(static method)和类方法(class method)

静态方法和类方法可以直接通过类来访问,静态方法不需要参数,类方法需要一个类似与self的参数cls。定义的方法如下:
__metaclass__ = type
class MyClass:
        def smeth():
            print 'This is a static method'
            smeth = staticmethod(smeth)
        def cmeth(cls):
            print 'This is a class method of', cls
            cmeth = classmethod(cmeth)

2.4以后的版本,提供了一种新的定义方法,如下:
__metaclass__ = type
class MyClass:
    @staticmethod
    def smeth():
        print 'This is a static method'
    @classmethod
    def cmeth(cls):
        print 'This is a class method of', cls

运行的结果如下:

>>> MyClass.smeth()
This is a static method
>>> MyClass.cmeth()
This is a class method of <class '__main__.MyClass'>

由于一些历史原因python静态方法和类方法用的不是很多,但是现在在一些特殊场合,比如工厂方法的时候,经常使用。


 迭代器(iterator)

除了List和dict以外,其他的对象也能迭代,只要实现了__iter__这个magic 方法,__iter__不不接收参数,返回一个任意实现了next方法对象的迭代器。next()函数用来返回迭代器的“下一个值“,如果下一个值不返回任何的东西的话,需要抛出一个StopIteration的异常。

在python3.0中迭代器协议发生了改变, 迭代的对象需要实现__next__函数,而不是next,next()是一个新的内嵌函数比如next(it)等价与之前版本的it.next().

下面是一个无穷队列Fibolacci数列:

class Fibs:
    def __init__(self):
        self.a = 0
        self.b = 1
    def next(self):
        self.a, self.b = self.b, self.a+self.b
        return self.a
    def __iter__(self):
        return self

内嵌的iter函数,可以将可迭代的对象转化为迭代器

>>> it = iter([1, 2, 3])
>>> it.next()
1
>>> it.next()
2

也可以从迭代器来生成一个序列:

lass TestIterator:

    value = 0
    def next(self):
        self.value += 1
        if self.value > 10: raise StopIteration
        return self.value
    def __iter__(self):
        return self
运行结果:

>>> ti = TestIterator()
>>> list(ti)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


生产器(generator)

生产器是一种特殊的迭代器,它的定义类似于函数的定义,可以看看如下的例子,下面的代码是一个生产器,把一个多维数组平滑输出,既将一个数组的数组里面的数据按顺序输出成一列
nested = [[1, 2], [3, 4], [5]]

def flatten(nested):
    for sublist in nested:
        for element in sublist:
            yield element

你可以这样使用生产器
>>> nested = [[1, 2], [3, 4], [5]]
>>> for num in flatten(nested):
           print num

也可以这样使用

>>> list(flatten(nested))
[1, 2, 3, 4, 5]

在2.4以后的版本,提供了一种新的语法,就是生产器表达式(generator comprehension or generator expression),它类似与List conprehension,但是它不是生成一个list而是返回一个生产器,这样的话,就可以方便你一步一步的处理
>>> g = ((i+2)**2 for i in range(2,27))
>>> g.next()

16

生产器还有一个优点,就是你如果在函数调用中使用生产器,那么不需要多余的括号,如下

sum(i**2 for i in range(10))


递归生产器

上面的例子只能flatten两层的list,如果是一个多层次混合的话,就需要递归了:
def flatten(nested):
    try:
        for sublist in nested:
            for element in flatten(sublist):
                yield element
    except TypeError:
        yield nested
结果:

>>> list(flatten(['foo', ['bar', ['baz']]]))
['foo', 'bar', 'baz']


如果没有yield的话,可以模拟生产器,代码如下:
def flatten(nested):
    result = []
    try:
    # Don't iterate over string-like objects:
        try: nested + ''
        except TypeError: pass
        else: raise TypeError
        for sublist in nested:
            for element in flatten(sublist):
                result.append(element)
   except TypeError:
        result.append(nested)
    return result



Python 中的迭代器 迭代器可以迭代的对象称为可迭代对象。理论上,这两个对象是不同的,但可以在可迭代对象类中实现迭代器。所有这些数据类型都是可迭代的,因此我们可以使用简单的。这种实现迭代器的风格在互联网上很常见,但它不是推荐的方法,并且被认为是一种糟糕的设计。接下来,我们将学习使对象具有可迭代性的因素,这也被称为。使用可迭代对象作为迭代器的这种方法也不被认为是线程安全的。这两个迭代器都单独保存了自己的状态,输出结果符合我们的预期。创建迭代器的方法是用一个单独的类定义迭代器,并实现。方法,我们就称其是可迭代的。 阅读详情

相关推荐

python的迭代器

当使用 for 循环语句时,如果要对一个对象进行迭代,程序会自动调用该对象的__iter__() 方法,返回一个迭代器对象,然后使用迭代器对象进行迭代操作。其中,__iter__()方法返回迭代器对象本身,而__next__()方法则返回下一个元素,在到达末尾时抛出StopIteration异常。迭代器对象是一种可以逐个访问元素的对象,并且只能向前遍历。Python内置了很多支持迭代器模式的对象,同时也提供了一些常用的内置迭代器函数,包括map()、filter()、zip()和reversed()等。

2302_79986066的博客 1730

Python基础第9章

第9章 魔法方法、特性和迭代器 魔法方法 初始化构造函数 作用:在对象创建后可以直接调用他们,初始化新建对象的状态 class FooBar: def __init__(self): self.somevar=42 #创建对象,直接调用somevar参数 f=FooBar() f.somevar 输出结果: >>>42...

DarkM的博客 321

告别黑窗口!用VSCode+Native Debug调试C/C++程序,比GDB命令行舒服多了

本文介绍了如何使用VSCode配合Native Debug扩展来调试C/C++程序,替代传统的GDB命令行方式。通过可视化调试环境,开发者可以更高效地管理断点、查看变量和调用栈,大幅提升调试效率。文章详细讲解了环境配置、核心调试功能及高级技巧,帮助开发者快速上手这一现代调试工具。

weixin_26833139的博客 249

python基础(基本的序列和映射协议(容器类型相关魔术方法))

元素访问 在Python中,协议通常指的是规范行为的规则,类似于接口。协议指定应实现哪些方法以及这些方法应做什么。在Python中,多态仅仅基于对象的行为(而不基于祖先,如属于哪个类或其超类等),因此这个概念很重要:其他的语言可能要求对象属于特定的类或实现了特定的接口,而Python通常只要求对象遵循特定的协议。因此,要成为序列,只需遵循序列协议即可。 基本的序列和映射协议 序列和映射基...

jamfiy的博客 981

c语言串口编程详解

串口: 一种异步通信接口,通常用于低速数据传输。RS-232: 最常见的串口标准,定义了电气特性、连接器和信号线。UART: 通用异步收发传输器,是实现串口通信的硬件模块。通过以上内容,你应能够理解并实现C语言在Windows和Linux平台上的串口编程。希望这本手册能帮助你在实际项目中顺利进行串口通信开发。如果有任何疑问或需要进一步的帮助,请随时提问。

jkzyx123的博客 2223

一文详细讲解CRM系统(附架构图、流程、功能介绍)

专为中小企业量身打造高性价比的数字化转型路径!企业如何用CRM才能真正做到降本增效?今天,就用一文讲清这些问题!读完本文,你将清楚得了解CRM的概念、框架、流程、功能、企业成功案例,文末还有常见问题解答。

Dabeishandong的博客 9925

python中的类中属性元素加self.和不加self.的区别

在类中,self只能在函数中使用,表示的是实例属性,就是每个实例可以设置不值,而不相互影响。如果在类级别使用没有self的属性,是类属性,一般作为全局变量来用的。事实上:就是一个是类属性  一个是对象属性  类和实例都可以访问到属性 当你想让这个变量成为这个类的子变量时 class lc(): def __init__(self): self.a = 5 smalllc ...

weixin_33853827的博客 946

西门子1500T插补控制实战:从硬件组态到轨迹规划

本文详细解析了西门子1500T插补控制的完整实战流程。从硬件组态中正确选择带T的CPU和配置报文105,到创建同步轴与插补器工艺对象,再到使用MC_Interpolator功能块编程实现直线与圆弧插补,并分享了调试技巧与常见问题解决方案,为工程师实现高精度复杂轨迹规划提供清晰指导。

weixin_29228781的博客 423

python学习笔记——第九章 属性 方法和迭代器

第九章 属性 方法和迭代器

wsfw014的专栏 2565

SRCNN超分辨率Pytorch实现,代码逐行讲解,附源码

超分辨率,就是把低分辨率(LR, Low Resolution)图片放大为高分辨率(HR, High Resolution)的过程。通过CNN将图像Y 的特征提取出来存到向量中。用一层的CNN以及ReLU去将图像Y 变成一堆堆向量,即feature map。把提取到的特征进一步做非线性映射,加大网络深度,提高网络复杂性。结合了前面得到的补丁来产生最终的高分辨率图像。实验步骤。

weixin_52261094的博客 3万+

Data+AI━━数仓建模的智能进化之路!

Data+AI━━数仓建模的智能进化之路!

ith321的博客 1744

Python基础知识:构造函数中self用法

在Python开发(http://www.maiziedu.com/course/python-px/)编程语言中有种函数叫构造函数,在这个函数里面有一个关键词叫self,首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的。下面就讲讲self关键词在构造函数中的使用方法。 构造 class FooBar:   def _int_(self):     self

qq_32506555的博客 5281

7.1华为OD机试真题 新系统 - 仓库盘点 (Java/Py/C/C++/Js/Go)

7.1华为OD机试真题 新系统 - 仓库盘点 (Java/Py/C/C++/Js/Go)

算法大师! 507

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

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

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

2023华为OD面试手撕真题【最长公共前缀】

2023华为OD面试手撕真题【最长公共前缀】

MISAYAONE的博客 5239

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Python面向对象加强4.iter与next的用法,枚举器enumerate

大佬文章传送门:iter与next iter():iter() 函数用来生成迭代器。list、tuple等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使⽤next()函数来获取下⼀条数据。iter()函数实际上就是调⽤了可迭代对象的 __iter__ ⽅法。next():next()函数用来返回迭代器的下一个项目,通常与生成迭代的iter()一起使用。 语法: 注意,当我们已经迭代完最后⼀个数据之后,再次调⽤next()函数会抛出 StopIter

weixin_44275448的博客 868

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Python迭代器和生成器:迭代器协议①

迭代器是一个可以遍历某个容器(如列表、元组、字典等)中的所有元素的对象。__iter__(): 该方法返回迭代器对象本身。__next__(): 该方法返回容器的下一个元素。如果没有更多元素,则抛出异常。这种协议被称为迭代器协议。创建自定义迭代器非常简单,只需实现__iter__()和__next__()方法即可。通过本文,我们详细介绍了Python中的迭代器协议,包括__iter__()和__next__()方法。

结合项目案例,记录点点滴滴,自己回顾,分享他人o__o 2840

IMSL CNL 7.0.0 (x86-64)Crack

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

jre9下载 jdk9

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

Python基础 迭代器,面向对象,类的使用

Python迭代器,类的使用1.迭代器2. 面向对象简介3.类的简介4.类的使用5.类的使用5.1 属性和方法5.2 Self 参数 1.迭代器 迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完结束。 迭代器和生成器类似 可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator 生成器是可迭代的,也是迭代器 列表是可迭代的,但不是迭代器 通过iter()函数可以将可迭代的对象变成一个迭代器 可迭代对

0x01 264

Python OOPs/OOP:Python 迭代器

有些对象是可迭代的,这意味着我们可以遍历它们,并且它们将单独返回其成员值。然后我们创建了一个无限 while 循环,其中有一个 try-catch 块,如果我们得到 StopIteration,我们就停止循环;为了制作我们自己的迭代器,我们必须使用Python提供的两个dunder/magic方法。我们创建了一个 ModOfTwo 类,它将为我们提供从 0 到数字(在我们的例子中为 3)的数字的 mod。迭代器非常有帮助,它们帮助我们节省了大量的资源。在此代码中,我们创建了可迭代 nums 的迭代器对象。

新华编程特战队 1505

python迭代器、生成器及面向对象

迭代器、生成器及面向对象一、迭代器1.可迭代对象2.判断是否可迭代问题:可迭代的对象一定是迭代器吗? 一、迭代器 迭代器指的是迭代取值的工具,迭代是指一个重复的过程,每一次重复都是基于上一 次结果而来迭代提供了一种通用的 不依赖索引 的迭代取值方式 1.可迭代对象 1.可以用 for 循环遍历的对象都是可迭代对象。 2.str,list,tuple,dict,set 等都是可迭代对象。 3.generator (生成器 和 yield 的生成器函数) 也是可迭代对象。 2.判断是否可迭代 1.是否有内.

qq_31955765的博客 438

深入浅出:Python中的迭代器

迭代器是一个实现了__iter__()和__next__()方法的对象。__iter__()返回迭代器自身,而__next__()则返回序列中的下一个值。当没有更多元素时,__next__()会抛出一个异常,表示迭代结束。有时我们需要模拟某些连续的数据源(如传感器读数、网络请求等),这时可以利用迭代器来逐步提供新数据。

软件架构师笔记 1828

【python面向对象编程】迭代器与生成器

本文介绍了Python中的迭代器和生成器概念。迭代器是表示数据流的对象,通过iter()将可迭代对象转为迭代器,使用next()逐个获取元素,直到抛出StopIteration异常。文件对象是典型迭代器应用。iter()还支持双参数形式,通过回调函数和哨兵值控制迭代。生成器通过yield关键字简化迭代器创建,能更简洁地实现迭代功能。生成器表达式类似列表推导式,使用圆括号语法,更节省内存。两者都能实现迭代功能,但生成器通常更简洁高效。

Kratzdisteln的博客 1084

什么是Python迭代器?

迭代器(Iterator):迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,从实现上来看,一个迭代器对象必须是定义了__iter__()方法和next()方法的对象。 Python的Iterator对象表示的是一个数据流,可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算; Iter...

老猿Python 6041

Python中的面向对象编程设计 · 官方Python教程学习笔记(一)

本文是Python Tutorial官方教程第九章《类》的学习笔记(全文摘录),主要记录了Python中的作用域规则、类设计以及迭代器和生成器的相关知识,对中文教程中的翻译错误之处做了订正,部分章节根据个人理解做了顺序调整。本笔记与原教程第九章几无差别,可作为Python类设计的学习和回顾之用。

weixin_52174431的博客 906

python面向对象:迭代器

文章目录迭代器一、迭代器的概念二、迭代器的使用方法1.生成迭代器(1)生成无限序列(2)从一个有限序列中生成无限序列(3)从无限序列中生成有限序列在这里插入图片描述2. 取出迭代器的数据3. 如何判断一个对象是否可以迭代 迭代器 一、迭代器的概念 1)迭代器是一个带状态的对象,任何实现了 iter 和next__方法的对象都是迭代器(python2:任何实现next()方法的对象都是迭代器)。 2)其中iter返回迭代器本身, next 返回容器中的下一个值。 如果容器中没有更多元素了,则抛出Stopit

zl202111的博客 740

python迭代器

python学习之迭代器 # -*- coding: utf-8 -*- from collections import Iterable from collections import Iterator class Classmate(object): def __init__(self): self.names = list() self.current_num = 0 def add(self,name): self

Jepson的博客 4863
上一篇: Python笔记(3)异常处理
下一篇: Python笔记(5):sys模块,os模块,set,heap,deque简介
邓谦DQ
博客等级 码龄19年 14粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值