跳至主要内容

Python 数据类型转换:示例指南

在本 Python 教程中,您将通过代码示例,学习原始与非原始数据结构的隐式与显式数据类型转换。
· 14分钟 阅读

使用 AI 探索

在 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'
字符转 Unicodeord()ord('D')68

恭喜,您完成了!

恭喜!您已经了解了 Python 中的数据类型转换,主要借助内置方法。这将帮助您在处理不同数据类型时更加灵活,从而更高效地编写程序。

我们还有一门优秀的课程 Intermediate Python for Data Science,其中您将学习如何使用 matplotlib 绘图,以及如何处理字典与广受欢迎的 pandas DataFrame。您还将看到如何使用循环来控制程序流程。课程末尾还包含一个案例研究,您可以应用所学并将知识付诸实践!

FAQs

如何在 Python 中将一个整数列表转换为单个字符串?

您可以将 join() 方法与 map() 结合使用,将每个整数转换为字符串并连接起来。

int_list = [1, 2, 3, 4]
result = ''.join(map(str, int_list))
print(result)  # Output: '1234'
如果尝试将非数字字符串转换为 Python 中的整数,会发生什么?

会抛出 ValueError,指出该字符串不是有效的整数。

int('abc')  # Raises ValueError: invalid literal for int() with base 10: 'abc'
可以在 Python 中将集合转换为列表吗?如何操作?

可以,您可以使用 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]
在 Python 中可以使用什么函数来检查变量的数据类型?

您可以使用 type() 函数检查变量的数据类型。

x = 5
print(type(x))  # Output: <class 'int'>

主题