码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Python数字类型


    文章目录

    • Python数字类型
      • 1. 数字类型
        • 1.1 数字类型概述
        • 1.2 整数类型
        • 1.3 浮点数类型
        • 1.4 复数
      • 2. 数字类型的操作
        • 2.1 内置的数值运算操作符
        • 2.2 内置的数值运算函数
        • 2.3 内置的数字类型转换函数
      • 思考与练习

    在这里插入图片描述

    Python数字类型

    1. 数字类型

    1.1 数字类型概述

      数字是自然界计数活动的抽象,更是数学运算和推理表示的基础。计算机对数字的识别和处理有两个基本要求:确定性和高效性。

    • 确定性指程序能够正确且无歧义地解读数据所代表的类型含义。例如,输入1010,计算机需要明确地知道这个输入是可以用来进行数学计算的数字1010,还是类似房间门牌号一样的字符串”1010",这两者用处不同、操作不同且在计算机内部存储方式不同。即便1010是数字,还需要进一步明确这个数字是十进制、二进制还是其他进制类型。
    • 高效性指程序能够为数字运算提供较高的计算速度,同时具备较少的存储空间代价。整数和带有小数的数字分别由计算机中央处理器中不同的硬件逻辑操作,对于相同类型操作,如整数加法和小数加法,前者比后者的速度一般快5~20倍。为了尽可能提高运行速度,需要区分不同运行速度的不同数字类型。

      表示数字或数值的数据类型称为数字类型,Python语言提供3种数字类型:整数、浮点数和复数,分别对应数学中的整数、实数和复数。1010表示一个整数,"1010"表示一个字符串。

    1.2 整数类型

      整数类型与数学中整数的概念一致,下面是整数类型的例子:

    1010,99,-217,0x9a,-0x89

      整数类型共有4种进制表示:十进制、二进制、八进制和十六进制。默认情况,整数采用十进制,其他进制需要增加引导符号,如下表所示。二进制数以0b引导,八进制数以0o引导,十六进制数以0x引导,大小写字母均可使用。

    进制种类引导符号描述
    十进制无默认情况,例如,1010,-425
    二进制0b或0B由字符0和1组成,例如,0b101,0B101
    八进制0o或0O由字符0到7组成,例如,0o711,0O711
    十六进制0x或0X由字符0到9、a到f、A到F组成,例如,0xABC

      整数类型理论上的取值范围是[-∞,+∞],实际上的取值范围受限于运行Python程序的计算机内存大小。除极大数的运算外,一般认为整数类型没有取值范围限制。
      我们已经知道了常见的整数类型,那么整数之间如何进行转换呢?其他进制转为十进制使用int函数,其他进制转为二进制使用bin函数,其他进制转为八进制使用oct函数,其他进制转为十六进制转为hex函数,并且是借助于10进制作为中间的桥梁进行转换,也就是使用到int()函数。例如:把一个二进制的数转换为八进制的数,需要先把二进制转换为十进制,再转换为八进制。

    函数描述
    int()其他进制转换为十进制
    bin()其他进制转换为二进制
    oct()其他进制转换为八进制
    hex其他进制转换为十六进制

    1.3 浮点数类型

      浮点数类型与数学中实数的概念一致,表示带有小数的数值。Python语言要求所有浮点数必须带有小数部分,小数部分可以是0,这种设计可以区分浮点数和整数类型。浮点数有两种表示方法:十进制表示和科学计数法表示。下面是浮点数类型的例子:

    0.0,-77.,-2.17,3.1416,,96e4, 4.3e-3,9.6E5

    科学计数法使用字母e或E作为幂的符号,以10为基数,含义如下:
    e = a*10**b

      上例中4.3e-3值为0.004.3;9.6E5也可以表示为9.6E+5,其值为960 000.0。浮点数类型与整数类型由计算机的不同硬件单元执行,处理方法不同,需要注意的是,尽管浮点数0.0与整数0值相同,但它们在计算机内部表示不同。
      Python浮点数的数值范围和小数精度受不同
    计算机系统的限制,sys.float_info详细列出了Python解释器所运行系统的浮点数各项参数,例如:

    import sys
    print(sys.float_info)
    
    • 1
    • 2

      输出结果为:

    sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)

      上述输出给出浮点数类型所能表示的最大值(max)、最小值(min),科学计数法表示下最大值的幂(max_10_exp)、最小值的幂(min_10_exp),基数 (radix)为2时最大值的幂(max_exp)、最小值的幂(min_exp),科学计数法表示中系数()的最大精度(mant_dig),计算机所能分辨的两个相邻浮点数的最小差值(epsilon),能准确计算的浮点数最大个数(dig)。
    浮点数类型直接表示或科学计数法表示中的系数(
    )最长可输出16个数字,浮点数运算结果中最长可输出17个数字,然而,根据sys.float_info结果,计算机只能够提供15个数字(dig)的准确性,最后一位由计算机根据二进制计算结果确定,存在误差,例如:

    print(3.1415926535897924)
    print(987654321123456.789)
    
    • 1
    • 2

      输出结果为:

    3.1415926535897922
    987654321123456.8

      浮点数在超过15位数字计算中产生的误差与计算机内部采用二进制运算有关,使用浮点数无法进行极高精度的数学运算,由于Python语言能够支持无限制且准确的整数计算,因此,如果希望获得精度更高的计算结果,往往采用整数而不直接采用浮点数。例如,计算如下两个数的乘法值,它们的长度只有10个数字,其中:
    a=3.141592653,b=1.234567898
      可以直接采用浮点数运算,也可以同时把它们的小数点去掉,当作整数运算,结果如下:

    3.1415926531.234567898
    3.8785094379864535
    3141592653
    1234567898
    3878509437986453394

      其中,浮点数运算输出17个数字长度的结果,然而,只有前15个数字是确定正确的。整数运算能够输出完全准确的运算结果。使用整数表达浮点数的方法是高精确度运算的基本方法之一。


    拓展:高精度浮点运算类型
    Python通过标准库decimal提供了一个更精确的数字类型Decimal,这个类型利用上文所介绍的整数运算方法提供高精度浮点数运算,并可以使用getcontext().prec参数自定义浮点数精度的位数,例如:

    import decimal
    
    a = decimal.Decimal('3.141592653')
    b = decimal.Decimal('1.234567898')
    decimal.getcontext().prec = 20
    print(a * b)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出结果为:
    3.878509437986453394
    需要注意的是,在使用decimal库时,Decimal('数字')是高精确度数字的基本表示形式,需要使用单引号,例如, decimal.Decimal('3.141592653')。


      简单地说,浮点数类型的取值范围在[2-1023,21023],即 [-2.225x10308,1.797x10308] 之间,运算精度为2.220x10-16,即浮点数运算误差仅为0.000 000 000 000 0002。对于高精度科学计算外的绝大部分运算来说,浮点数类型足够“可靠”,一般认为浮点数类型没有范围限制,运算结果准确。

    1.4 复数

      复数可以看作是二元有序实数对(a,b),表示为a+bj,其中,a是实数部分,简称实部,b是虚数部分,简称虚部。Python语言中,复数的虚数部分通过后缀“J”或“j”来表示,例如:

    12.3+4j 、-5.6+7j 、1.23e-4+5.67e+89j

      复数类型中实数部分和虚数部分的数伉都是浮点类型。对于复数z,可以用 z.real和z.imag分别获得它的实数部分和虚数部分,例如:

    z = 1.23e-4 + 5.67e+89j
    print(z.real)
    print(z.imag)
    
    • 1
    • 2
    • 3

    输出结果为:
    0.000123
    5.67e+89
      复数类型在科学计算中十分常见,基于复数的运算属于数学的复变函数分支,该分支有效支撑了众多科学和工程问题的数学表示和求解。Python直接支持复数类型,为这类运算求解提供了便利。

    2. 数字类型的操作

    2.1 内置的数值运算操作符

      Python提供了9个基本的数值运算操作符,如下表所示。这些操作符由Python解释器直接提供,不需要引用标准或第三方函数库,也叫做内置操作符。

    操作符描述
    x+yx与y之和
    x+=y将x与y之和赋值为x
    x-yx与y之差
    x-=y将x与y之差赋值为x
    x*yx与y之积
    x*=y将x与y之积赋值为x
    x/yx与y之商
    x/=y将x与y之商赋值为x
    x//yx与y之整除商,即不大于x与y之商的最大整数
    x//=y将x与y之整除商赋值为x
    x%yx与y之商的余数,也称为模运算
    x%=y将x与y之商的余数赋值为x
    -xx的负值,即x*(-1)
    +xx本身
    x**yx的y次幂,即xy
    x**=y将x的y次幂赋值为x

      这几个操作符与数学习惯一致,运算结果也符合数学意义。操作符运算的结果可能改变数字类型,3种数字类型之间存在一种逐渐扩展的关系,具体如下:

    整数>浮点数>复数

      这是因为整数可以看成是浮点数没有小数的情况,浮点数可以看成是复数虚部为0的情况。基于上述扩展关系,数字类型之间相互运算所生成的结果是“更宽”的类型,基本规则如下。
    (1)整数之间运算,如果数学意义上的结果是小数,结果是浮点数。
    (2)整数之间运算,如果数学意义上的结果是整数,结果是整数。
    (3)整数和浮点数混合运算,输出结果是浮点数。
    (4)整数或浮点数与复数运算,输出结果是复数。

    2.2 内置的数值运算函数

      在Python的内置函数中,有6个与数值运算相关。

    函数描述
    abs(x)x的绝对值
    divmod(x,y)(x//y,x%y)。输出为二元组形式(也称为元组类型)
    pow(x,y[,z])(x**y)%z,[…]表示该参数可以省略,即 pow(x,y)。它与x**y相同
    round(x[,ndigits])对x四舍五入,保留 ndigits 位小数。round(x)返回四舍五入的整数值
    max(x)返回x中的最大值
    min(x)返回x中的最小值

      abs()可以计算复数的绝对值,复数的绝对值是二维坐标系中复数位置到坐标原点的长度。例如:

    print(abs(-3 + 4j))
    
    • 1

      输出结果为:5.0
      pow()函数第三个参数z是可选的,使用该参数时,模运算与幂运算同时进行,速度很快。例如,求3的3999次幂结果的最后4位。从Python语法角度,pow(3,pow(3,999))%10000(请不要在计算机中尝试该语句)和pow(3,pow(3,999),10000)都能完成计算需求。但是,前者是先求幂运算结果再进行模运算,由于幂运算结果数值巨大,上述计算在一般计算机上无法完成;而第二条语句则在
    幂运算同时进行模运算,可以很快计算出结果。例如:

    print(pow(3, pow(3,999),10000)) #幂运算和模运算同时进行,速度快
    # 4587
    
    • 1
    • 2

      pow()函数第三个参数z的这个特点在运算加解密算法和科学计算中十分重要。


    拓展:模运算
    模运算(%)在编程中十分常用,主要应用于具有周期规律的场景。例如,一个星期7天,用day 代表日期,则day%7可以表示星期;对于一个整数n,n%2的取值是0或者1,可以判断整数n的奇偶。本质上,整数的模运算n%m能够将整数n映射到[0,m-1]的区间中。


    2.3 内置的数字类型转换函数

      数值运算操作符可以隐式地转换输出结果的数字类型,例如,两个整数采用运算符“/”的除法将可能输出浮点数结果。此外,通过内置的数字类型转换函数可以显式地在数字类型之间进行转换,如表所示。

    函数描述
    int(x)将x转换为整数,x可以是浮点数或字符串
    float(x)将x转换为浮点数,x可以是整数或字符串
    complex(re[,im])生成一个复数。实部为re,虚部为im,re可以是整数、浮点数或字符串,im可以是整数或浮点数但不能为字符串

      浮点数类型转换为整数类型时,小数部分会被舍弃(不使用四舍五入),复数不能直接转换为其他数字类型,可以通过.real 和.imag将复数的实部或虚部分别转换,例如:

    print(int(10.99))  # 10
    print(complex(10.99))  # (10.99+0j)
    print(float((10 + 99j).imag))  # 99.0
    
    • 1
    • 2
    • 3

    思考与练习

    (1)既然浮点数可以表示所有整数数值,Python语言为何要同时提供整数和浮点数两种数据类型?
    答:尽管浮点数确实可以表示很多整数数值,但Python语言同时提供整数(int)和浮点数(float)两种数据类型,这主要是因为它们在计算效率、存储效率和精确性上存在差异,并适用于不同的场景和需求。

    • 计算效率:整数运算通常比浮点数运算更快。这是因为整数运算在计算机内部通常是通过硬件直接支持的,而浮点数运算则涉及到更多的步骤和复杂性,如指数和尾数的处理。因此,在处理大量整数运算时,使用整数类型可以提高代码的执行效率。
    • 存储效率:整数和浮点数在内存中的表示方式是不同的。整数通常使用固定大小的内存空间(例如,在Python 3中,整数的大小是动态调整的,但每个整数仍然占用一个固定大小的对象头和一些额外的空间来存储数字本身),而浮点数则需要更多的空间来存储其指数和尾数部分。因此,当需要存储大量数据且知道这些数据都是整数时,使用整数类型可以节省内存空间。
    • 精确性:浮点数虽然可以表示很大范围的数值,但由于其内部表示方式的限制(例如,二进制浮点数无法精确表示所有的十进制小数),它们在某些情况下可能会引入舍入误差。相比之下,整数运算则是精确的,不存在舍入误差的问题。因此,在需要精确计算的场合(如金融计算),使用整数类型更为合适。
    • 语义清晰性:在某些情况下,使用整数类型可以使代码的意图更加明确。例如,当我们处理像年龄、数量等这样的概念时,使用整数类型可以明确表示这些值应该是整数,而不是浮点数。这有助于增强代码的可读性和可维护性。

    综上所述,尽管浮点数可以表示很多整数数值,但Python语言同时提供整数和浮点数两种数据类型是为了满足不同的计算需求、提高计算效率、节省存储空间以及保持计算的精确性。根据具体的应用场景和需求,开发者可以选择使用合适的数据类型。

    (2)Python 语言中整数1010的二进制、八进制和十六进制表示分别是什么?

    n = 1010
    print("{}的二进制表示为{}".format(n,bin(n)))
    print("{}的八进制表示为{}".format(n,oct(n)))
    print("{}的十六进制表示为{}".format(n,hex(n)))
    
    • 1
    • 2
    • 3
    • 4

    输出结果为:

    1010的二进制表示为0b1111110010
    1010的八进制表示为0o1762
    1010的十六进制表示为0x3f2

    (3)Python语言中-77.的科学计数法表示是什么?4.3e-3的十进制表示是什么?
    -77.的科学计数法表示:-7.7e1、4.3e-3的十进制表示:0.0043

    (4)复数2.3e+3-1.34e-3j的实部和虚部分别是什么?采用什么方法提取一个复数的实部和虚部?
    实部为:2300.0,虚部为:-0.00134。使用z.real()和z.imag()函数进行提取。

    (5) (0.1+0.2) == 0.3的结果是什么?(True or False)
    在标准的Python浮点数运算中,(0.1 + 0.2) == 0.3 的结果会是 False。这是因为浮点数在计算机中的表示存在精度问题,0.1 和 0.2 的二进制表示并不是精确的,所以它们的和也不会精确地等于 0.3。
    如果想要得到True,可以采用以下方法:

    • 使用 decimal 模块,设置好精度;
    • 设置一个很小的正数(容差),如果两个数的差小于容差,则认为两个浮点数相等;
    • 使用round()函数

    参考文章:
    python中常见进制之间的转换

  • 相关阅读:
    【力扣每日一题】2023.10.19 同积元组
    1851. 包含每个查询的最小区间 扫描线/优先队列
    基于时延估计的动力型下肢假肢分段控制策略研究
    多表操作-外连接查询
    SpringBoot第四课-Web开发
    AQS源码解析 2.简介 & 内部核心结构
    动手学习深度学习 05:深度学习计算
    Elastic 8.13:Elastic AI 助手中 Amazon Bedrock 的正式发布 (GA) 用于可观测性
    【开源项目推荐-ColugoMum】这群本科生基于国产深度学习框架PaddlePadddle开源了零售行业解决方案
    聊聊并发编程——多线程之synchronized
  • 原文地址:https://blog.csdn.net/W_chuanqi/article/details/136526374
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号