这一篇介绍与Python有关的数值类型和概念,夹杂着一些新的其它方面的概念。
1.3/4 == 0?
在python中,每个数都会关联到一个类型上的,3, 4默认为整型。
(python的一个好处是这些类型都不用声明,直接拿来就用。)
这里3/4 == 0 可以类比c中的int类型除法。结果向下取舍,就变成了0.
如果想得到一个满意的结果:
3.0 / 4.0就可以了。python看到小数点,自然明白这是float类型(flaot类型在python中类似于c中float/double)
2.** or pow()函数
旧版用**表示指数运算
新版用pow表示指数运算
x ** y 或 pow(x,y) 表示 x^y的值。python V2.6可以使用任意一种方式。
>>>2**3
8
>>>pow(2,3)
8
3.long类型
支持无限大的数(在内存,cpu承受能力之内),这真是太好啦。
>>>32894892384*32343290432
1063929058105096869888L
但是,浮点型做除法时,精度细节会丢掉:
>>>74239847324789274932747294723897492379487239472389472397423740823048230840283490238408230480238402840280482.0/42789423.0
1.735004637122339e+99
4.更一般的大数操作
此时需要使用python的一个模块:decimal
使用方法如下:
>>>d = decimal.Decimal('3.14') #你可以把d当成一个数,值为3.14
>>>d + 1
Decimal('4.141')
有了这个类,何愁精度太小呢?
import decimal
decimal.getcontext().prec = 200 #设置最多200位精度
d1 = decimal.Decimal('1') #有没有引号无所谓
d2 = decimal.Decimal(3)
print(d1 / d2)
0.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
看看吧。和其它的高级语言一样,python默认的精度系统让人心寒:
>>> 0.1 + 0.1 + 0.1 - 0.3
5.551115123125783e-17
好在我们有Deciaml module:
>>> from decimal import Decimal
>>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3')
Decimal('0.0')
>>> print(Decimal('0.0'))
0.0
现在,精度的问题已经不是问题了。
5.分数代替小数
精度再大,都不能准确表示某些分数。看来要用分数模块了:fraction
from fractions import Fraction
f = Fraction(2, 3) #2/3
f = f + Fraction(1, 2)
print(f)
7/6
这里说明一下:
1.>>> 这个符号表示在IDLE中,提示输入的符号。后面设计的代码都是在eclipse里写的。所以也就省去了>>>
2.这里的结果是7/6。一般最后会把结果贴上。
3.from fractions import Fraction 表示从fractions里把Fraction暴露出来,以后就不需要使用fractions.Fraction怎么长的调用了。
4.由于导入的模块里的变量可以被你随便修改。使用reload(xxx)函数可以重新导入这个模块,清空被修改的状态:
>>>import math
>>>math.pi
3.141592653589793
>>>math.pi = 10
>>>math.pi
10
>>>reload(math)
>>>math.pi
3.141592653589793
当然了,如果小数已经产生了,怎么把它变成分数形式呢。可以这么做:
>>> (2.5).as_integer_ratio()
(5, 2)
6.神奇的扩展
*号普遍被Python用来扩展元素:
>>>[1,2]*2
[1, 2, 1, 2]
>>>'hello'*2
'hellohello'
7.查看type:
>>>a = 10
>>>type(a) #不限于int, 可以查看任意object
<type 'int'>
8.简单的oop(object oriented programming)
下面是一个简单的类。看看看懂了没?没看懂直接跳过,不要紧。
def 是函数定义标识。__int__是构造函数。每个成员函数传入self,用来给成员函数操作自己变量。
class Worker:
def __int__(self, name, pay): #Initialize when created.类似于构造函数
self.name = name
self.pay = pay
def lastName(self):
return self.name.split()[-1]
def giveRaise(self, percent):
sefl.pay *= (1.0 + percent)
bob = Worker('Bob Smith', 11223)
bob.lastName()
9.数类型
123, -24, 999999999999999 | 整数 |
1.23, 3.14e-2 | 小数 |
0177, 0x9ff, 0b1001 | 八,十六,二进制(2.6) |
0o177, 0x9ff, 0b1001 | 八,十六,二进制(3.0版) |
3+4j | 复数 |
注意:复数不是3+4i.在python中也可以使用Complex(real, imag)创建复数。
10.进制转换
十进制到各进制的转换:
>>>a = 12
>>>bin(a) #转为2进制
>>>otc(a) #转为8进制
>>>hex(a) #转为16进制
多种进制往10进制转换:
>>>int('64') #十进制
>>>int('100', 8) #8进制
>>>int('40', 16) #16进制
>>>int('100000', 2) #2进制
将十进制转化为二进制,八进制和十六进制的另一种方法:
>>>'{0:b}, {1:o}, {2:x}'.format(64, 64, 64)
11.类型强制转换
int(num) long(num)和 float(num)数可以将数转换为int long float类型。
12.数值转化为string
>>>num = 1.0/3.0
>>>repr(num)
>>>str(num)
str(num)和repr(num)类似。但是repr会给出更多的细节。数值转化为string时,也可以格式化:
>>>num = 1/ 3.0
0.3333333333333331
>>>'%e' % num string格式数值
'3.3333333e-001'
>>>'%4.2f' % num #可以调整格式
'0.33'
>>>'{0:4.2f}'.format(num) #2.6or3.0
'0.33'
13.大小判断
可以使用更方便的方法来进行大小比较:
x = 5
if 2 < x and x < 10:
print('2<x<10')
#equals to:
x = 5
if 2 < x < 10:
print('2<x<10')
说明:
1.if 结构:
if 2 < 3:
print('2<3')
elif 2 < 2.5:
print('2<2.5')
else:
print('2>=2.5')
这是一个经典的if-else-if结构。这里要注意, python中没有花括号来标明函数体。使用冒号和缩进表示。所以缩进要非常小心。同一层次的代码缩进要相同。同时冒号不能省略。
2.and or 等
python没有使用c-like语言的&& || 来表示且和或,而是使用and, or关键字。
14 / 操作符
python有两种除法操作:
/ 和 //
/ :表示整数相除,向下取整。小数不取整。
//:向下取整。
但是在3.0种。/ 在整数相除时,也不向下取整。
当然,你也可以在2.6中使用3.0这个功能:
>>>from __future__ import division
// 这种向下去整相当于math里的floor()函数
>>> import math
>>> math.floor(2.5)
2
>>> math.floor(-2.5)
-3
>>> math.trunc(2.5)
2
>>> math.trunc(-2.5)
-2
15. math
math module:数学工具包。这个模块感觉没什么好说的。只要是个像样的编程语言都会有这个扩展吧。
import math
math.floor(2.55) #向下取整
math.ceil(2.55) #向上取整
math.trunc(2.55) #截取整数部分
#题外话: round(2.55) #四舍五入
math.sqrt(144) #== 144 ** .5
16.random
random module: 提供随机化操作。
>>>import random
>>>random.random()
0.4454848546546546546456
>>>random.randint(1, 10)
5
>>>random.choice(['jinjin', 'yiyi'])
'yiyi'
17.再次讨论set
set也可以通过函数set([1, 2, 3, 4])创建。和{1, 2, 3, 4}表达功能是一样的。
set可以通过add函数加入新的元素。通过remove删除已有的元素。
set可以完成一些巧妙的操作:
如果要删除[1, 2, 3, 3, 2, 1, 3]中重复的元素,这样操作:
>>> a = [1, 2, 3, 3, 2, 1, 3]
>>> set(a)
set([1, 2, 3])
>>> a = list(set(a))
>>> a
[1, 2, 3]
seta > setb 表示 seta是否为setb的父集。
18.Bool
python中,True/False 为 bool类型。但是它们本质上是1和0
>>> True == 1
True
>>> False == 0
True
19.eval
和MATLAB一样。python提供了一个命令模拟函数eval()。这体现了动态语言的特性。
下面给出eval 的简单用法。也给出它与exec函数的一些区别。
>>> eval('[1, 2, 3, 4]')
[1, 2, 3, 4]
>>> exec('print("hello")')
hello
>>> eval('print("hello")')
Traceback (most recent call last):
File "<pyshell#79>", line 1, in <module>
eval('print("hello")')
File "<string>", line 1
print("hello")
^
SyntaxError: invalid syntax
19够了吗?python扩展
尽管python提供了上述很多数值操作的方法。但是对于科学计算还是不够的。于是有很多扩展可以增强python的数值计算能力。比如NumPy(Numeric Python)。
NumPy将在以后介绍到。
end.