Courses
在 Python 中,每个值都有其数据类型。数据类型是对数据的分类,它告诉编译器或解释器您希望如何使用这些数据。类型定义了数据可以进行的操作以及数据应存储的结构。在数据科学中,您经常需要更改数据的类型,以便更易于使用和处理。
Python 拥有多种数据类型。您很可能已经见过并使用过其中一些。比如用于数值的整数和浮点数,用于真/假的布尔值(bool),以及用于字母数字字符的字符串。您还可以使用列表、元组、字典和集合,这些是可以存储一组值的数据结构。要进一步了解,请查看 DataCamp 的 Data Types in Python 课程。
若要轻松自行运行本教程中的所有示例代码,您可以免费创建一个 DataLab 工作簿,其中预装了 Python 并包含所有代码示例。
在 Python 中检查数据类型
在进行类型转换之前,先检查类型很有用。Python 提供了两个主要函数:
type():返回变量的类型。isinstance():检查变量是否属于某种类型。
a = 5.5
print(type(a)) # Output: <class 'float'>
print(isinstance(a, int)) # Output: False
print(isinstance(a, float)) # Output: True
Python 的隐式与显式数据类型转换
在 Python 中,数据转换可以通过两种方式发生:要么您显式地告诉编译器将某种数据类型转换为另一种类型,要么编译器自行理解并为您完成转换。前者称为显式数据类型转换,后者称为隐式数据类型转换。
Python 隐式数据类型转换
隐式转换(或称强制转换)是指在编译或运行时发生的数据类型转换,由 Python 直接为您处理。来看一个示例:
a_int = 1
b_float = 1.0
c_sum = a_int + b_float
print(c_sum)
print(type(c_sum))
2.0
<class 'float'>
提示:您可以使用 Python 中的 type() 函数来检查对象的数据类型。
在该示例中,将整数值 a_int 与浮点值 b_float 相加,结果在未显式指示编译器的情况下自动转换为浮点值 c_sum。这就是隐式数据转换。
为什么不把浮点数转换为整数呢?
这是由于计算机科学中更广泛的类型提升概念。简单来说,这是编译器的一种防御机制:在不丢失信息的前提下,将数据转换为一个更“高”类型,从而尽可能允许进行运算。
这意味着不会进行从浮点到整数的转换,因为那样编译器需要去掉小数部分,从而导致信息丢失。
Python 显式数据类型转换
显式数据类型转换(常称为类型转换,type casting)是指您有意地将一个值从一种数据类型转换为另一种数据类型。这种方式使您可以直接控制转换,因为您在代码中明确指定目标数据类型。当 Python 提供的自动(隐式)转换不满足您的需求时,这种方法最常用。
显式转换的语法为:
target_data_type(expression)
例如,如果您想把浮点数转换为整数,可以这样写:
int(3.14) # Converts 3.14 to 3
注意:虽然显式转换非常有用,但也可能导致信息丢失。例如,将浮点数转换为整数会丢弃其小数部分。理解这些后果很重要,以避免程序出现意外结果。
下面我们来看看一些常用的显式数据类型转换。
Python 原始与非原始数据结构
原始数据结构是数据处理的基石,包含纯粹、简单的数据值。Python 有四种原始变量类型:
- 整数(Integers)
- 浮点数(Float)
- 字符串(Strings)
- 布尔值(Boolean)
非原始数据结构不仅存储单个值,而是以多种形式存储值的集合。在 Python 中,常见的非原始数据结构包括:
- 列表(Lists)
- 元组(Tuples)
- 字典(Dictionaries)
- 集合(Sets)
您可以通过 DataCamp 的 Data Structures in Python Tutorial 进一步了解它们。
原始数据结构的转换
Python 整数与浮点数转换
整数和浮点数是处理数字的数据类型。
要将整数转换为浮点数,请使用 Python 的 float() 函数。类似地,如果您想将浮点数转换为整数,可以使用 int() 函数。
a_int = 3
b_int = 2
# Explicit type conversion from int to float
c_float_sum = float(a_int + b_int)
print(c_float_sum)
5.0
a_float = 3.3
b_float = 2.0
# Explicit type conversion from float to int
c_int_sum = int(a_float + b_float)
print(c_int_sum)
c_float_sum = a_float + b_float
print(c_float_sum)
5
5.3
浮点精度问题与 Decimal 模块
Python 中的浮点运算可能产生精度问题:
print(0.1 + 0.2) # Output: 0.30000000000000004
为避免此问题,请使用 Decimal 模块:
from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2')) # Output: 0.3
Python 实数到复数的转换
您可以使用 complex(real,imag) 将整数转换为复数。它需要两个整数(实部和虚部),并将实数转换为复数。
real = 2
imag = 5
print(complex(real, imag))
(2+5j)
Python 与字符串相关的数据类型转换
字符串是由一个或多个字符(字母、数字、符号)组成的集合。您可能经常需要在字符串与数字之间进行转换。
price_cake = 15
price_cookie = 6
total = price_cake + price_cookie
print("The total is: " + total + "$")
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-54bd76b9b4bd> in <module>()
2 price_cookie = 6
3 total = price_cake + price_cookie
----> 4 print("The total is: " + total + "$")
TypeError: Can't convert 'int' object to str implicitly
上述示例会抛出 TypeError,提示编译器无法隐式地将整数值转换为字符串。
程序此时应当如何处理,您也许有直觉判断。然而,编译器不一定能确定,所以提供了显式类型转换机制,让您能清楚表达意图。以下展示了如何使用 str() 函数在 Python 中将整数转换为字符串:
price_cake = 15
price_cookie = 6
total = price_cake + price_cookie
print("The total is: " + str(total) + "$")
The total is: 21$
当您将浮点数转换为字符串时,做法也是类似的。
在 Python 中,只要可行,您也可以将字符串转换为整数和浮点数。来看示例:
price_cake = '15'
price_cookie = '6'
# String concatenation
total = price_cake + price_cookie
print("The total is: " + total + "$")
# Explicit type conversion to integer
total = int(price_cake) + int(price_cookie)
print("The total is: " + str(total) + "$")
The total is: 156$
The total is: 21$
我们来分解一下这段代码。
price_cake 和 price_cookie 起初是字符串。接着您需要求和,因此必须先将它们转换为相应的整数值。否则,编译器会认为您要进行的是字符串连接,而不是数值加法。最后,您需要将该值放入展示用的字符串中,因此又要把总价转换为字符串,以便与其余显示信息拼接。
希望这个例子能帮助您理解数据类型转换的重要性。即使这是一个非常小的例子,也足以说明其用处。
注意:当将字符串转换为整数或浮点数时,您是否注意到“只要可行”这句话?这是因为并非总能把字符串转换为数字并对其进行数值运算。编译器知道这一点,因此当您尝试这么做时会报错。请看下面的示例:
price_cake = 'fifteen'
price_cookie = 'six'
total = int(price_cake) + int(price_cookie)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-25-80591b8accda> in <module>()
1 price_cake = 'fifteen'
2 price_cookie = 'six'
----> 3 total = int(price_cake) + int(price_cookie)
ValueError: invalid literal for int() with base 10: 'fifteen'
总结:Python 原始数据类型转换
| 转换 | 函数 | 示例 | 输出 |
|---|---|---|---|
| 整数转浮点 | float() |
float(3) |
3.0 |
| 浮点转整数 | int() |
int(3.9) |
3 |
| 字符串转整数 | int() |
int('123') |
123 |
| 整数转字符串 | str() |
str(123) |
'123' |
非原始数据结构的转换
Python 转换为元组与列表
与整数和浮点数类似,您也可以在列表与元组之间相互转换。
还记得元组和列表是什么吗?Python 中的 列表 和 元组 用于存储同类项的集合。二者的区别在于,元组是不可变的,这意味着一旦定义,您无法在其中删除、添加或编辑任何值。
为什么要把列表转换为元组?
因为元组是不可变的数据类型,能为您编写的程序带来显著的优化。
那为什么又要把元组转换为列表?
也许您想对初始元组进行修改。那么可以先将其转换为列表,修改后再转回元组。
在 Python 中,您可以使用 tuple() 函数将传入的值转换为元组,类似地使用 list() 函数将元组转换为列表:
a_tuple = ('a', 1) ,('f', 2), ('g', 3)
b_list = [1,2,3,4,5]
print(tuple(b_list))
print(list(a_tuple))
(1, 2, 3, 4, 5)
[('a', 1), ('f', 2), ('g', 3)]
同样,以下展示了如何在 Python 中将字符串转换为列表或元组:
dessert = 'Cake'
# Convert the characters in a string to individual items in a tuple
print(tuple(dessert))
# Convert a string into a list
dessert_list = list(dessert)
dessert_list.append('s')
print(dessert_list)
('C', 'a', 'k', 'e')
['C', 'a', 'k', 'e', 's']
Python 转换为字典与集合
您可以使用 dict() 函数将元组转换为字典,使用 set() 将列表转换为集合。
print(dict(a_tuple))
print(set(b_list))
{'a': 1, 'f': 2, 'g': 3}
{1, 2, 3, 4, 5}
与其他转换函数类似,您只需提供函数名即可将任意数据类型转换为字典和集合。
使用 dataclasses 处理结构化数据(Python 3.7+)
相比字典或元组,dataclasses 提供了更好的结构化数据处理方式。
from dataclasses import dataclass
@dataclass
class Product:
name: str
price: float
in_stock: bool
item = Product("Laptop", 799.99, True)
print(item) # Output: Product(name='Laptop', price=799.99, in_stock=True)
总结:Python 非原始数据结构转换
| 转换 | 函数 | 示例 | 输出 |
|---|---|---|---|
| 列表转元组 | tuple() |
tuple([1, 2, 3]) |
(1, 2, 3) |
| 元组转列表 | list() |
list(('a', 1)) |
['a', 1] |
| 字符串转列表 | list() |
list('Cake') |
['C', 'a', 'k', 'e'] |
| 字符串转元组 | tuple() |
tuple('Cake') |
('C', 'a', 'k', 'e') |
| 元组转字典 | dict() |
dict((('a', 1), ('b', 2))) |
{'a': 1, 'b': 2} |
| 列表转集合 | set() |
set([1, 2, 3, 4, 5]) |
{1, 2, 3, 4, 5} |
Unicode、二进制、八进制与十六进制整数
数制指的是用于表示任意数值的符号或字符的数量。我们日常使用的数制称为十进制。在十进制系统中,您使用 0 至 9 共十个符号来表示任意数量。Unicode、二进制、十六进制与八进制指的是不同的数制。
当符号用尽时,您会进到下一位。在十进制中,要表示比 9 大 1 的数,就写作 10,表示一位“十”和零个“个”。然而在其他数制中不尽相同。例如,在只使用 0 和 1 两个符号的二进制中,当符号用尽时就要进位。因此二进制计数为:0、1、10、11、100、101,等等。
接下来我们将在后续部分更详细地了解这些数制。
Python 中的二进制转十进制
二进制整数是以二为底的数字系统中的数。这意味着在二进制中只使用 0 和 1 两个符号来表示数字。从 0 开始计数,很快就会用尽符号:0、1、???
此时已经没有更多符号。您不会写 2,因为 2 在二进制中不存在。相反,您会使用 1 和 0 的特殊组合。在二进制系统中,1000 等于十进制的 8。在二进制中使用 2 的幂,因此 8 基本上是:(1(2^3)) + (0(2^2)) + (0(2^1)) + (0(2^0)) = 8。1 和 0 的位置决定了 2 应被提升到的幂次。
为了更清楚,我们看一个更复杂的例子:
Binary Number = 1001111
Decimal value = (1*(2^6)) + (0*(2^5)) + (0*(2^4)) + (1*(2^3)) + (1*(2^2)) + (1*(2^1)) + (1*(2^0))
= 79
在 Python 中,您可以直接使用 bin() 函数将十进制值转换为对应的二进制表示。
类似地,使用 int() 函数可以将二进制转换为十进制。int() 的第二个参数是要转换数字的进制,对二进制来说就是 2。
a = 79
# Base 2(binary)
bin_a = bin(a)
print(bin_a)
print(int(bin_a, 2)) #Base 2(binary)
0b1001111
79
Python 中的八进制转十进制
八进制是另一种比常规十进制更少符号的数制。它以 8 为底,使用 0、1、2、3、4、5、6、7 八个符号来表示所有数量。7 之后是 10,因为 8 在八进制中不存在。
就像在二进制中使用 2 的幂来确定数值一样,在八进制中您将使用 8 的幂。
在八进制中,10 等于十进制的 8。分解如下:(1(8^1)) + (0(8^0)) = 8。
更复杂的例子:
Octal Number = 117
Decimal value = (1*(8^2)) + (1*(8^1)) + (7*(8^0))
= 79
在 Python 中,您可以使用 oct() 函数把十进制值转换为对应的八进制表示。或者,您也可以结合正确的进制(八进制为 8)使用 int() 函数。
a = 79
# Base 8(octal)
oct_a = oct(a)
print(oct_a)
print(int(oct_a, 8))
0o117
79
Python 中的十六进制转十进制
十六进制是以 16 为底的数制。与二进制和八进制不同的是,它在十进制数字之外还使用了六个额外的符号。
但 9 之后是什么?
当需要超过常规数字符号时,就会使用字母。因此在十六进制中,完整的符号列表为 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
沿用前面的例子:
Hexadecimal Number = 4F
Decimal value = (4*(16^1)) + (F*(16^0))
= 79
在 Python 中,您可以使用 hex() 函数将十进制值转换为对应的十六进制表示,或使用以 16 为底的 int() 函数进行十六进制到十进制的转换。
a = 79
# Base 16(hexadecimal)
hex_a = hex(a)
print(hex_a)
print(int(hex_a, 16))
0x4f
79
将 Unicode 转为字符
Python 的 chr() 用于将 Unicode 整数转换为字符串。Unicode 是一种被广泛接受的字符编码,用于显示各种语言的书面文本。
我们向 chr() 函数提供了多个 Unicode 整数以显示 “DATACAMP”。您也可以使用 ord() 将单个字符转换为 Unicode 整数。
print(
chr(68),
chr(65),
chr(84),
chr(65),
chr(67),
chr(65),
chr(77),
chr(80),
)
D A T A C A M P
总结:Python 数制转换
| 转换 | 函数 | 示例 | 输出 |
|---|---|---|---|
| 十进制转二进制 | bin() |
bin(79) |
0b1001111 |
| 二进制转十进制 | int() |
int('1001111', 2) |
79 |
| 十进制转八进制 | oct() |
oct(79) |
0o117 |
| 八进制转十进制 | int() |
int('117', 8) |
79 |
| 十进制转十六进制 | hex() |
hex(79) |
0x4f |
| 十六进制转十进制 | int() |
int('4F', 16) |
79 |
| Unicode 转字符 | chr() |
chr(68) |
'D' |
| 字符转 Unicode | ord() |
ord('D') |
68 |
恭喜,您完成了!
恭喜!您已经了解了 Python 中的数据类型转换,主要借助内置方法。这将帮助您在处理不同数据类型时更加灵活,从而更高效地编写程序。
我们还有一门优秀的课程 Intermediate Python for Data Science,其中您将学习如何使用 matplotlib 绘图,以及如何处理字典与广受欢迎的 pandas DataFrame。您还将看到如何使用循环来控制程序流程。课程末尾还包含一个案例研究,您可以应用所学并将知识付诸实践!
FAQs
您可以将 join() 方法与 map() 结合使用,将每个整数转换为字符串并连接起来。
int_list = [1, 2, 3, 4]
result = ''.join(map(str, int_list))
print(result) # Output: '1234'
会抛出 ValueError,指出该字符串不是有效的整数。
int('abc') # Raises ValueError: invalid literal for int() with base 10: 'abc'
可以,您可以使用 list() 函数将集合转换为列表。
a_set = {1, 2, 3}
a_list = list(a_set)
print(a_list) # Output: [1, 2, 3]
使用 split() 方法拆分字符串,然后用 map() 将每一部分转换为整数。
numbers = "1 2 3 4"
int_list = list(map(int, numbers.split()))
print(int_list) # Output: [1, 2, 3, 4]
您可以使用 type() 函数检查变量的数据类型。
x = 5
print(type(x)) # Output: <class 'int'>