[Learning Python] Chapter 5 Numeric Types

1, 在Python 2.x 中。Python的integer,有两种类型,normal和long。Normal通常是32位的。Long表示无限精度,由计算机决定。如果数字后面有l或者L,这会强制将该数字转换为long类型。但其实,用户不必这样做,因为Python会在数值溢出的情况下自动将normal的类型转换为long类型。
然而,在Python 3.x中,normal和long合并了,没有区别了。此时不可再在数字尾部加入l或者L了。

2,integer可以用十进制(decimal)、十六进制(hexadecimal)、八进制(octal)、二进制(binary)来表示。后面三种在编程领域很常见。
十六进制(hexadecimal):以0x或者0X开头,接0~9或者A~F,大小写没有关系;
八进制(octal):以0o或者0O开头,接0~7;
二进制(binary):以0b或者0B开头,接0~1.
想要将数字转换为十进制的,可以用int(数值)方法:如int(0o100)=64;
想要将数字转换为八进制的,可以用oct(数值)方法,如oct(0x40)= 0o100;
想要将数字转换为十六进制的,可以用hex(数值)方法,如hex(64)= 0x40;
想要将数字转换为二进制的,可以用bin(数值)方法,如bin(64)= 0b1000000;

3,使用如下的方法可以将integer I 转换为十六进制数、八进制数、二进制数:
hex(I)、oct(I)、bin(I)。

4,复数 complex numbers。由实数+虚数组成。其中,虚数要以j或者J结尾。复数可以没有实数部分。

5, str()和repr()这两个方法都是可以将数值转换为字符串,不同的是,str()对用户比较友好,repr()对Python比较友好。但通常情况下,它们都是相同的。

6,在Python中,除法分为三种:
6.1,true:表示真正的除法,返回值包含小数部分,属于float型,而不管除数和被除数是什么类型的数据。跟数学里面的除法概念吻合;
6.2,classic:如果除数或被除数之一是float类型的数据,classic除法的商保留小数部分,为float型数据。而如果除数和被除数皆为integer,则商会去掉小数部分,往下取整(比如,本来是2.6,取整后为2。而本来是-2.7,取整后为-3)。
6.3,floor:这种除法的商会去掉小数部分,向小的方向靠拢。如果除数和被除数皆为integer 类型,这商也是integer。而如果除数和被除数之一是float型,则商也是float型。

7, 在Python 2.X中,/表示classic型除法,//表示floor型除法。
在Python 3.x中,/表示true型除法,//表示floor型除法。
Python 3.x已经没有classic型除法了。
ps: 如果在Python2.x中想要用到3.x的除法,可以在开头加入这样的statement:

from __future__ import division

8,为了让代码在Python2.x和3.x中都兼容,如果需要取整的操作,总是用//比较好。

9,在math模块中,提供了floor和trunc的方法。非常有用:

>>>import math
>>>math.floor(2.5)   # closest number below value
2
>>>math.floor(-2.5)
-3
>>>math.trunc(2.5)  # truncate fractional part
2
>>>math.trunc(-2.5)
-2
注意:int(I)也有truncate的功能。

10, 在Python中,实部和虚部都是float型的,虚部以j或者J结尾。

11,在Python 2.x中,八进制可以以0开头,但是在Python 3.x中,不能以0开头,一定要以0o或者0O开头!

12,位的运算bitwise operations

<<表示位向左移动
>>表示位向右移动
| 表示或运算
& 表示AND运算
^ 表示异或运算(两者不同为1,相同为0)

可以用bit_lenth()方法计算二进制数有多少位。或者len(bin())-2。因为len()会包含开头的0b这两位。

13,位的运算对Python这种高级语言不重要,如果需要做很多位运算,应该考虑低级语言如C语言。

14,round()方法可以做小数的四舍五入。如round(3.78)= 4.0, round(3,789, 2) = 3.79, round()里面的第二个参数表示的是保留多少位小数。

15,Python中的pow()函数用来计算指数。比如pow(2,4)=16, 和 2 ** 4一样的结果。

16,Python中,有自带的min和max()方法。min和max方法接受任意个单独的参数。如min(3, 1, 2, 4)= 1.

17,Python中有sum方法,可以将一列数相加起来,但是这列数应该写在括号内作为一个sequence,比如sum((1,2,3,4)) = 10,也可以是这样的sum([1, 2, 3, 4])。

18,abs函数可以取绝对值。

19,在Python中,有三种方法可以计算平方根:

A, math.sqrt(144)   #Module
B, 144 ** .5        #Expression
C, pow(144, .5)    #Built-in

20, 在Python中,计算0.1 + 0.1 + 0.1 – 0.3 并不会得到0这个准确的值。这是由于计算机由于缺少精确度而无法精确地保存数据引起的。这个时候,decimal模块很好的解决了这个问题,通过调用decimal模块的Decimal构造函数,把数据转换为str型传入,再进行运算,结果就会返回精确的0,如下:

from decimal import Decimal
print Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3')

结果:0.0
如果传入的参数仍然是float型,将无法获得这个结果。

21,使用Decimal()函数的时候。也可以设定全局精确度:

decimal.getcontext().prec = 4  #设定全局精确度为4位小数。

22,使用Fraction()函数,也可以获得和Decimal()一样的精确效果。Fraction()函数位于fractions 模块中,需要先import才可以使用。
Fraction(numerator, denominator),会自动的简化分数。
Fraction()还可以将str参数转换为分数,比如Fraction(‘.25’)=Fraction(1, 4)

23, 初始化一个空的set,使用S = set()。创建一个新的set并且赋值,使用 S = {1, 2, 3, 4}。后续若需再想set里面增加item,可以用S.add(‘…’)

24, set的运算,&表示交集,| 表示并集,- 表示差别,> 表示super set,返回布尔值。这些运算必须都是set类型。

25,union也可以用来创造出并集运算。Union里的参数可以是list,可以是set,还可以是tuple。
{1,2, 3}.union([3, 4])
{1,2, 3}.union({3, 4})

26,intersection也可以用来计算交集,参数可以是list,可以是set,还可以是tuple。

27,issubset()函数可以判断某set是否是令一个set的子集

28,set和tuple的区别:

Set在后续可以增加值,减少值,但tuple不能
Set里面的值必须是互不相同的,但tuple可以接受相同的值。
Set可以内嵌tuple,不能内嵌list,dictionary。

http://blog.csdn.net/u0103675...

29,set comprehensions

{x ** 2 for x in [1, 2, 3, 4]}
{16, 1, 4, 9}

30, set可以用来过滤掉重复的item:

>>> L = [1, 2, 1, 3, 2, 4, 5]
>>> set(L)
{1, 2, 3, 4, 5}

31,set的运算:

>>> engineers = {'bob', 'sue', 'ann', 'vic'}
>>> managers = {'tom', 'sue'}
>>> 'bob' in engineers # Is bob an engineer?
True
>>> engineers & managers # Who is both engineer and manager?
{'sue'}
>>> engineers | managers # All people in either category
{'bob', 'tom', 'sue', 'vic', 'ann'}
>>> engineers - managers # Engineers who are not managers
{'vic', 'ann', 'bob'}
>>> managers - engineers # Managers who are not engineers
{'tom'}
>>> engineers > managers # Are all managers engineers? (superset)
False
>>> {'bob', 'sue'} < engineers # Are both engineers? (subset)
True
>>> (managers | engineers) > managers # All people is a superset of managers
True
>>> managers ^ engineers # Who is in one but not both?
{'tom', 'vic', 'ann', 'bob'}
>>> (managers | engineers) - (managers ^ engineers) # Intersection!
{'sue'}