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 ) ⇒ 将一个整数转换为一个八进制字符串

下面详细介绍一些常用的类型转换。

Non-String转换为String

str()函数

str()是最常用的转换为String的内建函数,可以接受任意对象,并将其转换为String类型。若object为String类型,则返回一个同类型的对象。

将List对象转换为String:

>>> li=["my","name","is","jmilk"]
>>> li
['my', 'name', 'is', 'jmilk']
>>> strLi = str(li)
>>> strLi
"['my', 'name', 'is', 'jmilk']"
>>> strLi[0]
'['
>>> strLi
"['my', 'name', 'is', 'jmilk']"

将Tuple对象转换为String:

>>> tup = ('my','name','is','jmilk')
>>> tup
('my', 'name', 'is', 'jmilk')
>>> strtup=str(tup)
>>> strtup
"('my', 'name', 'is', 'jmilk')"
>>> strtup[1]
"'"
>>> strtup[3]
'y'

将Dictionary对象转换为String:

>>> dic = {'name':'Jmilk','age':23}
>>> dic
{'age': 23, 'name': 'Jmilk'}
>>> strdir=str(dic)
>>> strdir[3]
'g'

上面3个例子可以发现,在转换为String后无论是原来的特殊符号还是空格符都会成为String的元素之一。

repr()

repr()函数的使用方法于str()函数类似,都是传入一个任意对象,再返回一个String类型对象,但两者却有着本质的区别。

str()和repr()的区别:str()函数的目标是一般用户的可读性,返回一个更适合人阅读的nice string。而repr()则返回一个更适合python解析器阅读的canonical string,同时会返回Python解析器能够识别的数据细节,但这些细节对一般用户来说是多余的。而且repr()转换后的String对象可以通过求值运算eval()来还原到转换之前的对象,相比之下str()通常不需要eval()去处理。

>>> name = 'My name is Jmilk
'
>>> name
'My name is Jmilk
'
>>> str(name)
'My name is Jmilk
'
>>> repr(name)
"'My name is Jmilk\n'"
>>> print str(name)  
My name is Jmilk

>>> print repr(name)
'My name is Jmilk
'

上面例子可以看出str()打印出来的字符串会更符合人的阅读习惯。

eval()

eval()函数,能够结合repr()函数将一个经过转换为Strng类型后的对象还原为转换之前的对象类型。同时eval()也被称为求值运算,可以将字符串str当成有效的表达式来求值并返回计算结果。

>>> name = ('My name is Jmilk
')
>>> name1 = str(name)
>>> name1
'My name is Jmilk
'
>>> name2=repr(name)
>>> name2
"'My name is Jmilk\n'"
>>> eval(name1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    My name is Jmilk
          ^
SyntaxError: invalid syntax
>>> eval(name2)
'My name is Jmilk
'

eval(str(Object))可能会报错,无法还原为原来的对象型。而eval(repr(object))却可以还原,下面例子:

>>> name = ('My','name','is','Jmilk
')
>>> repr(name)
"('My', 'name', 'is', 'Jmilk\n')"
>>> eval(repr(name))
('My', 'name', 'is', 'Jmilk
')
>>> type(eval(repr(name)))
<type 'tuple'>

总结:这是因为str()函数主要是为了让人能够更好的阅读其内容,而rper()除了转换为String类型外,还能够被Python解析器识别其数据细节,从而repr()转换后的字符串能够被当作有效表达式来处理。

注意:eval()函数最主要的功能是能够将字符串中有效的表达式进行计算并返回一个对象。如下:

>>> sum="100*100"
>>> eval(sum)
10000

Non-int转换为int

Int型的最大值仅与系统位数有关,32位:maxInt == 2**(32-1)-1 ; 64位:maxInt == 2**(64-1)-1。可以通过sys.maxint
来查看:

>>> import sys
>>> sys.maxint
9223372036854775807
>>> 2**63-1
9223372036854775807L

在Python2.4x版本之后为Int增加了Long的隐式转换来防止数据范围溢出。

int(x[, base=10]) -> int or long 

base:指定被转换的String进制 

x:通常为一个String 

当一个Long > sys.maxint(2**63-1)时,Long类型对象是无法转换为Int的。

Example:

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

浮点型转为整型会进行向下取整。

>>> int(10.9)
10

String转换为Int

>>> int ('0xa',16)
10
>>> int('1010',2)
10

参数16表示’0xa’为16进制数,int()转换以后获得10进制数,若不指明’0xa’的进制,则会报错。

>>> int('0xa')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '0xa'

Non-long转化为long类型

long(x=0) -> long 
long(x, base=10) -> long 
生成一个long对象:
>>> long(10)
10L
>>>
>

也可以简单的实现:

>>> num = 10L
>>> type(num)
<type 'long'>
>>> num
10L
>>>

Int转化为Long

int型转换为long型不需要强制类型转换,这就是相对的隐式类型转换,系统会在后台完成。

Float转换为Long

向下取整

>>> long(10.9)
10L
String转换为Long

>>> long('0xa',16)
10L
>>> long('1010',2)
10L
>>>
>

可以看出,Int与Long类型的数据非常类似,唯一的区别在于,Long类型的数据范围更加大。(Int)

Non-float转换为float

可以接收Int和String类型参数,float()函数在连接数据库操作会被经常使用。当参数为String时,只能出现数字和一个点额任意组合,若出现多个点号,则会出现异常。

>>> float(10)
10.0
>>> float('100')
100.0
>>> float('.1111')
0.1111
>>> float('.98.')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): .98.
>>>

String转换为List

将字符串中的每一个字母作为列表中的一个元素,空格也算是一个元素。

>>> name = 'My name is Jmilk'
>>> list(name)
['M', 'y', ' ', 'n', 'a', 'm', 'e', ' ', 'i', 's', ' ', 'J', 'm', 'i', 'l', 'k']
>>> 

Tuple转换为List

Tuple转换为List与String其实大同小异:

>>> tup = ('My','name','is','Jmilk')
>>> list(tup)
['My', 'name', 'is', 'Jmilk']
>>>

将Tuple对象中的每一个元素转换为List中的每个元素。

String转换为Tuple

>>> str = 'My name is Jmilk!'
>>> tuple(str)
('M', 'y', ' ', 'n', 'a', 'm', 'e', ' ', 'i', 's', ' ', 'J', 'm', 'i', 'l', 'k', '!')
>>>

类似String转换为List,空格任然算一个元素。

List转换为Tuple

>>> li
['my', 'name', 'is', 'jmilk']
>>> tuple(li)
('my', 'name', 'is', 'jmilk')
>>>

将List和Tuple复合数据类型转换为Dictionary

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

>>> li = ['name','age','city']
>>> tup = ('jmilk',23,'BJ')
>>> zip(li,tup)
[('name', 'jmilk'), ('age', 23), ('city', 'BJ')]
>>> dict(zip(li,tup))
{'city': 'BJ', 'age': 23, 'name': 'jmilk'}
>>> 

Dictionary转换为List

相对的,Dictionary的键值对也能够转换为List和Tuple的复合数据类型。
D.items() -> list of D’s (key, value) pairs, as 2-tuples
>>> dic={'age': 23, 'city': 'BJ', 'name': 'jmilk'}
>>> dic
{'city': 'BJ', 'age': 23, 'name': 'jmilk'}
>>> dic.items()
[('city', 'BJ'), ('age', 23), ('name', 'jmilk')]
>>> dic.keys()
['city', 'age', 'name']

Int转换为字符char

chr(i) -> character
Return a string of one character with ordinal i; 0 <= i < 256.
以整数所对应的ASCII码来转换为Char,i属于[0,256)。
>>> chr(65)
'A'
>>> chr(97)
'a'
>>>

最后,强制数据类型转换在编程过程中非常常见,且在对内存、时间等运行环境要求严格的程序中尤为重要。

原文地址:https://www.cnblogs.com/wshenjin/p/7225378.html