Python强制类型转换

更新时间:2023-07-11 03:22:39 阅读: 评论:0

Python强制类型转换
学习过程中遇到了强转问题,这⾥整理⼀下。
前⾔
本篇主要介绍Python的强制类型转换。
软件环境
系统
UbuntuKylin 14.04
软件
Python 2.7.3
IPython 4.0.0
Python数据类型的显式转换
数据类型的显⽰转换,也称为数据类型的强制类型转换,是通过Python的内建函数来实现的类型转换。
显式转换的多种类型
int(x [,ba]) ⇒将x转换为⼀个⼗进制的整数
long(x [,ba]) ⇒将x转换为⼀个⼗进制的长整数
float(x) ⇒将x转换为⼀个浮点数
str(object) ⇒转换为字符串
repr(object) ⇒转换为表达式字符串伟哥效果
eval(str) ⇒⽤来计算在字符串中的有效Python表达式,并返回⼀个对象耶律楚才
tuple(q) ⇒将序列q转换为⼀个元组
list(q) ⇒将序列q转换为⼀个列表
chr(x ) ⇒将⼀个整数转换为⼀个字符
unichr(x ) ⇒将⼀个整数转换为Unicode字符
ord(x ) ⇒将⼀个字符转换为它的整数值
hex(x ) ⇒将⼀个整数转换为⼀个⼗六进制字符串
oct(x ) ⇒将⼀个整数转换为⼀个⼋进制字符串
下⾯详细介绍⼀些常⽤的类型转换。
Non-String转换为String
str()函数
str(object=”) -> string
Return a nice string reprentation 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]: li
Out[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 reprentation 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\n')
In [62]: print str(name)
My name is Jmilk
In [63]: print repr(name)
'My name is Jmilk\n'
上⾯例⼦可以看出str()打印出来的字符串会更符合⼈的阅读习惯。
eval()
eval()函数,能够结合repr()函数将⼀个经过转换为Strng类型后的对象还原为转换之前的对象类型。同时eval()也被称为求值运算,可以将字符串str当成有效的表达式来求值并返回计算结果。
In [64]: name = ('My name is Jmilk\n')
In [65]: name1 = str(name)
In [66]: name1
入盆是什么意思
Out[66]: 'My name is Jmilk\n'
In [67]: name2 = repr(name)
In [68]: name2
Out[68]: "'My name is Jmilk\\n'"
In [69]: eval(name1)
File "<string>", line 1
My name is Jmilk
^
SyntaxError: invalid syntax
In [70]: eval(name2)
Out[70]: 'My name is Jmilk\n'
eval(str(Object))可能会报错,⽆法还原为原来的对象型。⽽eval(repr(object))却可以还原,下⾯例⼦:
In [81]: name = ('My','name','is','Jmilk\n')
In [82]: repr(name)
Out[82]: "('My', 'name', 'is', 'Jmilk\\n')"
In [83]: eval(repr(name))
Out[83]: ('My', 'name', 'is', 'Jmilk\n')
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
Non-int转换为int
Int型的最⼤值仅与系统位数有关,32位:maxInt == 2**(32-1)-1 ; 64位:maxInt == 2**(64-1)-1。可以通过sys.maxint
来查看:
In [42]: sys.maxint
Out[42]: 9223372036854775807
In [43]: 2**63-1
Out[43]: 9223372036854775807L
在Python2.4x版本之后为Int增加了Long的隐式转换来防⽌数据范围溢出。
int(x[, ba=10]) -> int or long
ba:指定进制
x:通常为⼀个String
ba指定了x的进制
Long转换为Int,使⽤⾃定义函数
当⼀个Long > sys.maxint(2**63-1)时,Long类型对象是⽆法转换为Int的。
Example:
In [79]: int(2**63)
Out[79]: 9223372036854775808L    #仍为Long类型
下⾯使⽤⼀个⾃建的函数来实现当Long > sys.maxint时的Long到Int的强制类型转换。需要实现两个⽅⾯,⼀个是转换数值(不能超过maxint),另⼀个是转换类型为int。
转换数值:
In [130]: %pycat longToInt.py
import sys
def longToInt(value):
if value > sys.maxint:
return (value & sys.maxint)
el:
return value
if __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.py
number - sys.maxint = 9223372036854775808 - 9223372036854775807 = 1
result is 0,result type is <type 'long'>;number type is <type 'long'>
苏晖上例:当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.py
import sys
def longToInt(value):
if value > sys.maxint:
return (value & sys.maxint)
el:
return value
if __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.py
number - sys.maxint = 9223372036854775908 - 9223372036854775807 = 101
result is 100,result type is <type 'int'>;number type is <type 'long'>
Float转换为Int
浮点型转为整型会进⾏向下取整。
In [130]: int(10.9)
Out[130]: 10
String转换为Int
同心度符号In [131]: int('0xa',16)
Out[131]: 10
In [132]: int('1010',2)
Out[132]: 10
参数16表⽰’0xa’为16进制数,int()转换以后获得10进制数,若不指明’0xa’的进制,则会报错。
In [133]: int('0xa')
ValueError: invalid literal for int() with ba 10: '0xa'
Non-long转化为long类型
long(x=0) -> long
long(x, ba=10) -> long
⽣成⼀个long对象:
In [24]: long(10)
Out[24]: 10L
安全手抄报图片大全
也可以简单的实现:
In [138]: num = 10L
In [139]: type(num)
Out[139]: long
Int转化为Long
int型转换为long型不需要强制类型转换,这就是相对的隐式类型转换,系统会在后台完成。在后⾯的博⽂中再作介绍。
Float转换为Long
向下取整
In [27]: long(10.9)
Out[27]: 10L
String转换为Long
In [33]: long('0xa',16)
Out[33]: 10L
In [34]: long('1010',2)
Out[34]: 10L
可以看出,Int与Long类型的数据⾮常类似,唯⼀的区别在于,Long类型的数据范围更加⼤。(Int)
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.0
In [195]: float('100')
Out[195]: 100.0
In [199]: float('.1111')
Out[199]: 0.1111
In [204]: float('.98.')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-204-70a1a06c7ce5> in <module>()
----> 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

本文发布于:2023-07-11 03:22:39,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1076515.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:转换   类型   对象
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图