数字

基本类型

首先,进入Python交互模式中:


//整数
>>> 3
3

//长整数
>>> 33333333333333333333333333
33333333333333333333333333L

//浮点数
>>> 3.22222222222
3.22222222222

//负数
>>> -234
-234

//十六进制数
>>> 0xff
255

//八进制
>>> 010
8

在交互模式下:

如果输入3,就显示3,称为整数

当输入一个比较大的整数时,Python会自动会将这个大整数进行转换,转换的结果是一个“长整数”类型,为了表示它,会在其末尾显示一个L。由于这个操作是Python自动完成的,所有在Python中没有单独将“长整数”作为一个类型。

如果输入一个负数,直接在数字前面加上符号即可

Python也支持二进制、八进制、十六进制数。

对象身份

每个数字在Python都是一个对象,每个对象,在内存中都有自己的一个地址,这就是它的身份,用内建函数id()可以查看每个对象的内存地址即身份。

>>> id(3)
39679608
>>> id(-3)
39679680
>>> id(2.33)
39712264
>>> id(3.0)
48962672
>>> 

以上四个不同的数字是四个不同的对象,具有四个不同的内存地址。特别要注意,在数学上,3和3.0是相等的,但在这里,它们是不同的对象。

对象类型

如果要查找一个对象的类型,则使用type()这个内建函数。

>>> type(3)

>>> type(-3)

>>> type(0.3)

>>> type(222222222222222222222222222)

变量

>>> x = 5
>>> x
5
>>> x = 6
>>> x
6
>>> 
  • 在Python中,对象有类型,变量无类型

  • 当Python中写入5、6时,计算机就自动在其内存中某个地方建立了这两个对象,这两个对象的类型就是Int

  • 上述代码中的x就好比是个标签,当x=5时,就是将x这个标签拴在了5上,通过这个x,就找到了5,于是“>>>x\”输出的结果就是5。所以这个标签x没有类型之说,它不仅可以贴在整数类型的对象上,还可以贴在其他类型的对象上。

简单的四则运算

//加
>>> 3 + 5
8

//减
>>> 5 - 3
2

//乘
>>> 5 * 3
15

//整除
>>> 8 / 4
2

//模除
>>> 8 % 3
2

//混合运算
>>> 2 * 3 -4
2

整数溢出问题

在一些高级编程语言中,整数溢出是必须正视的,但是,在Python里就无需担心了,原因就是Python为我们解决了这个问题,它支持“无限精度”的整数,所以,不用考虑整数溢出的问题,Int类型与任意精度的Long整数类型可以无缝转换,超过Int范围情况都将自动转换成Long类型。

如下计算:

>>> 1234456678888914781548154815481 * 618468146815418458154815481548
763472134516343226654595368107241568115304361007546100244588L

你还可以在交互模式下计算2的1000次幂,计算方法是:

>>> 2 ** 1000
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376L
>>> 

除法

整数与整数相除

>>> 2 / 5
0
>>> 2.0 / 5
0.4
>>> 2 / 5.0
0.4
>>> 2.0 / 5.0
0.4

Python2.x中

  • 整数除整数,商是整数

  • 整数除浮点数或浮点数除整数,商是浮点数

整数与浮点数相除

>>> 9.0 / 2
4.5
>>> 9 / 2.0
4.5
>>> 9.0 / 2.0
4.5
>>> 
  • 不管是除数或者被除数,只要有一个数是浮点数,结果就是浮点数。

然而,下面的计算可能会有点不好理解:

>>> 10.0 / 3
3.3333333333333335
>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1 + 0.1 - 0.2
0.0
>>> 0.1 + 0.1 + 0.1 - 0.3
5.551115123125783e-17
>>> 0.1 + 0.1 + 0.1 - 0.2
0.10000000000000003
>>> 

原因在于十进制和二进制的转换上,计算机使用的是二进制进行计算,在上面的例子中,我们输入的是十进制,就要把十进制转换成二进制,然后在计算。但是在转化中,浮点数转化为二进制后,不会精确等于十进制的0.1。因为计算机存储的位数是有限制的,所有就出现了上述现象。

一般情况下,只要简单地将最终显示的结果用“四舍五入”到所期望的十进制位数,就会得到期望的最终结果。

对于需要非常精确的情况,可以使用decimal模块,它实现的十进制运算适合高精度要求的应用。另外fractions模块支持另外一种形式的运算,它实现的运算基于有理数。最高要求则是使用有SciPy提供的Numerical Python包和其他用于数学和统计学的包。

引用模块解决除法问题

我们可以通过以下两种形式引入模块:

  • 形式1:import module-name。import后面跟空格,然后是模块名称,例如 import os

  • 形式2:from module1 import module11。module1是一个大模块,里面还有子模块module11,只想用module11,就这么写。

如下是解决除法问题的模块:

>>> from __future__ import division
>>> 5 /2
2.5
>>> 9 / 2
4.5
>>> 9.0 / 2
4.5

引用了此模块后,不管什么情况,都能够得到浮点数的结果了。

余数

  • 模除,用%符号来取得两个数相除的余数

>>> 5 % 2
1
>>> 9 % 4
1
>>> 
  • 内建函数divmod()

>>> divmod(5,2)
(2, 1)
>>> divmod(9,4)
(2, 1)

内建函数divmod()返回的是两个值,这两个值在一个圆括号内,圆括号内的数字第一个表示商,第二个表示余数。

四舍五入

内建函数round()。

>>> round(1.234567,2)
1.23
>>> round(1.234567,3)
1.235
>>> round(10.0 /3 ,4)
3.3333
>>> 

在round()中的第二个数,表示要保留的小数位数,返回值是一个四舍五入之后的数值。

接下里看下面的特殊情况:

>>> round(0.12345,3)
0.123  #应该是1.235
>>> round(2.235,2)
2.23   #应该是2.24
>>> 

这不是Python地Bug,归根到底是浮点数中的十进制转化为二进制引起的问题

常用数学函数和运算优先级

math模块

math模块是Python标准库中的,所以不用安装就可以直接安装。使用方法是:

>>> import math

这样就将math模块引用进来了,下面就可以使用这个模块提供的工具了,比如要得到圆周率:

>>> import math
>>> math.pi
3.141592653589793
>>> 

这个模块都能做些什么事情呢?可以用下面的方法看到:

>>> dir(math)
[\'__doc__\', \'__name__\', \'__package__\', \'acos\', \'acosh\', \'asin\', \'asinh\', \'atan\', \'atan2\', \'atanh\', \'ceil\', \'copysign\', \'cos\', \'cosh\', \'degrees\', \'e\', \'erf\', \'erfc\', \'exp\', \'expm1\', \'fabs\', \'factorial\', \'floor\', \'fmod\', \'frexp\', \'fsum\', \'gamma\', \'hypot\', \'isinf\', \'isnan\', \'ldexp\', \'lgamma\', \'log\', \'log10\', \'log1p\', \'modf\', \'pi\', \'pow\', \'radians\', \'sin\', \'sinh\', \'sqrt\', \'tan\', \'tanh\', \'trunc\']
>>> 

dir(module)可以查看任何模块所包含的工具。
help(function)可以用来查看每个函数的使用情况。

>>> help(math.pow)
Help on built-in function pow in module math:

pow(...)
    pow(x, y)
    
    Return x**y (x to the power of y).

>>> 

下面来看看一些基本函数的使用:

#开平方
>>> math.sqrt(9)
3.0

#绝对值
>>> math.fabs(-2)
2.0

#模除
>>> math.fmod(5,3)
2.0

两个函数

  • 1.求绝对值

>>> abs(10)
10
>>> abs(-10)
10
>>> abs(-1.2)
1.2
  • 2.四舍五入

>>> round(1.234)
1.0
>>> round(1.234,2)
1.23

运算优先级

运算规则表:

运算符 描述
lamba Lamba表达式
or 布尔或
and 布尔与
not x 布尔非
in,not in 成员测试
is,is not 同一性测试
<,<=,>,>=,!=,== 比较
竖线 按位或
^ 按位异或
& 按位与
<<,>> 移位
+,- 加减 法
*,/,% 乘除、取余
+x,-x 正负号
~x 按位翻转
** 指数