本文是 Python 从菜鸟到高手一书的连载系列, 该书由李宁老师编写
本文主要内容:
1. 数字的基础知识
2. 大整数
3. 二进制八进制和十六进制
4 数字的格式化输出
一数字的基础知识
Python 语言与其他编程语言一样, 也支持四则运算(加减乘除), 以及圆括号运算符在 Python 语言中, 数字分为整数和浮点数整数就是无小数部分的数, 浮点数就是有小数部分的数例如, 下面的代码是标准的四则运算表达式
- 2 + 4
- 4 * 5 + 20
- 5.3 / 7
- (30 + 2) * 12
如果要计算两个数的除法, 不管分子和分母是整数还是浮点数, 使用除法运算符 (/) 的计算结果都是浮点数例如 1/2 的计算结果是 0.5,2/2 的计算结果是 1.0 要想让 Python 解释器执行整除操作, 可以使用整除运算符, 也就是两个斜杠 (//) 使用整除运算符后, 1 // 2 的计算结果是 0,2 // 2 的结果是 1
整除运算符不仅能对整数执行整除操作, 也能对浮点数执行整除操作, 在执行整除操作时, 分子分母只要有一个是浮点数, 那么计算结果就是浮点数例如, 1.0 // 2 的计算结果是 0.0,2.0 // 2 的结果是 1.0
除了四则运算符外, Python 还提供了两个特殊的运算符:%(取余运算符)和 **(幂运算符)取余运算符用于对整数和浮点数执行取余操作例如, 5 % 2 的计算结果是 1, 而 5.0 % 2 的计算结果是 1.0 从这一点可以看出,% 和 // 类似, 只要分子分母有一个是浮点数, 计算结果就是浮点数
幂运算符用于计算一个数值的幂次方例如, 2 ** 3 的计算结果是 8,3.2 ** 2 的计算结果是 10.24
到现在为止, 一共介绍了 8 个运算符, 它们是圆括号 (()) 加(+)减 (-) 乘(*)除 (/) 整除 (//) 取余 (%) 和幂运算符 (**) 其中减号 (-) 也可以用于负号(一元运算符), 所以现在涉及到 9 个运算符既然涉及到这么多运算符, 那么就有一个优先级的问题, 也就是说, 同一个表达式中包含有多个不同的运算符, 需要先计算优先级高的运算符, 如果优先级相同个, 那么就按从左向右的顺序执行
这 9 个运算符的优先级顺序如下表所示越靠前优先级越高, 同一行的运算符的优先级相同
例 1 下面的代码演示了 Python 语言中运算符的使用方法, 在编写 Python 代码时, 应该注意运算符的优先级问题
- print(2 + 4) # 运算结果: 6
- print(126 - 654) # 运算结果:-528
- print(6 + 20 * 4) # 运算结果: 86
- print((20 + 54) * 30) # 运算结果: 2220
- print(1/2) # 运算结果: 0.5
- print(1//2) # 运算结果: 0
- print(3/2) # 运算结果: 1.5
- print(3//2) # 运算结果: 1
- print(4**3) # 运算结果: 64
- print(3 + 5 * -3 ** 4 - (-5)**2) # 运算结果:-427
- # 用变量操作数值
- x = 30
- y = 50
- k = 10.2
- print(x + y * k) # 运算结果: 540.0
程序运行结果如下图所示
二大整数
对于有符号 32 位整数来说, 可表示的最大值是 2147483647(2^31 -1), 可表示的最小值是 - 2147483648(-2^31), 如果超过这个范围, 有符号 32 位整数就会溢出不过在 Python 语言中, 可以处理非常大的整数, 并不受位数限制例如, 下面表达式的输出结果就超出了 32 位整数的范围
print(2 ** 35) # 输出 2 的 35 次幂, 输出结果是 34359738368
让我们再换个更大的数, 看看会不会溢出
print(2**630 * 100000) # 2 的 630 次幂再乘 10 万
上面这行代码的输出结果如下:
445550841564667501820426914619169074696604346410992180720624269326101090547722401025968047980212050759633038044296328838934443820446820117016861457004122479321483854917994624031530682836582400000
很显然, Python 语言仍然可以正确处理 2**630 * 100000 的计算结果因此, 在 Python 语言中使用数字不需要担心溢出, 因为 Python 语言可以处理非常大的数字, 这也是为什么很多人使用 Python 语言进行科学计算和数据分析的主要原因之一
三 二进制八进制和十六进制
Python 语言可以表示二进制八进制和十六进制数表示这 3 个进制的数, 必须以 0 开头, 然后分别跟着表示不同进制的字母表示二进制的字母是 b, 表示八进制的字母是 o(这是英文字母中小写的 o, 不要和数字 0 搞混了), 表示十六进制的字母是 x 因此, 二进制数的正确写法是 0b110011, 八进制数的正确写法是 0o56432, 十六进制数的正确写法是 0xF765A
除了这 3 种进制外, 前面章节一直使用的是十进制因此, Python 语言一共可以表示 4 种进制: 二进制八进制十进制和十六进制 Python 语言提供了一些函数用于在这 4 种进制数之间进行转换
如果是从其他进制转换到十进制, 需要使用 int 函数, 该函数有两个参数, 含义如下:
1. 第 1 个参数: 字符串类型, 表示待转换的二进制八进制或十六进制数参数值只需要指定带转换的数即可, 不需要使用前缀, 如二进制直接指定 11011, 不需要指定 0b11011
2. 第 2 个参数: 数值类型, 表示第 1 个参数值的进制, 例如, 如果要将二进制转换为十进制, 第 2 个参数值就是 2
int 函数返回一个数值类型, 表示转换后的十进制数
下面的代码将二进制数 110011 转换为十进制数, 并输出返回结果
print(int("110011",2)) # 输出结果: 51
如果要从十进制转换到其他进制, 需要分别使用 binoct 和 hex 函数 bin 函数用于将十进制数转换为二进制数; oct 函数用于将十进制数转换为八进制数, hex 函数用于将十进制数转换十六进制数这 3 个函数都接收一个参数, 就是待转换的十进制数不过要注意, 这 3 个函数的参数值也可以是二进制数八进制数和十六进制数, 也就是说, 这 3 个函数可以在二进制八进制十进制和十六进制之间互转
下面的代码将十进制数 54321 转换为十六进制数, 并输出转换结果
print(hex(54321)) # 输出结果: 0xd431
例 2 下面的代码演示了 Python 语言中二进制八进制十进制和十六进制数之间的转换
- print(0b110011) # 输出二进制数
- print(0o123) # 输出八进制数
- print(0xF15) # 输出十六进制数
- print(bin(12)) # 十进制转二进制, 输出结果: 0b1100
- print(int("10110",2)) # 二进制转十进制, 输出结果: 22
- print(int("0xF35AE",16)) # 十六进制转十进制, 输出结果: 996782
- print(hex(54321)) # 十进制转十六进制, 输出结果: 0xd431
- print(bin(0xF012E)) # 十六进制转二进制, 输出结果: 0b11110000000100101110
- print(hex(0b1101101)) # 二进制转十六进制, 输出结果: 0x6d
- print(oct(1234)) # 十进制转八进制, 输出结果: 0o2322
- print(int("76532", 8)) # 八进制转十进制, 输出结果: 32090
程序运行结果如下图所示
四 数字的格式化输出
在输出数字时, 有时需要对其进行格式化例如, 在输出 12.34 时, 只希望保留小数点后 1 位数字, 也就是 12.3, 或整数位按 6 位输出, 不足前面补 0, 也就是 000012.34Python 语言中提供了 format 函数用于对数字进行格式化 format 函数有两个参数, 含义如下:
1. 第 1 个参数: 要格式化的数字
2. 第 2 个参数: 格式字符串
format 函数的返回值就是数字格式化后的字符串
例 3 下面的代码演示了 format 函数在格式化数字方面的应用
- x = 1234.56789
- # 小数点后保留两位数, 输出结果:'1234.57'
- print(format(x, '0.2f'))
- # 数字在 12 个字符长度的区域内右对齐, 并保留小数点后 1 位数字,
- # 输出结果:'1234.6'
- print(format(x, '>12.1f'))
- # 数字在 12 个字符长度的区域内左对齐, 并保留小数点后 3 位数字, 紧接着输出 20,
- # 输出结果:'1234.568 20'
- print(format(x, '<12.3f'), 20)
- # 数字在 12 个字符长度的区域内右对齐, 并保留小数点后 1 位数字, 数字前面补 0,
- # 输出结果:'0000001234.6'
- print(format(x, '0>12.1f'))
- # 数字在 12 个字符长度的区域内左对齐, 并保留小数点后 1 位数字, 数字后面补 0,
- # 输出结果:'1234.6000000'
- print(format(x, '0<12.1f'))
- # 数字在 12 个字符长度的区域内中心对齐, 并保留小数点后 2 位数字, 紧接着输出 3,
- # 输出结果:'1234.57 3'
- print(format(x, '^12.2f'),3)
- # 每千位用逗号 (,) 分隔, 输出结果: 1,234.56789
- print(format(x, ','))
- # 每千位用逗号 (,) 分隔, 并保留小数点后 2 位数字, 输出结果: 1,234.57
- print(format(x, ',.2f'))
- # 用科学计数法形式输出数字, 输出结果: 1.234568e+03
- print(format(x, 'e'))
- # 用科学计数法形式输出数字, 尾数保留小数点后 2 位数字, 输出结果: 1.23E+03
- print(format(x, '0.2E'))
程序运行结果如下图所示
来源: https://geekori.com/blogDetails.php?blog_id=98