Python的核心数据类型-数字

数字

  • Python的核心对象集合包括常规的类型:整数(没有小数部分的数字)、浮点数(概括的讲,就是后边有小数部分的数字)以及更为少见的类型(有虚部的复数、固定精度的十进制数、带分子和分母的有理分数以及集合等)
  • Python的基本数字类型是相当基本的,Python中的数字支持一般的数学运算,如加法+、减法-,除法/,乘法* ,乘方**,取余%,取整//
a = 123+222
b = 1.5*4
c = 2**100
print(a,b,c)
345 6.0 1267650600228229401496703205376

注意到这里的最后一个结果:当需要的时候,Python3.x的整数类型会自动提供额外的精度,以用于较大的数值。

  • 除了表达式外,和Python一起分发的还有一些常用的数学模块(导入以供使用的一些额外工具包)
import math
math.pi
3.141592653589793
math.sqrt(85)
9.219544457292887
  • math模块包含更高级的数学工具,如函数,而random模块可以作为随机数字的生成器和随机选择器
import random
random.random()
0.7214147355335928
random.choice([1, 2, 3, 4])
3

一、Python的数字类型

  • Python数字类型的完整工具包括:
    • 整数和浮点数
    • 复数
    • 固定精度的十进制数
    • 有理分数
    • 集合
    • 布尔类型
    • 无穷的整数精度
    • 各种数字内置函数和模块

(一)数字常量

  • 整数和浮点数常量
    • 整数以十进制数字的字符串写法出现
      Python3.x中,一般整数和长整数已经合二为一了,只有整数这一种,自动地支持2.6的单独的长整数类型所拥有的无穷精度。因此整数不再用末尾的l或L表示,并且整数也不会再显示出这个字符。
    • 浮点数带一个小数点,也可以加上一个科学技术标志e/E
  • 十六进制、八进制和二进制
    • 十六进制数以0x或0X开头,后面接十进制的数字0-9和A-F
    • 八进制常量用0o或0O开头,后面接数字0-7构成的字符串
    • 二进制常量以0b或0B开头,后年接着二进制数字0、1
    • 内置函数hex(I)、oct(I)和bin(I)把一个整数转换成这3中进制表示的字符串,并且int(str,base)根据每个给定的进制把一个运行时字符串转换成一个整数。
  • 复数
    • Python的复数常量写成实部+虚部的写法,这里虚部是以j或J结尾
    • 可以通过内置函数complex(real,imag)来创建复数
  • 编写其他的数字类型
    • 通过调用导入的模块中的函数来创建
    • 拥有他们自己的常量语法

(二)内置数学工具和扩展

  • 除了内置数字常量之外,Python还提供了一系列处理数字对象的工具:
    • 表达式操作符
      • +、-、*、/、>>、** 、&等
    • 内置数学函数
      • pow abs round int hex bin等
    • 公用模块
      • random、math等

(三)Python表达式操作符

  • (1)Python表达式操作符及程序
    操作符 描述
    yield x 生成器函数发送协议
    Iambda args;expression 生成匿名函数
    x if y else z 三元选择表达式
    x and y 逻辑与(只有x为真,才会计算y)
    not x 逻辑非
    x in y, x not in y 成员关系(可迭代对象、集合)
    x is y, x is not y 对象实体测试
    x<y, x<=y, x>y, x>=y, x==y, x!=y 大小比较,集合子集和超集值相等性操作符
    x|y 位或,集合并集
    x^y 位异或,集合对称差
    x&y 位与,集合交集
    x<<y, x>>y 左移或右移y位
    x+y, x-y 加法/合并,减法,集合差集
    x* y, x%y, x/y, x//y 乘法/重复,余数/格式化,除法:真除法或floor除法
    -x, +x 一元减法,识别
    ~x 按位求补(取反)
    x**y 幂运算
    x[i] 索引(序列、映射及其他)点号取属性运算,函数调用
    x[i:j:k] 分片
    x(…) 调用(函数、方法、类及其他可调用的)
    x.attr 属性引用
    (…) 元组,表达式,生成器表达式
    […] 列表,列表解析
    {…} 字典、集合、集合和字典解析
  • (2)混合操作符所遵循的操作符优先级
    • 上表中,越靠后的优先级越高
    • 上表中,位于同一行的表达式在组合时候通常从左到右组合(除了幂运算,是从右往左组合的;比较运算,是从左往右连接的)
  • (3)括号分组的子表达式
    • 括号的优先级最高
  • (4)混合类型自动升级
    • Python首先将被操作对象转换成其中最复杂的操作对象的类型,然后再对相同类型的操作对象进行数学运算

二、在实际应用中的数字

1.变量和基本表达式

  • 变量在它第一次赋值时创建
  • 变量在表达式中使用将被替换为它们的值
  • 变量在表达式中使用以前必须已赋值
  • 变量像对象一样不需要在一开始进行声明
#操作符分组以及类型转换
a = 3
b = 4
c = b / 2 + a
print(c)
print(b / (2.0 + a))
5.0
0.8

第一个表达式中没有括号,所以Python自动根据运算符的优先级法则将各部分分组。
第二个表达式中,强制使Python先计算括号中的+。因为是混合类型,在进行+之前首先将整数变换成浮点数的值。

2.数字显示的格式

  • 在交互提示模式下结果的自动回显会比打印语句显示更多的数字位数

3.比较:一般的和连续的

  • 一般的比较是比较操作数的相对大小,并且返回一个布尔类型的结果
1 < 2
True
2.0 > 1
True
2.0 == 2
True
2.0 != 2.0
False
  • Python还允许把多个比较连起来执行范围测试
x = 2
y = 4
z = 6
x < y and y < z
True
x < y and y > z
False
1 == 2 < 3   #same as: 1==2 and 2<3
False

4.除法:传统除法、Floor除法和真除法

  • 在Python3.x中,/总是执行真除法,不管操作数的类型,都返回包含任何余数的一个浮点结果;//执行Floor除法,它截掉余数并且针对整数操作数返回一个整数,如果有任何一个操作数是浮点类型,则返回一个浮点数。
  • Floor除法vs截断除法
    • //操作符通常叫做截断除法,但是更准确的说是floor除法,它把结果向下截断到它的下层,即真正结果之下的最近的整数。其直接结果是向下舍入,并不是严格的截断,并且这对负数也有效。
import math
math.floor(2.5)
2
math.floor(-2.5)
-3
math.trunc(2.5)
2
math.trunc(-2.5)
-2



-在执行除法操作的时候,只是真正地截断了正的结果,因此截断除法和floor除法是相同的;对于负数,它就是floor结果。

5.整数精度

  • Python3整数支持无穷小
999999999999999999999999999999+1
1000000000000000000000000000000
  • 无穷大是一个方便的内置工具。例如,可以使用它以美分为单位去直接计算年度预算,这也是它能够用来计算2的高次幂的原因。
2**100
1267650600228229401496703205376

6.复数

  • 复数表示为两个浮点数(实部和虚部)并接在虚部增加了j或J的后缀,我们能够吧非零实部的复数写成由+连接起来的两部分。
1j+1J
2j
2 + 1j * 3
(2+3j)
(2 + 1j) * 3
(6+3j)



复数允许我们分解出它的实部和虚部作为属性,并支持所有一般的数学表达式,并且可以通过标准的cmath模块(复数版的标准数学模块)中的工具进行处理。

7.十六进制、八进制和二进制

#如下编码会产生具有3种进制的指定值的常规整数
0b1, 0b10000, 0b11111111
(1, 16, 255)
0o1, 0o20, 0o377
(1, 16, 255)
0x01, 0x10, 0xFF
(1, 16, 255)

这里,二进制0b11111111,八进制0o377和十六进制0xFF,都表示十进制的255。

  • Python默认地用十进制值,但它提供了内置的函数,允许我们把整数转换为其它进制的数字字符串:
    • bin函数会将十进制转换为二进制数
    • oct函数会将十进制转换为八进制数
    • hex函数会将十进制转换为十六进制数
  • 另一种方式,内置的int函数会将一个数字的字符串变换成一个整数,并可以通过定义的第二个参数来确定变换后的数字的进制
bin(64), oct(64), hex(64)
('0b1000000', '0o100', '0x40')
int('64', 10), int('1000000', 2), int('100', 8), int('40', 16)
(64, 64, 64, 64)

8.位操作

  • Python可以实现位移及布尔操作:
x = 1
x << 2
4
x | 2
3
x & 1
1

在第一个表达式中,二进制数1(逢2进位,0001)左移了两位,成为二进制数4(0100)
最后的两个操作一个是二进制或(0001|0010 = 0011),一个是二进制与(0001&0001 = 0001)

  • 这样的按位进行掩码的运算,是我们可以对一个整数进行多个标志位和值进行编码

  • 在这个领域里,Python3支持的二进制和十六进制变得特别有用,允许我们按照字符串来编写和查看数字:

X = 0b0001   # Binary literals
X << 2      # Shift left 
4
bin(X << 2)   # Binary digits string
'0b100'
bin(X | 0b010)   # Bitwise OR
'0b11'
bin(X & 0b1)      # BItwise AND
'0b1'
X = 0xFF        # Hex literals
bin(X)          
'0b11111111'
X ^ 0b10101010   # bitwise XOR
85
bin(X ^ 0b10101010)
'0b1010101'
int('1010101', 2)
85
hex(85)
'0x55'

9.其他的内置数学工具

  • 除了核心对象类型以外,Python还支持用于数字处理的内置函数和内置模块。例如一些内置math模块:
import math
math.pi, math.e      # common constants
(3.141592653589793, 2.718281828459045)
math.sin(2 * math.pi / 180)   # sine, tangent, cosine
0.03489949670250097
math.sqrt(144), math.sqrt(2)   # square root
(12.0, 1.4142135623730951)
pow(2,4), 2 ** 4              # Exponentiation(power)
(16, 16)
abs(-42.0), sum((1, 2, 3, 4))  # absolute value, summation
(42.0, 10)
min(3, 1, 2, 4), max(3, 1, 2, 4)  #minimum, maximum
(1, 4)
  • 在Python中有3种方法计算平方根:使用一个模块函数、一个表达式或者一个内置函数:
import math
math.sqrt(144)       # module
12.0
144 ** .5
12.0
pow(144, .5)
12.0
  • 注意内置math这样的模块必须先导入,但是abs这样的内置函数不需要导入就可以直接使用。
  • 换句话说,模块是外部的组件,而内置函数位于一个隐形的命名空间内,Python自动搜索程序的变量名。

三、其他数字类型

(一)小数数字

  • 小数数字是通过一个导入的模块调用函数后创建的,而不是运行常量表达数创建的
  • 小数对象就像浮点数,只不过他们有固定的位数和小数点,因此小数是有固定精度的浮点值
1.基础知识
  • (1)浮点数学缺乏精确性,因为用来存储数值的空间有限
  • (2)能够调用在decimal模块中的Decimal的构造函数创建一个小数对象,并传入一个字符串,这个字符串有我们希望在结果中显示的小数位数。当不同精度的小数在表达式中混编时,Python自动升级为小数位数最多的。
import decimal
decimal.Decimal('0.1') + decimal.Decimal('0.10') + decimal.Decimal('0.10') - decimal.Decimal('0.30')
Decimal('0.00')
  • (3)在Python3中,能够从一个浮点对象创建一个小数对象,通过decimal.Decimal.from_float(1.25)形式的调用。这一转换是精确的,但是会产生较多的位数。
2.设置全局精度
  • decimal模块中的其他工具可以用来设置所有小树数值的精度、设置错误处理等。
    例如,这个模块中的一个上下文对象允许指定精度(小数位数)和舍入模式(舍去、进位等)。
import decimal
decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1428571428571428571428571429')
decimal.getcontext().prec = 4
decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1429')
3.小数上下文管理器
  • 可使用向下吻管理器语句来重新设置 临时精度。在语句退出后,精度又可以重新设置为初始值。

(二)分数类型

  • 分数实现了有理数对象,明确地保留了一个分子和一个分母,从而避免浮点数学的某些不精确性和局限性
1.基础知识
  • 分数以类似于小数的方式使用,它也存在于模块中,导入其构造函数并传递一个分子和分母就可以产生一个分数
from fractions import Fraction
x = Fraction(1, 3)
y = Fraction(4, 6)
print(x,y)
1/3 2/3
  • 分数对象也可以从浮点数字符串来创建,这和小数很相似:
Fraction('.25')
Fraction(1, 4)
Fraction('.25') + Fraction('1.25')
Fraction(3, 2)
2.数值精度
  • 对于那些用内存中给定的有限位数无法精确表示的值,浮点数的局限尤为明显。分数和小数都提供了得到精确结果的方式,虽然要付出一些速度的代价。
0.1 + 0.1 + 0.1 - 0.3
5.551115123125783e-17
from fractions import Fraction
Fraction(1, 10) + Fraction(1, 10) + Fraction(1, 10) - Fraction(3, 10)
Fraction(0, 1)
import decimal
decimal.Decimal('0.1') + decimal.Decimal('0.1') + decimal.Decimal('0.1') - decimal.Decimal('0.3')
Decimal('0.0')
  • 实际上,分数保持精确性,并且自动简化结果
3.转换和混合类型
  • 为了支持分数转换,浮点数对象现在有一个方法,能够产生他们的分子和分母比,分数有一个from_float方法,并且float接受一个Fraction作为参数

(三)集合

  • 集合(set)是一些唯一的、不可变对象的一个无序集合
1.Python3中的集合常量
  • 在Python3中,如下形式是等同的
set([1, 2, 3, 4])     # built-in call
{1, 2, 3, 4}          # 3.0 set literals
{1, 2, 3, 4}
  • 这个语法是有意义的,因为集合基本上就像是无值的字典,集合的项是无序的、唯一的、不可改变的,因此它们的行为和字典的键很像。

  • 在Python3中要创建空的集合或从已有的可迭代对象构建集合,还是需要内置的set函数,但是新的常量便于初始化具有已知结构的集合:

S = set('spam')
print(S)
S.add('alot')
print(S)
{'p', 'a', 'm', 's'}
{'m', 'a', 'alot', 's', 'p'}
  • 在Python中{}仍然是一个字典,空的集合必须通过内置函数set来创建,并且以同样的方式显示:
S1 = {1, 2, 3, 4}
S1- {1, 2, 3, 4}      # empty sets print differently
set()                 # because {} is empty dictionary
type{()}
  File "<ipython-input-21-46cfe66c8882>", line 4
    type{()}
        ^
SyntaxError: invalid syntax
S = set()
S. add(1.23)
S
{1.23}
  • Python3支持一些表达式不支持的通用可迭代操作数:
{1, 2, 3}.union(set([3, 4]))
{1, 2, 3, 4}
{1, 2, 3}.intersection((1, 3, 5))    # intersection:交集
{1, 3}
{1, 2, 3}.issubset(range(-5, 5))      # 子集
True
2.不可变限制和冻结集合
  • 集合只能包含不可变的(即可散列的)对象类型。因此,列表和字典不能嵌入到集合中,如果需要存储复合值的话,元组是可以嵌入的。
3.为什么使用集合
  • 集合操作有各种各样常见的用途,其中一些比数学更加实用。例如:
    • 集合(set)可以把重复项从其他集合(collection)中过滤掉:直接把一个集合(collection)转换成一个集合(set),然后在转换回来即可
    • 遍历图形或者其他的回环结构时,集合可以用来记录已经访问过的位置
    • 处理较大集合的时候,两个集合的交集包含了两个领域中共有的对象,并集包含了两个集合中的所有项目。

(四)布尔型

  • 表示真假的值
  • 只有两个值:True/False
  • 布尔值可以跟数字直接操作(把它当数用)
#布尔值操作
age = 18 + True
print(age)
19

三、数字扩展

  • Python和NumPy的组合往往可以看作是一个免费的、更加灵活的MATLAB
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值