第二篇:数值类型

这一篇介绍与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.

 

 

 



 

 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值