为什么要数据类型转换?

前面已经学了python的基本数据类型,有数字、字符串、布尔、列表、元组、字典、集合和None。有时候,我们会对数据的类型做转换,从而更加方便的操作数据。但是数据类型也不是可以随便转换的。必须满足一些条件,除了None以外,其他的都能转换成可转换的数据类型。

数字和布尔

前面提过,布尔本质上也是个数字。除了0以外,其余的数字都是True。要想把数字转换成布尔,就需要用bool()

1
2
3
4
5
6
7
print(bool(-1))
print(bool(0))
print(bool(1.23))
------运行结果---------
True
False
True

这里说到了布尔类型就多讲一些。不单单是数字可以转换成布尔类型,任何数据类型都可以转换成布尔类型。但其他数据类型的数据是空的话,那么他就是False,反则是True。比如空字符串、空列表、空元组等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tup = ()

print(bool(""))
print(bool("True"))
print(bool([]))
print(bool(tup))
print(bool({}))
print(bool(None))
------运行结果---------
False
False
False
False
False

所有空的数据类型都是False,注意,第二个是用字符串True转换成布尔,虽然字符串的内容是True,但是,布尔是更具数据类型是否为空来转换的,所以不管字符串里的内容是什么,只要不是空,就是True,反之为False,包括None,所以布尔用来判断数据是否为空最好的选择。

而需要把布尔转换成整数用int()。数字不仅仅是有整数,还有小数,当需要把整数转换成小数的时候就需要用flaot(),注意,如果把小数转换成了整数,小数的部分就会被丢弃。

1
2
3
4
5
6
7
8
9
10
11
12
print(int(True))
print(int(False))
print(True+True)

print(float(5))
print(int(10.5))
------运行结果---------
1
0
2
5.0
10

将布尔类型转换成数字可以看到True就是数字1,False就是数字0,当两个True相加的时候,结果是数字2,这就说明,布尔类型的本质就是数字0和1,而将数字转换成布尔类型的时候,除了0是False,其余的数字都是True

字符串也是可以转换成数字,很多时候都需要把输入的字符转换成数字做加减乘除运算,所以数字格式的字符串也可以转成数字。但是,这里是区分整数和小数的,如果是整数,那么依然用int(),如果是小数,那么就用float()

1
2
3
4
5
6
7
print(int("1"))
print(float("8.3"))
print(int("-21"))
------运行结果---------
1
8.3
-21

字符串

字符串是兼容性最强的数据类型,为什么这么说呢,主要是,任何数据类型都可转换成字符串,而字符串在满足类型格式的情况下,也可以转换成指定的数据类型。

要想转换成字符串,就用str(),任何数据类型都可以转换,而需要把字符串转成其他类型,就要用指定的数据类型的方法,前面只讲了数字和布尔,其他的还没讲,所以字符串转换成其他数据类型会安插在各个数据类型的转换里将。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
print(str(10))
print(str(5.5))
print(str(False))
print(str([1,2,3]))
print(str((1,2,3)))
print(str({"num":12,"name":"abc"}))
print(str({"a","b","c"}))
------运行结果---------
10
5.5
False
[1, 2, 3]
(1, 2, 3)
{'num': 12, 'name': 'abc'}
{'c', 'a', 'b'}

字符串的兼容性很强,基本任何数据类型都可以转换成字符串,这个这里就不做过多的说明。

列表和元组

列表和元组是非常相似的两个数据类型,一个是可变的,一个是不可变的。所以这两个类型可以互相的转换,转列表用list(),转元组用tuple()

1
2
3
4
5
print(list((1,2,3)))
print(tuple([1,2,3]))
------运行结果---------
[1, 2, 3]
(1, 2, 3)

字符串也可以转列表或者元组,这里比较不一样,字符串的每个字符会成为列表或者元组的每个元素。

1
2
3
4
5
print(list("abcdefg"))
print(tuple("abcdefg"))
------运行结果---------
['a', 'b', 'c', 'd', 'e', 'f', 'g']
('a', 'b', 'c', 'd', 'e', 'f', 'g')

这个在提取字符每个元素的时候会非常好用。

字典和集合

由于字典是通过键值对存储的,而其他数据类型都没有键值对,所以一般不会将其他类型转成字典。也没办法转成字典。一般都是通过其他方法生成一个字段,这个在后面的章节讲解。

集合是存储的是无序的元素,所以可以将字符串、列表、元组、字典这些存在元素的数据类型转换成集合,用set(),字符串还是以每个字符作为元素。而字典就仅仅只是把键作为了元素,这一点要特别注意。

1
2
3
4
5
6
7
8
9
print(set("abcd"))
print(set([1,2,3]))
print(set((1,2,3)))
print(set({"a":1,"b":2}))
------运行结果---------
{'d', 'a', 'b', 'c'}
{1, 2, 3}
{1, 2, 3}
{'a', 'b'}

强大的eval()

前面讲了各种基本数据类型之间的转换。这里再讲一个非常非常强大的eval(),它可以自动将字符串转换成符合格式的类型。像前面的列表、元组、集合,都是以字符串的字符为元素,但是我有一个长得和列表一模一样的字符串,那么再用list(),就是把[]也当成的字符。这时就可以用eval()来解决这个问题了。

1
2
3
4
5
6
test_str = "[1,'a',True]"
print(list(test_str))
print(eval(test_str))
------运行结果---------
['[', '1', ',', "'", 'a', "'", ',', 'T', 'r', 'u', 'e', ']']
[1, 'a', True]

这里用列表来做演示,用同一个列表格式的字符串,可以看到,如果用list()会把符号也当作是元素。而用eval()则会自动的去识别,自动转换成了符合格式的类型。

1
2
3
4
test_str = "{'a':1,'b':2}"
print(eval(test_str))
------运行结果---------
{'a': 1, 'b': 2}

同样的前面的字典也可以转换。