目录

介绍

生成器

继承

魔术方法

结论


  • 下载源1.4 KB

介绍

这是我们关于学习Python及其在机器学习(ML)和人工智能(AI)中的应用的系列文章中的第三个模块。在前面的模块中,我们研究了数据结构和循环。现在,让我们进一步介绍一下生成器和类。

生成器

创建自己的迭代器的一种方法是使用生成器函数。生成器函数使用yield关键字将下一个迭代器值传递给调用方。这类似于C#中的yield return关键字。一旦函数返回,就没有任何迭代的余地了。

让我们使用生成器函数演示yield关键字,该函数在斐波那契数列上产生前n数字:

def fibonacci(n):a = 1b = 1for i in range(n):if i < 2:yield 1else:c = a + ba = bb = cyield c

现在,您可以像在循环中那样使用诸如range之类的函数来使用此函数:

for f in fibonacci(10):print(f)

这将打印前十个斐波那契数字。

您还可以使用生成器函数产生无限多个元素。

与C#或Java相同,Python具有类。Python提供了面向对象编程的所有标准功能。

让我们来看一个简单的Python类示例:

from math import sqrtclass Vector:def __init__(self, x, y):self.x = xself.y = ydef length(self):return sqrt(self.x ** 2 + self.y ** 2)

__init__方法是构造函数。

length 是一个类方法。

类方法的第一个参数是指正在处理的类实例。按照惯例,这称为self(您可以命名其他名称,但没人能做到这一点。)。self的作用与C#和Java(对当前对象的引用)中的this作用非常相似。Python的不同之处在于,您不能只使用x而是self.x,并且Python要求您明确地将其作为第一个方法参数。

您现在可以使用这样的类:

v = Vector(1, 1)
print(v.length())
print(v.x)
print(v.y)

如你所见,x和y属性可以被访问,但是它们也可以被修改:

v.x = 2
print(v.length())

Python没有访问修饰符,例如public和private。所有变量均可公开访问。用下划线开头的属性名称可以告诉类的用户他们不应该使用该属性,但是该语言不强制使用该名称。

继承

让我们演示如何从Python中的类派生。我们将创建一个基类Document和一个派生类Book:

class Document:def __init__(self, author, content):self.author = authorself.content = contentdef length(self):return len(self.content)def info_summary(self):return "Document written by " + self.authorclass Book(Document):def __init__(self, author, content, pages):super().__init__(author, content)self.pages = pagesdef info_summary(self):return "Book written by {} of {} pages".format(self.author, self.pages)

Book类派生自Document。在Book类的__init__方法中,此行调用超类的构造函数。

super().__init__(author, content)

在Book(不需要像override关键字一样)中info_summary函数被覆盖,并且Book中没有提及length,因此它仅从Document派生出。

book = Book("me", "... content ...", 50)
print(book.length())
print(book.info_summary())

如果要检查某个对象是否属于某个类,请使用以下isinstance函数:

print(isinstance(book, Book)) # True
print(isinstance(book, Document)) # True
print(isinstance(book, object)) # Truedoc = Document("someone else", "...")
print(isinstance(doc, Book)) # False
print(isinstance(doc, Document)) # True

与C#和Java不同,Python支持多重继承:您可以编写Book(Document, AnotherClass, PerhapsEvenMore)类而不是编写Book(Document)类。

如果超类具有相同名称的方法,则只能在子类中派生其中一个。调用方法时(未明确覆盖),Python使用名为C3线性化的算法来确定在超类中查找的顺序。如果要检查所谓的方法解析顺序,则可以查看YourClassName.__mro__属性。这是一个人工的例子来证明:

class A:passclass B:passclass C:passclass D(A, C):passclass F(B, C):passclass G(A):passclass H(F, B, D, A):passprint(H.__mro__)

输出(<class '__main__.H'>, <class '__main__.F'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>)因此您知道Python将首先在H类中查找,然后是B,D,A,最后是C。

魔术方法

Python类提供了许多“魔术方法”,使您可以进行运算符重载,将类实例视为迭代器等等。

魔术方法就像普通方法一样,但是格式为__method_name__。您已经知道一种魔术方法__init__。另一个示例是__add__魔术方法,它使+运算符重载:

class Vector:def __init__(self, x, y):self.x = xself.y = ydef __add__(self, other):return Vector(self.x + other.x, self.y + other.y)v1 = Vector(3, 2)
v2 = Vector(4, 1)
v3 = v1 + v2

__iter__和__next__魔术方法使您能够在实例中迭代。此方法返回下一个迭代值或提高StopIteration以指示结束。

class Fibonacci:def __init__(self, n):self.prev = 1self.prev_prev = 1self.n = nself.i = 0def __iter__(self):return selfdef __next__(self):self.i += 1if self.i == self.n + 1:raise StopIterationif self.i <= 2:return 1else:current = self.prev + self.prev_prevself.prev_prev = self.prevself.prev = currentreturn currentfor fib in Fibonacci(10):print(fib)

这只是魔术方法的表面,您还可以做更多的事情。如果您有兴趣,请参阅本指南。

结论

在本模块中,我们讨论了用于迭代器、类、继承和魔术方法的生成器函数。现在,我们已经了解了Python的基础知识,我们可以全面了解Python中与机器学习相关的软件包。

Python生成器和类相关推荐

  1. Python学习5(生成器、类、属性、方法、私有化、继承、多态)

    生成器 通过列表推导式得到生成器 要创建一个生成器,有很多种方法.第一种方法很简单,只要把一个列表生成式的 [ ] 改成 ( ) In [15]: L = [ x*2 for x in range(5 ...

  2. python生成器yield原理_Python generator生成器和yield表达式详解

    前言 Python生成器(generator)并不是一个晦涩难懂的概念.相比于MetaClass和Closure等概念,其较为容易理解和掌握.但相对于程序结构:顺序.循环和分支而言其又不是特别的直观. ...

  3. Python 生成器 和 yield 关键字

    Python 中 yield 的作用:http://youchen.me/2017/02/10/Python-What-does-yield-do/# Python 生成器详解:http://codi ...

  4. python生成器的使用_应该如何以及为什么使用Python生成器

    python生成器的使用 by Radu Raicea 由Radu Raicea 应该如何以及为什么使用Python生成器 (How - and why - you should use Python ...

  5. python一般的类有三部分组成_Python学习笔记总结(三)类

    一.类简单介绍 1.介绍 类是Python面向对象程序设计(OOP)的主要工具,类建立使用class语句,通过class定义的对象. 类和模块的差异,类是语句,模块是文件. 类和实例 实例:代表程序领 ...

  6. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  7. python文件之间的相互调用_「Python 系列」 Python 生成器函数详解

    Python的生成器函数提供了一种强大的机制来管理数据和计算资源,但是对于Python的新手来说,它们不一定直观.在本文中,我将分解生成器的机制,同时还介绍我希望是一个有启发性的示例:用于管理和流传输 ...

  8. python数据采集仪_数据采集卡支持python么深入理解Python生成器(Generator)

    我们可以通过列表生成式简单直接地创建一个列表,但是受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,而且如果我们仅仅需要访问前面几个元素,那后面绝大多 ...

  9. python代码学习——类与对象提升(继承、超继承,类的例题,魔术方法)

    python代码学习--类与对象提升 继承 继承的特殊属性: 代码示例 方法的重写和覆盖(overrrid) 总结 超继承 继承中的初始化 多继承 例题 类的魔术方法 哈希(hash)和eq方法 bo ...

最新文章

  1. Corner Proposal Network 论文阅读(2020ECCV)
  2. java好用的hbase库_Hbase入库基于java
  3. 点击通知栏后打开Activity,并传参
  4. DOS下查看局域网的ip使用情况,以及ip对应的主机名
  5. DL中版本配置问题:TensorFlow、Keras、Python版本完美搭配推荐
  6. 理解并实施:VRRP(200-120新增考点)
  7. Express全系列教程之(五):Express的中间件
  8. 聚类算法学习指南(二)
  9. Audio 加载hal (loadHwModule)
  10. rk从u盘更新屏参文件_[更新]解决八代I3在华擎B150上核显不亮机问题
  11. 萌新的51之旅——红外通信
  12. sis新地址_“这是什么梗?”,互联网上的新梗老梗如何影响你?
  13. 2022年,美股将要上市的巨头能否逃过破发命运?
  14. 修行一定要在寺院里吗,出家人离开寺院修行,都属邪门外道吗?
  15. Oracle10g或Oracle11g完全卸载正确步骤(亲身体验-详细图文教程)
  16. SASS实现颜色卡动画
  17. python制作简单动画_Python tkinter Canvas绘制动画
  18. 计算机组成原理 光盘中试题答案,白中英计算机组成原理光盘上试题及答案.doc...
  19. 计算机算法与程序设计知识点,算法与程序设计知识点(答案)
  20. 8.3.7-8.3.8

热门文章

  1. activemq后台管理 看topic消息_17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列...
  2. UI初学者必备知识|最好的Sketch App 素材资源都在一流设计导航
  3. 设计师效率帮手|提高设计效率的Sketch插件!
  4. 计算机与应用化学ppt,应用化学专用课件.ppt
  5. python输入正整数n、求n以内能被17整除的最大正整数_求100之内自然数中最大的能被17整除的数资料...
  6. DW ——随机抽号(七位)(JavaScript)
  7. C++ Vector中size()和capacity()区别
  8. libcareplus支持的补丁类型
  9. OpenCV学习笔记:矩阵/向量处理
  10. 和表头对齐 表格_29 HTML中表格的其他特性