Python数字类型的完整工具包括:
- 整数和浮点数
- 复数
- 固定精度的十进制数
- 有理分数
- 集合
- 布尔类型
- 无穷和整数精度
- 各种数字内置函数和模块
================================================================================
hex(I),oct(I),bin(I)
这三个函数把一个整数分别转换成十六进制,八进制和二进制所表示的字符串
这三个函数把一个整数分别转换成十六进制,八进制和二进制所表示的字符串
>>> hex(123)
'0x7b'
>>> oct(0x7b)
'0o173'
>>> oct(123)
'0o173'
>>> bin(0xef)
'0b11101111'
内置的int函数会将一个数字的字符串变换为一个整数,并可以通过定义的第二个参数来确定变换后的数字的进制。
>>> int('100',9)
81
>>> int('100',8)
64
>>> int('40',16)
64
>>> int('1000',2)
8
================================================================================
python中有复数表示。复数常量写成实部+虚部的写法,这里虚部是以j或者J结尾的。
>>> 3+4j
(3+4j)
>>> 5+8J
(5+8j)
>>> 1j*1j
(-1+0j)
========================================
========================================
内置数学工具和扩展
表达式操作符:
+、-、*、/、>>(向右移位)、<<(向左移位)、**、&(按位与)、%等
内置数学函数:
pow,abs,round(四舍五入),int,hex,bin,oct等
公用模块:
random,math
+、-、*、/、>>(向右移位)、<<(向左移位)、**、&(按位与)、%等
内置数学函数:
pow,abs,round(四舍五入),int,hex,bin,oct等
公用模块:
random,math
================================================================================
python表达式操作符以及程序
操作符 | 描述 |
yield x | 生成器函数发送协议 |
lambda args:expression | 生成匿名函数 |
x if y else z | 三元选择表达式 |
x or y | 逻辑或(只有x为假,才会计算y) |
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 | 左移或右移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<4<5,等价于2<4 and 4<5;
2<5>4,等价于2<5 and 5>4
1==2<3,等价于1==2 and 2<3,而不等价于False<3
注意:False<3这句话是可以执行的:
>>> False <3
True
因为这句话等价于0<3
================================================================================
python 可以将【混合类型自动升级】
python会识别混合类型表达式中比较复杂的类型,然后将简单的数据类型转为复杂的数据类型,统一了类型之后,再进行运算!!
>>> 40+1.23
41.23
>>> 3+5+4j
(8+4j)
也可以通过手动调用内置函数来强制转换类型:
>>> int(3.133)
3
>>> float(3)
3.0
然而通常这样是没有必要的!!
这些混合类型转换仅仅在将数字类型混合到一个表达式中的时候才使用,这包括使用数字和比较操作符的表达式。
一般来说,python不会在其他类型之间进行转换,例如,一个字符串和一个整数相加会产生错误。
================================================================================
>>> a = 3
>>> b = a+3,a*8
>>> b
(6, 24)
>>> b[0]
6
这样的运算将返回一个元组!元祖的括号在适当情况下可以省略
================================================================================
>>> num = 1/3
>>> num
0.3333333333333333
>>> print(num)
0.3333333333333333
>>> '%e'%num
'3.333333e-01'
>>> '%.2f'%num
'0.33'
>>> '{0:.2f}'.format(num)
'0.33'
最后三个使用了字符串格式化,这是灵活地进行格式化的一种工具。
================================================================================
除法:传统除法、Floor除法和真除法
x/y:传统除法和真除法。在Python2.6或之前的版本中,这个操作对于整数会省去小数部分,对于浮点数会保持小数部分。
在Python3.0之后的版本中,将会变成真除法,无论任何类型都会保持小数部分。
在Python3.0之后的版本中,将会变成真除法,无论任何类型都会保持小数部分。
x//y:Floor除法。这个操作不考虑操作对象的类型,总会省略掉结果的小数部分,剩下最小的能整除的整数部分。
其直接效果是向下舍入,并不是严格地截断,对于负数也有效。
其直接效果是向下舍入,并不是严格地截断,对于负数也有效。
>>> 3.0/2
1.5
>>> 3//2
1
>>> 3.0//2
1.0
>>> -7//2
-4
而如果你真的想要截断而不管符号,可以总是通过math.trunc来得到一个浮点除法的结果。
>>> import math
>>> math.trunc(-7/2)
-3
>>> math.trunc(-7/3.0)
-2
================================================================================
eval函数
eval函数将会把字符串作为Python代码,因此,它也具有类似的效果:
>>> eval('64'),eval('0o100'),eval('0x40'),eval('0b1000000')
(64, 64, 64, 64)
================================================================================
整数的bit_length方法能允许我们查询以二进制表示一个数字的值所需要的位数。
当然通过bin和内置函数len,得到二进制字符串的长度,然后再减去2,也能得到同样的结果,但这样效率较低。
当然通过bin和内置函数len,得到二进制字符串的长度,然后再减去2,也能得到同样的结果,但这样效率较低。
>>> len(bin(256))
11
>>> (256).bit_length()
9
================================================================================
内置math模块
math.pi
math.e
math.sin
math.sqrt
math.min
math.max
math.floor #即前面所讲过的向下取整
math.trunc #这个是完全地截断小数部分,只留整数部分
math.e
math.sin
math.sqrt
math.min
math.max
math.floor #即前面所讲过的向下取整
math.trunc #这个是完全地截断小数部分,只留整数部分
>>> sum([1,2,3])
6
>>> round(2.4567,2)
2.46
>>> round(1/3,2)
0.33
sum函数作用于数字的一个序列,min和max函数接受一个参数序列或者单个的参数
round函数保留小数,可以选择保留的位数,如果不带第二个参数,则默认保留整数!
python有3种方法计算平方根:
>>> math.sqrt(144)
12.0
>>> 144**.5
12.0
>>> math.pow(144,.5)
12.0
它们性能不同!
================================================================================
random模块
这个模块提供了工具,可以选出一个在0和1之间的任意浮点数、选择在两个数字之间的任意整数、在一个序列中挑选任意一项等。
这个模块提供了工具,可以选出一个在0和1之间的任意浮点数、选择在两个数字之间的任意整数、在一个序列中挑选任意一项等。
>>> import random
>>> random.random()
0.929259317047656
>>> random.random()
0.660641955530813
>>> random.randint(1,10)
7
>>> random.randint(1,10)
3
>>> random.choice(['a','b','c'])
'b'
>>> random.choice(['a','b','c'])
'b'
>>> random.choice(['a','b','c'])
'b'
>>> random.choice(['a','b','c'])
'a'
================================================================================
小数对象 Decimal
>>> 0.1+0.1+0.1-0.3
5.551115123125783e-17
>>> 0.1-0.1
0.0
>>> from decimal import Decimal
>>> Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3')
Decimal('0.0')
>>> decimal.getcontext().prec = 4 #设置全局精度
========================================
========================================
分数类型 Fraction
>>> from fractions import Fraction
>>> x = Fraction(1,3)
>>> x
Fraction(1, 3)
>>> y = Fraction(4,6)
>>> y
Fraction(2, 3)
>>> print(y)
2/3
一旦创建了分数,它也可以参与运算:
>>> x*y
Fraction(2, 9)
>>> 3*x
Fraction(1, 1)
分数对象也可以从浮点数字符串来创建:
>>> Fraction('.23')
Fraction(23, 100)
>>> Fraction('.25')
Fraction(1, 4)
>>> Fraction('1.25')
Fraction(5, 4)
================================================================================
转换和混合类型:
为了支持分数转换,浮点数对象现在有一个方法,能够产生它们的分子和分母比
而分数有一个from_float方法,并且float接受一个Fraction作为参数。
为了支持分数转换,浮点数对象现在有一个方法,能够产生它们的分子和分母比
而分数有一个from_float方法,并且float接受一个Fraction作为参数。
>>> (2.5).as_integer_ratio()
(5, 2)
>>> f = 2.5
>>> z = Fraction(*f.as_integer_ratio()) # 这里的*号把元祖扩展到单个参数中!
>>> z
Fraction(5, 2)
>>> Fraction.from_float(2.5)
Fraction(5, 2)
混合运算:
>>> z
Fraction(5, 2)
>>> z+3
Fraction(11, 2)
>>> z+3.0
5.5
>>> a = Fraction.from_float(3.555)
>>> a
Fraction(8005148337651057, 2251799813685248)
>>> a.limit_denominator(10) #限制最大分母
Fraction(32, 9)