1.数字类型
在程序开发时,经常使用数字记录游戏的得分、网站的销售数据和网站的访问量等信息。在Python中,提供了数字类型用于保存这些数值,并且它们是不可改变的数据类型。如果修改数字类型变量的值,那么会先把该值存放到内容中,然后修改变量让其指向新的内存地址。
计算机对数字的识别和处理有两个基本要求:确定性和高效性。
在Python中,数字类型主要包括整数,浮点数和负数。
1.1 整数类型
整数用来表示整数数值,即没有小数部分的数值。在Python中,整数包括正整数、负整数和0,并且它的位数是任意的(当超过计算机自身的计算功能时,会自动转用高精度计算),如果要指定一个非常大的整数,只需要写出其所有位数即可。
整数类型包括十进制整数、八进制整数、十六进制整数和二进制整数。
表1 整数类型的4种进制表示
进制种类 | 引导符号 | 描述 |
---|---|---|
十进制 | 无 | 默认情况例如1010,-9876 |
二进制 | 0b或0B | 由字符0和1组成,例如0b101,0B101 |
八进制 | 0o或0O | 由字符0到7组成,例如0o711,0O711 |
十六进制 | 0x或0X | 由字符0到9、a到f、A到F组成,例如0xABC |
整数类型理论上的取值范围是[-∞,+∞],实际上的取值范围受限于运行Python程序的计算机内存大小。除极大数的运算外,一般认为整数类型没有取值范围限制。
pow()函数
pow(x,y)函数是Python语言的一个内置函数,用来计算xy。这里,用pow()函数测试一下整数类型的取值范围,例如:
>>> pow(2,100)
1267650600228229401496703205376
>>> pow(2,500)
3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376
pow()函数还可以嵌套使用,例如:
>>> pow(2,pow(2,2))
16
1.2 浮点数类型
浮点数由整数部分和小数部分组成,主要用于处理包括小数的数,如1.414、0.5、-1.732、3.1415926535879732384626等。浮点数也可以使用科学计数法表示,如2.7e2、-3.14e5和6.16e-2等。科学计数法使用字母e或E作为幂的符号,以10为基数,含义如下:<a>e<b>=
a*10b
Python浮点数的数值范围与小数精度受不同计算机系统的限制,sys.float_into详细列出了Python解释器所运行系统的浮点数各项参数,例如:
>>> import sys
>>> sys.float_info
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)
>>> sys.float_info.max
1.7976931348623157e+308
注意
在使用浮点数进行计算时,可能会出现小数位数不确定的情况。例如,计算0.1+0.1时,将得到想要的0.2,而计算0.1+0.2时,将得到0.30000000000000004(想要的结果为0.3),执行过程如下:
>>> 0.1+0.1
0.2
>>> 0.1+0.2
0.30000000000000004
对于这种情况,所有语言都存在这个问题,暂时忽略多余的小数位数即可。
高精度浮点运算类型
Python通过标准库decimal提供了一个更准确的数字类型Decimal,这个类型利用整数运算方法提供高精度浮点数运算,并可使用getcontext().prec参数自定义浮点数精度的位数,例如
>>> import decimal
>>> a=decimal.Decimal('3.141592653')
>>> b=decimal.Decimal('1.234567898')
>>> decimal.getcontext().prec=20
>>> a*b
Decimal('3.878509437986453394')
例题1
height = 1.70 # 保存身高的变量,单位:米
print("您的身高:" + str(height))
weight = 48.5 # 保存体重的变量,单位:千克
print("您的体重:" + str(weight))
bmi=weight/(height*height) # 用于计算BMI指数,公式为“体重/身高的平方”
print("您的BMI指数为:"+str(bmi)) #输出BMI指数
# 判断身材是否合理
if bmi<18.5:
print("您的体重过轻 ~@_@~")
if bmi>=18.5 and bmi<24.9:
print("正常范围,注意保持 (-_-)")
if bmi>=24.9 and bmi<29.9:
print("您的体重过重 ~@_@~")
if bmi>=29.9:
print("肥胖 ^@_@^")
运行结果如下:
您的身高:1.7
您的体重:48.5
您的BMI指数为:16.782006920415228
您的体重过轻 ~@_@~
说明:在上面的代码中,str()函数用于将数值转换成字符串;if语句用于进行条件判断。
1.3 复数类型
Python中的复数与数学中的复数的形式完全一致,都是由实部和虚部组成,并且使用j或J表示虚部。当表示一个负数时,可以将其实部和虚部相加,例如,一个负数,实部为3.14,虚部为12.5j,则这个负数为3.14+12.5j。
复数可以看成是二元有序实数对(a,b),表示为a+bj,其中,a是实数部分,简称实部,b是虚数部分,简称虚部。复数是实数在二维平面空间旋转的一种表示。复数类型中实数部分和虚数部分的数值都是浮点类型。对于复数z,可以用z.real和z,imag分别获得它的实数部分和虚数部分,例如:
>>> (1.23e-4+5.67e+89j).real
0.000123
>>> (1.23e-4+5.67e+89j).imag
5.67e+89
2.数字类型的操作
Python提供了9个基本的数值运算操作符,如表2所示。这些操作符由Python解释器直接提供,不需要引用标准或第三方函数库,也叫做内置操作符。
表2 内置的数值运算操作符
操作符 | 描述 |
---|---|
x+y | x与y之和 |
x-y | x与y之和差 |
x*y | x与y之积 |
x/y | x与y之商 |
x//y | x与y之整数商,即不大于x与y之商的最大整数 |
x%y | x与y之商的余数,也称为模运算 |
-x | x的负值,即x*(-1) |
+x | x本身 |
x**y | x的y次幂,即xy |
这9个操作符与数学习惯一致,运算结果也符合数学意义。操作符运算的结果可能改变数字类型,3种数字类型之间存在一种逐渐扩展的关系,具体如下:
整数->浮点数->复数
这是因为整数可以看成是浮点数没有小数的情况,浮点数可以看成是复数虚部为0的情况。基于上述扩展关系,数字类型之间相互运算所生成的结果是“更宽”的类型,基本规则如下:
- 整数之间运算,如果数学意义上的结果是小数,结果是浮点数。
- 整数之间运算,如果数学意义上的结果是整数,结果是整数。
- 整数和浮点数混合运算,输出结果是浮点数。
- 整数或浮点数与复数运算,输出结果是复数。
>>> 100/3
33.333333333333336
>>> 100//3
33
>>> 123+4.0
127.0
>>> 10.0-1+2j
(9+2j)
表中所有运算符(+、-、、/、//、%、**)都有与之对应的增强赋值操作符(+=、-=、=、/=、//=、**=)。如果用op表示这些二元数学操作符,则下面两个赋值符操作等价,注意,op和二元操作符之间没有空格:
x op= y 等价于 x = x op y
增强赋值操作符获得的结果写入变量x中,简化了代码表达,例如
>>> x=3.141592653
>>> x**=3 #与x=x**3等价
>>> x
31.006276662836743