天天看點

[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'}