Python基础学习:numbers模块

2023-10-26

numbers——数字抽象基类,其源代码存储在:Lib/numbers.py

numbers模块定义了数字抽象基类的层次结构,逐渐定义更多的操作。该模块中定义的任何类型都不能实例化。

 

1.数字塔

class numbers.Complex

       数字的一个子类,用来描述复数以及可应用于内置复数类型的操作中。它们是:complex(复数)转化、bool(布尔)、real(复数实部)、image(复数虚部)、+、-、*、/、abs()、conjugate(将实部与虚部连接起来,构成完整复数)、==、和!=。上述操作除了-和!=都是抽象操作。

class numbers.Rational

       实数的子类有理数,它具有额外的numerator(分子)、denominator(分母)属性并且,它为float()提供了默认值。

class numbers.Integral

       有理数的子类,添加了整型转化方法。默认提供了float()、分子与分母。额外的抽象方法由**,字符位操作:<<、>>、&、^、|、~。

 

2.类型实现器注解

       实现器应当谨慎的运行,使得相等数值的数字相等(跨越子类型),并且使它们散列为相同的值。如果两个实数存有不同的扩展名,该实现器应当能打破这种微妙的处境,实现结果的输出。例如,fractions.Fraction应用hash()操作,示例如下

def__hash__(self):

    ifself.denominator ==1:

        # Get integers right.

        returnhash(self.numerator)

    # Expensive check, but definitely correct.

    ifself==float(self):

        returnhash(float(self))

    else:

        # Use tuple's hash to avoid a high collision rate on

        # simple fractions.

        returnhash((self.numerator, self.denominator))

 

2.1 添加更多的数字ABCs(创造新的数字子类)

       当然,实际应用中可能需要更多类型的数字,但是由于其比较少见该语言没有内置,因此用户可以自行进行定义添加。比如,你可以添加MyFoo这个介于复数和实数之间的数,利用如下代码:

classMyFoo(Complex): ...

MyFoo.register(Real)

 

2.2 算数运算的实现

       我们希望可以实现算数运算以便于在混合操作中调用编程人员熟知的具有多参数的操作,或者是在操作中将参与运算的参数转化为与其最为相似的内置类型,并执行一般运算操作。对于Integral的子类,这意味着其包含的__add__()和__radd__()方法应该按下述程序定义:

classMyIntegral(Integral):

 

    def__add__(self, other):

        ifisinstance(other, MyIntegral):

            return do_my_adding_stuff(self, other)

        elifisinstance(other, OtherTypeIKnowAbout):

            return do_my_other_adding_stuff(self, other)

        else:

            returnNotImplemented

 

    def__radd__(self, other):

        ifisinstance(other, MyIntegral):

            return do_my_adding_stuff(other, self)

        elifisinstance(other, OtherTypeIKnowAbout):

            return do_my_other_adding_stuff(other,self)

        elifisinstance(other, Integral):

            returnint(other) +int(self)

        elifisinstance(other, Real):

            returnfloat(other) +float(self)

        elifisinstance(other, Complex):

            returncomplex(other) +complex(self)

        else:

            returnNotImplemented

       复数的子类上的混合操作有五种情况。前述的代码中除去MyIntegral和OtherTypeIKnow的文本将作为下面描述的样板。a是A的实例,并且使复数的子类(a:A<:Complex),b是B的实例,也是复数的子类。我们以a+b做如下讨论:

1.如果A定义了一个可以接受B的__add__()方法,一切都会是正常的;

2.如果A退回样板代码,它会返回来自于__add__()的值,我们有可能返回更加高级智能的__radd__(),因此样板应当从__add__()返回NotImplemented;

3.然后B中的__radd__()会获得机会,如果其接受a,那么一切都将完美;

4.如果它退回样板代码,那就没有更多的方法用来尝试解决这个问题,因此就要在此设置默认操作;

5.如果B<:A,Python就会先尝试B.__Radd__()方法,再尝试A.__add__()方法。这可以进行,因为操作是在A已知的情况下进行,因此他可以在将这些实例委托给复数类前进行操作。

       如果A<:Complex(A为复数子类)、B<:Real(B为实数子类),它们之间没有共享其它信息时,最适合它们的操作就是使用复数操作,所有的__radd__()方法都在复数类中定义了,此时a+b=b+a。

       由于大多数类型的运算都十分相似,因此定义一个产生任何给定算子的正向和反向实例的辅助函数会很有用。例如,fractions.Fraction使用了以下代码:

def_operator_fallbacks(monomorphic_operator, fallback_operator):

    defforward(a, b):

        ifisinstance(b, (int, Fraction)):

            return monomorphic_operator(a, b)

        elifisinstance(b, float):

            return fallback_operator(float(a), b)

        elifisinstance(b, complex):

            return fallback_operator(complex(a), b)

        else:

            returnNotImplemented

    forward.__name__='__'+ fallback_operator.__name__+'__'

    forward.__doc__= monomorphic_operator.__doc__

 

    defreverse(b, a):

        ifisinstance(a, Rational):

            # Includes ints.

            return monomorphic_operator(a, b)

        elifisinstance(a, numbers.Real):

            return fallback_operator(float(a), float(b))

        elifisinstance(a, numbers.Complex):

            return fallback_operator(complex(a), complex(b))

        else:

            returnNotImplemented

    reverse.__name__='__r'+ fallback_operator.__name__+'__'

    reverse.__doc__= monomorphic_operator.__doc__

 

    return forward, reverse

 

def_add(a, b):

    """a + b"""

    return Fraction(a.numerator * b.denominator +

                    b.numerator * a.denominator,

                    a.denominator * b.denominator)

 

__add__, __radd__= _operator_fallbacks(_add, operator.add)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python基础学习:numbers模块 的相关文章

随机推荐

  • 一个人才数据网的爬虫软件

    最近表哥让我帮他写个软件 定时爬取一个人才数据网站的信息 思路和方法很简单 不过过程中遇到的坑真的不少 今天对整个软件的开发过程做个记录 网站是 余姚人才网 链接就不上了 百度第一个就是 还是老样子 python request beaut
  • SpringCloud基础8——多级缓存

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 1 多级缓存流程 2 JVM进程缓存 2 1 d
  • Linux文件上传与下载

    之前都是用Xftp工具在本地和linux系统之间上传下载文件 最近觉得麻烦 因为平时用Xshell连接 要传输文件的时候还要额外使用别的工具 下面使用 lrzsz 即可完成 Linux 的文件上传与下载 lrzsz 的安装 我在测试的时候
  • 55-基于栈的指令集与基于寄存器的指令集详细比对

    基于栈的指令集与基于寄存器的指令集详细比对 现代JVM在执行Java代码的时候 通常都会将解释执行与编译执行二者结合起来进行 解释执行 就是通过解释器来读取字节码 遇到相应的指令就去执行该指令 编译执行 就是通过即时编译器 Just In
  • 如何删除gitlab上默认受保护的master主分

    这里写自定义目录标题 1 找到对应项目 去到仓库 分支 查看分支情况 如果为 pr 点击 项目设置 2 展开对应 Protected Branches 3 点击 unprotect 就ok了 4 完成后 回到当前 ok 了 这样就可以使用
  • python怎么安装matplotlib.pyplot

    我先解释一下 这是windows系统下的安装方式 我也是刚入门 不知道自己的安装方法是否适合别人 就不多说了 以下是过程 1 https pypi python org pypi matplotlib 有一个下载选项 在这个网站上选择车轮文
  • Python微信小程序,实现自动回复等功能(itchat模块)

    本文是使用Python的itchat模块进行微信私聊消息以及群消息的自动回复功能 必须在自己的微信中添加微信号xiaoice ms 微软的微信机器人 才能实现 直接复制代码运行之后扫一扫二维码即可 经过测试 该程序能够保持几小时的时间 实现
  • [Codeforces] combinatorics (R1600) Part.1

    Codeforces combinatorics R1600 Part 1 题单 https codeforces com problemset tags combinatorics 1201 1600 52B Right Triangle
  • 在现实实践中会遇到的机器学习算法总结

    在理解了我们需要解决的机器学习问题之后 我们要思考需要收集什么数据以及我们可以用什么算法 本文我们会过一遍最流行的机器学习算法 大致了解哪些方法可用 很有帮助 机器学习领域有很多算法 然后每种算法又有很多延伸 所以对于一个特定问题 如何确定
  • 【学习笔记】启动Nginx、查看nginx进程、查看nginx服务主进程的方式、Nginx服务可接受的信号、nginx帮助命令、Nginx平滑重启、Nginx服务器的升级

    1 启动nginx的方式 cd usr local nginx ls nginx c nginx conf 2 查看nginx的进程方式 root localhost nginx ps ef grep nginx root localhos
  • 103-----JS基础-----添加删除记录-删除

    一 代码 很简单 看一下即可
  • TensorFlow学习-anaconda的方式安装TensorFlow教程

    前置准备 首先在说到安装TensorFlow前 要安装好anaconda 这里引入一篇教程anaconda安装与使用 初学者另外也需要在官网安装对应的python包python官网 有这些前置准备后 就可以安装TensorFlow了 采用a
  • linux下ftp的使用命令

    1 登录ftp ftp 0 0 0 0 输入用户名和密码 登录成功 2 ftp帮助 help 显示本地可用命令 rhelp 显示远程终端可以使用的命令 3 切换目录 cd 切换远程终端的当前工作目录 lcd 切换本地的当前工作目录 pwd
  • Centos7离线安装依赖包

    Centos离线安装依赖包 文章目录 Centos离线安装依赖包 1 下载依赖包 1 1 使用yum install downloadonly下载安装包及其依赖 1 2使用yumdownloader下载安装包及其依赖 2 安装下载好的依赖包
  • vuex的基本用法(提炼公共文件import all vuex modules)

    1 第一步是你的package json中需要有 vuex 3 5 1 如果没有安装vuex 就先安装一下 2 在src下创建一个文件store store下创建一个文件modules index js 下面继续创建文件 最终的目录文件如下
  • Discourse搭建

    首先要链接上服务器 首先WINDOWS打开CMDER MAC的话打开Terminal 都是类似的 在窗口输入 ssh root ALIYUN IP 这里的ALIYUN IP是你的服务器的公网IP地址 举个例子 我的公网IP是47 88 12
  • Qt中执行多条shell语句

    在Qt中执行一个shell指令常用QProcess类来完成 常见的用法示例如下 QProcess process process start find opt name ts calibrate str是需要执行的命令 flag proce
  • python之weditor定位的使用

    1 driver text 书城 定位元素的方式 属性定位 2 driver text 书城 click 点击元素 3 driver resourceId click 点击搜素按钮 4 driver resourceId send keys
  • 我在支付宝花了 1 分钟,查到了对象的开房记录

    来源丨Hack https mp weixin qq com s 6fDFqBQMqUVdkJG Dg7iCw 在大数据时代下 不管你做什么都会留下蛛丝马迹 只要学会把各种软件运用到极致 捉奸简直轻而易举 今天就来给大家分享一下 什么叫大数
  • Python基础学习:numbers模块

    numbers 数字抽象基类 其源代码存储在 Lib numbers py numbers模块定义了数字抽象基类的层次结构 逐渐定义更多的操作 该模块中定义的任何类型都不能实例化 1 数字塔 class numbers Complex 数字