網站首頁 學習教育 IT科技 金融知識 旅遊規劃 生活小知識 家鄉美食 養生小知識 健身運動 美容百科 遊戲知識 綜合知識
當前位置:趣知科普吧 > IT科技 > 

python強制類型轉換

欄目: IT科技 / 發佈於: / 人氣:2.69W
<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

python強制類型轉換有哪些方法?一起來看看小編今天的分享吧。

數據類型的強制類型轉換,也稱爲數據類型的顯示轉換,是透過Python的內建函數來實現的類型轉換。

顯式轉換的多種類型:

int(x [,base]) ? 將x轉換爲一個十進制的整數
long(x [,base]) ? 將x轉換爲一個十進制的長整數
float(x) ? 將x轉換爲一個浮點數
str(object) ? 轉換爲字元串
repr(object) ? 轉換爲表達式字元串
eval(str) ? 用來計算在字元串中的有效Python表達式,並返回一個對象
tuple(seq) ? 將序列seq轉換爲一個元組
list(seq) ? 將序列seq轉換爲一個列表
chr(x ) ? 將一個整數轉換爲一個字元
unichr(x ) ? 將一個整數轉換爲Unicode字元
ord(x ) ? 將一個字元轉換爲它的整數值
hex(x ) ? 將一個整數轉換爲一個十六進制字元串
oct(x ) ? 將一個整數轉換爲一個八進制字元串

下面詳細介紹一些常用的類型轉換。

python強制類型轉換
一、Non-String轉換爲String

str()函數

str(object=”) -> string
Return a nice string representation of the object.
If the argument is a string, the return value is the same object.
str()是最常用的轉換爲String的內建函數,可以接受任意對象,並將其轉換爲String類型。若object爲String類型,則返回一個同類型的對象。
將List對象轉換爲String:

In [13]: liOut[13]: ['My', 'Name', 'Is', 'Jmilk']In [14]: strLi = str(li)In [15]: print strLi[0][

將Tuple對象轉換爲String:

In [19]: tup = ('my','name','is','jmilk')In [20]: str(tup)Out[20]: "('my', 'name', 'is', 'jmilk')"In [22]: str(tup)[3]Out[22]: 'y'

將Dictionary對象轉換爲String:

In [23]: dic = {'name':'Jmilk','age':23}In [24]: str(dic)Out[24]: "{'age': 23, 'name': 'Jmilk'}"In [25]: str(dic)[3]Out[25]: 'g'

上面3個例子可以發現,在轉換爲String後無論是原來的特殊符號還是空格符都會成爲String的元素之一。

repr()

repr(object) -> string
Return the canonical string representation of the object.
For most object types, eval(repr(object)) == object.
repr()函數的使用方法於str()函數類似,都是傳入一個任意對象,再返回一個String類型對象,但兩者卻有着本質的區別。

str()和repr()的區別

主要的區別就在repr()支援eval(repr(object)) == object。str()函數的目標是一般用戶的可讀性,返回一個更適合人閱讀的nice string。而repr()則返回一個更適合python解析器閱讀的canonical strng,同時會返回Python解析器能夠識別的數據細節,但這些細節對一般用戶來說是多餘的。而且repr()轉換後的String對象可以透過求值運算eval()來還原到轉換之前的對象,相比之下str()通常不需要eval()去處理。

In [61]: name = ('My name is Jmilk')In [62]: print str(name)My name is JmilkIn [63]: print repr(name)'My name is Jmilk'

上面例子可以看出str()打印出來的字元串會更符合人的閱讀習慣。

eval()

eval()函數,能夠結合repr()函數將一個經過轉換爲Strng類型後的對象還原爲轉換之前的對象類型。同時eval()也被稱爲求值運算,可以將字元串str當成有效的表達式來求值並返回計算結果。

In [64]: name = ('My name is Jmilk')In [65]: name1 = str(name)In [66]: name1Out[66]: 'My name is Jmilk'In [67]: name2 = repr(name)In [68]: name2Out[68]: "'My name is Jmilk'"In [69]: eval(name1)  File "", line 1    My name is Jmilk          ^SyntaxError: invalid syntaxIn [70]: eval(name2)Out[70]: 'My name is Jmilk'

eval(str(Object))可能會報錯,無法還原爲原來的對象型。而eval(repr(object))卻可以還原,下面例子:

In [81]: name = ('My','name','is','Jmilk')In [82]: repr(name)Out[82]: "('My', 'name', 'is', 'Jmilk')"In [83]: eval(repr(name))Out[83]: ('My', 'name', 'is', 'Jmilk')In [84]: type(eval(repr(name)))Out[84]: tuple

總結:這是因爲str()函數主要是爲了讓人能夠更好的閱讀其內容,而rper()除了轉換爲String類型外,還能夠被Python解析器識別其數據細節,從而repr()轉換後的字元串能夠被當作有效表達式來處理。
注意:eval()函數最主要的功能是能夠將字元串中有效的表達式進行計算並返回一個對象。如下:

In [141]: sum = '100+10'In [142]: eval(sum)Out[142]: 110

python強制類型轉換 第2張

二、Non-int轉換爲int

Int型的最大值僅與系統位數有關,32位:maxInt == 2**(32-1)-1 ; 64位:maxInt == 2**(64-1)-1。可以透過sys.maxint
檢視

In [42]: sys.maxintOut[42]: 9223372036854775807In [43]: 2**63-1Out[43]: 9223372036854775807L

在Python2.4x版本之後爲Int增加了Long的隱式轉換來防止數據範圍溢出。
int(x[, base=10]) -> int or long
base:指定進制
x:通常爲一個String
base指定了x的進制

Long轉換爲Int,使用自訂函數

當一個Long > sys.maxint(2**63-1)時,Long類型對象是無法轉換爲Int的。
例如:

In [79]: int(2**63)Out[79]: 9223372036854775808L     #仍爲Long類型

下面使用一個自建的函數來實現當Long > sys.maxint時的Long到Int的強制類型轉換。需要實現兩個方面,一個是轉換數值(不能超過maxint),另一個是轉換類型爲int。
轉換數值:

In [130]: %pycat longToInt.pyimport sysdef longToInt(value):    if value > sys.maxint:        return (value & sys.maxint)    else:        return valueif __name__ == '__main__':    number = 2**63    result = longToInt(number)    print 'number - sys.maxint = %s - %s = %s' % (number,sys.maxint,result)    print 'result is %s,result type is %s;number type is %s' % (result,type(result),type(number)) In [131]: run longToInt.pynumber - sys.maxint = 9223372036854775808 - 9223372036854775807 = 1result is 0,result type is ;number type is

上例:當number-sys.maxint=1時,將Long型number的數值轉化爲0輸出。即當一個int類型的數值超過sys.maxint時,再將多餘於的數值環回計數。以此類推,當number-sys.maxint=101時,Long型的number的環回計數爲100。
需要注意的是:儘管數值是大於maxint,但是其數據類型仍然爲long,可以使用int()函數將環回的數值轉化爲Int型,且只能在轉換數值後才能成功額轉換類型。
轉換類型:

In [136]: %pycat longToInt.pyimport sysdef longToInt(value):    if value > sys.maxint:        return (value & sys.maxint)    else:        return valueif __name__ == '__main__':    number = 2**63+100    result = longToInt(number)    print 'number - sys.maxint = %s - %s = %s' % (number,sys.maxint,result+1)    print 'result is %s,result type is %s;number type is %s' % (result,type(int(result)),type(number)) In [137]: run longToInt.pynumber - sys.maxint = 9223372036854775908 - 9223372036854775807 = 101result is 100,result type is ;number type is

Float轉換爲Int

浮點型轉爲整型會進行向下取整。

In [130]: int(10.9)Out[130]: 10

String轉換爲Int

In [131]: int('0xa',16)Out[131]: 10In [132]: int('1010',2)Out[132]: 10

參數16表示’0xa’爲16進制數,int()轉換以後獲得10進制數,若不指明’0xa’的進制,則會報錯。

In [133]: int('0xa')ValueError: invalid literal for int() with base 10: '0xa'

三、Non-long轉化爲long類型

long(x=0) -> long
long(x, base=10) -> long
生成一個long對象:

In [24]: long(10)Out[24]: 10L

也可以簡單的實現:

In [138]: num = 10LIn [139]: type(num)Out[139]: longInt轉化爲Long

int型轉換爲long型不需要強制類型轉換,這就是相對的隱式類型轉換,系統會在後臺完成。在後面的博文中再作介紹。

Float轉換爲Long

向下取整

In [27]: long(10.9)Out[27]: 10L

String轉換爲Long

In [33]: long('0xa',16)Out[33]: 10LIn [34]: long('1010',2)Out[34]: 10L

可以看出,Int與Long類型的數據非常類似,唯一的區別在於,Long類型的數據範圍更加大。(Int)

python強制類型轉換 第3張

四、Non-float轉換爲float

float(x) -> floating point number
Convert a string or number to a floating point number, if possible.
可以接收Int和String類型參數,float()函數在連接數據庫操作會被經常使用。當參數爲String時,只能出現數字和一個點額任意組合,若出現多個點號,則會出現異常。

In [194]: float(10)Out[194]: 10.0In [195]: float('100')Out[195]: 100.0In [199]: float('.1111')Out[199]: 0.1111In [204]: float('.98.')---------------------------------------------------------------------------ValueError                                Traceback (most recent call last) in ()----> 1 float('.98.')ValueError: invalid literal for float(): .98.

Sequence轉換爲List

list(iterable) -> new list initialized from iterable’s items
使用迭代器中的元素生成一個新的列表

五、String轉換爲List

將字元串中的每一個字母作爲列表中的一個元素,空格也算是一個元素。

In [137]: name = 'My name is Jmilk'In [138]: list(name)Out[138]:['M', 'y', ' ', 'n', 'a', 'm', 'e', ' ', 'i', 's', ' ', 'J', 'm', 'i', 'l', 'k']

Tuple轉換爲List

Tuple轉換爲List與String其實大同小異:

In [1]: tup = ('My','name','is','Jmilk')In [2]: list(tup)Out[2]: ['My', 'name', 'is', 'Jmilk']

將Tuple對象中的每一個元素轉換爲List中的每個元素。

Sequence轉換爲Tuple

tuple(iterable) -> tuple initialized from iterable’s items
利用迭代器中的元素生成新的元組

六、String轉換爲Tuple

In [5]: str = 'My name is Jmilk!' In [6]: tuple(str)Out[6]:('M', 'y', ' ', 'n', 'a', 'm', 'e', ' ', 'i', 's', ' ', 'J', 'm', 'i', 'l', 'k', '!')

類似String轉換爲List,空格任然算一個元素。

List轉換爲Tuple

In [9]: liOut[9]: ['My', 'name', 'is', 'Jmilk']In [10]: tuple(li)Out[10]: ('My', 'name', 'is', 'Jmilk')

python強制類型轉換 第4張

七、將List和Tuple複合數據類型轉換爲Dictionary

格式:dict([(key1,value1),..])

In [144]: li = ['name','age','city']In [145]: tup = ('jmilk',23,'BJ')In [146]: zip(li,tup)Out[146]: [('name', 'jmilk'), ('age', 23), ('city', 'BJ')]In [148]: dict(zip(li,tup))Out[148]: {'age': 23, 'city': 'BJ', 'name': 'jmilk'}

Dictionary轉換爲List

相對的,Dictionary的鍵值對也能夠轉換爲List和Tuple的複合數據類型。
D.items() -> list of D’s (key, value) pairs, as 2-tuples

In [159]: dicOut[159]: {'age': 23, 'city': 'BJ', 'name': 'jmilk'}In [160]: dic.items()Out[160]: [('city', 'BJ'), ('age', 23), ('name', 'jmilk')]

八、Int轉換爲字元char

chr(i) -> character
Return a string of one character with ordinal i; 0 <= i < 256.
以整數所對應的ASCII碼來轉換爲Char,i屬於[0,256)。

In [174]: chr(65)Out[174]: 'A' In [175]: chr(97)Out[175]: 'a'

強制數據類型轉換在編程過程中國非常常見,且在對內存、時間等執行環境要求嚴格的程序中尤爲重要。