第二篇:数值类型

来源:互联网 发布:零花钱软件赚钱靠谱吗 编辑:程序博客网 时间:2024/06/05 02:22

这一篇介绍与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**38>>>pow(2,3)8

 

3.long类型

支持无限大的数(在内存,cpu承受能力之内),这真是太好啦。

>>>32894892384*323432904321063929058105096869888L

但是,浮点型做除法时,精度细节会丢掉:

>>>74239847324789274932747294723897492379487239472389472397423740823048230840283490238408230480238402840280482.0/42789423.01.735004637122339e+99

 

4.更一般的大数操作

此时需要使用python的一个模块:decimal

使用方法如下:

>>>d = decimal.Decimal('3.14') #你可以把d当成一个数,值为3.14>>>d + 1Decimal('4.141')

有了这个类,何愁精度太小呢?

import decimaldecimal.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.35.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 Fractionf = Fraction(2, 3) #2/3f = 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.pi3.141592653589793>>>math.pi = 10>>>math.pi10>>>reload(math)>>>math.pi3.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.00.3333333333333331>>>'%e' % num string格式数值'3.3333333e-001'>>>'%4.2f' % num #可以调整格式'0.33'>>>'{0:4.2f}'.format(num) #2.6or3.0'0.33'

 

13.大小判断

 可以使用更方便的方法来进行大小比较:

x = 5if 2 < x and x < 10:    print('2<x<10')#equals to:x = 5if 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 mathmath.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 == 1True>>> False == 0True

 

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.