MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python内置类型的类型转换

2024-04-144.4k 阅读

Python内置类型概述

在Python中,有多种内置数据类型,这些类型构成了Python编程的基础。常见的内置类型包括数值类型(整数、浮点数、复数)、序列类型(字符串、列表、元组)、映射类型(字典)、集合类型(集合、冻结集合)以及布尔类型。这些类型在不同的场景下各有其用途,而类型转换则是在这些类型之间进行数据转换的重要操作。

数值类型

  1. 整数(int:用于表示整数,Python 3中的整数没有大小限制。例如:num = 10,这里的num就是一个整数类型。
  2. 浮点数(float:用于表示带有小数部分的数字,以IEEE 754标准进行存储。例如:pi = 3.14pi就是浮点数类型。
  3. 复数(complex:用于表示复数,由实部和虚部组成。例如:z = 3 + 4jz就是复数类型。

序列类型

  1. 字符串(str:是不可变的字符序列,用于表示文本。例如:name = "John"name就是字符串类型。
  2. 列表(list:是可变的有序序列,可以包含不同类型的元素。例如:my_list = [1, "two", 3.0]
  3. 元组(tuple:是不可变的有序序列,同样可以包含不同类型的元素。例如:my_tuple = (1, "two", 3.0)

映射类型

字典(dict:是一种无序的键值对集合,其中键必须是唯一且不可变的。例如:my_dict = {'name': 'John', 'age': 30}

集合类型

  1. 集合(set:是无序的、不包含重复元素的集合。例如:my_set = {1, 2, 3}
  2. 冻结集合(frozenset:与集合类似,但它是不可变的。例如:frozen_set = frozenset({1, 2, 3})

布尔类型

布尔(bool:只有两个值,TrueFalse,用于逻辑判断。例如:is_true = True

数值类型之间的转换

整数与浮点数的转换

  1. 整数转浮点数:使用float()函数可以将整数转换为浮点数。例如:
num_int = 10
num_float = float(num_int)
print(num_float)  

在这个例子中,整数10被转换为浮点数10.0。从本质上来说,这是在内存中改变数据的存储方式,将整数的存储格式转换为浮点数的存储格式,浮点数的存储需要额外的空间来表示小数部分和指数部分。 2. 浮点数转整数:使用int()函数可以将浮点数转换为整数。需要注意的是,int()函数会直接截断小数部分,而不是进行四舍五入。例如:

num_float = 10.5
num_int = int(num_float)
print(num_int)  

这里,浮点数10.5被转换为整数10,小数部分.5被直接舍弃。这是因为int()函数的设计目的是将浮点数向零取整,这在很多数值计算场景中是有特定意义的,比如在处理数组索引等情况时,不希望有小数部分。

整数与复数的转换

  1. 整数转复数:将整数转换为复数时,实部为该整数,虚部为0。使用complex()函数,例如:
num_int = 5
num_complex = complex(num_int)
print(num_complex)  

这里,整数5被转换为复数5+0j。从实现角度看,complex()函数在内部为整数创建了一个复数对象,其中实部设置为传入的整数,虚部默认为0。 2. 复数转整数:复数不能直接转换为整数。如果要获取复数的实部并转换为整数,可以先获取实部再使用int()函数。例如:

num_complex = 3 + 4j
real_part = num_complex.real
num_int = int(real_part)
print(num_int)  

这里先获取复数3 + 4j的实部3.0,再将其转换为整数3。因为复数包含实部和虚部,直接转换为整数没有明确的数学意义,所以需要先提取实部进行转换。

浮点数与复数的转换

  1. 浮点数转复数:将浮点数转换为复数时,实部为该浮点数,虚部为0。同样使用complex()函数,例如:
num_float = 3.14
num_complex = complex(num_float)
print(num_complex)  

浮点数3.14被转换为复数3.14+0j。这与整数转复数类似,complex()函数根据传入的浮点数构建了相应的复数对象。 2. 复数转浮点数:复数不能直接转换为浮点数。若要获取复数的实部并转换为浮点数,可以使用float()函数对实部进行转换。例如:

num_complex = 3 + 4j
real_part = num_complex.real
num_float = float(real_part)
print(num_float)  

这里先获取复数3 + 4j的实部3.0,再将其转换为浮点数3.0。与复数转整数类似,由于复数的特性,不能直接转换为浮点数,需要先提取实部。

序列类型之间的转换

字符串与列表的转换

  1. 字符串转列表:使用list()函数可以将字符串转换为列表,字符串的每个字符会成为列表的一个元素。例如:
string = "hello"
list_from_string = list(string)
print(list_from_string)  

这里字符串"hello"被转换为列表['h', 'e', 'l', 'l', 'o']。在内部实现上,list()函数遍历字符串的每个字符,并将其依次添加到新创建的列表中。如果字符串中包含特殊字符或Unicode字符,同样会按字符为单位进行处理。 2. 列表转字符串:使用str.join()方法可以将列表转换为字符串。列表中的元素必须都是字符串类型。例如:

my_list = ['h', 'e', 'l', 'l', 'o']
string_from_list = ''.join(my_list)
print(string_from_list)  

这里列表['h', 'e', 'l', 'l', 'o']被转换为字符串"hello"join()方法以调用它的字符串作为分隔符,将列表中的字符串元素连接起来。如果列表中包含非字符串类型的元素,会抛出TypeError

字符串与元组的转换

  1. 字符串转元组:与字符串转列表类似,使用tuple()函数可以将字符串转换为元组,字符串的每个字符会成为元组的一个元素。例如:
string = "world"
tuple_from_string = tuple(string)
print(tuple_from_string)  

字符串"world"被转换为元组('w', 'o', 'r', 'l', 'd')tuple()函数同样是遍历字符串的每个字符,并将其添加到新创建的元组中,由于元组是不可变的,所以创建后不能再修改元素。 2. 元组转字符串:与列表转字符串类似,使用str.join()方法可以将元组转换为字符串,元组中的元素必须都是字符串类型。例如:

my_tuple = ('w', 'o', 'r', 'l', 'd')
string_from_tuple = ''.join(my_tuple)
print(string_from_tuple)  

元组('w', 'o', 'r', 'l', 'd')被转换为字符串"world"。这里join()方法同样以调用它的字符串作为分隔符,将元组中的字符串元素连接起来。

列表与元组的转换

  1. 列表转元组:使用tuple()函数可以将列表转换为元组。例如:
my_list = [1, 2, 3]
tuple_from_list = tuple(my_list)
print(tuple_from_list)  

列表[1, 2, 3]被转换为元组(1, 2, 3)tuple()函数遍历列表的每个元素,并将其添加到新创建的元组中,实现了从可变序列到不可变序列的转换。 2. 元组转列表:使用list()函数可以将元组转换为列表。例如:

my_tuple = (1, 2, 3)
list_from_tuple = list(my_tuple)
print(list_from_tuple)  

元组(1, 2, 3)被转换为列表[1, 2, 3]list()函数遍历元组的每个元素,并将其添加到新创建的列表中,实现了从不可变序列到可变序列的转换。

数值类型与序列类型的转换

整数与字符串的转换

  1. 整数转字符串:使用str()函数可以将整数转换为字符串。例如:
num_int = 123
string_from_int = str(num_int)
print(string_from_int)  

整数123被转换为字符串"123"str()函数将整数的数值以字符串的形式表示出来,这在需要将数值与文本进行拼接等场景中非常有用。从底层实现来看,str()函数根据整数的数值生成对应的字符序列,并构建字符串对象。 2. 字符串转整数:使用int()函数可以将字符串转换为整数,但字符串必须是合法的整数表示形式。例如:

string = "456"
num_int = int(string)
print(num_int)  

字符串"456"被转换为整数456。如果字符串中包含非数字字符,会抛出ValueErrorint()函数在解析字符串时,会按照十进制(默认)或指定的进制将字符串转换为整数。

浮点数与字符串的转换

  1. 浮点数转字符串:使用str()函数可以将浮点数转换为字符串。例如:
num_float = 3.14
string_from_float = str(num_float)
print(string_from_float)  

浮点数3.14被转换为字符串"3.14"str()函数将浮点数以文本形式表示,在科学计数法表示的浮点数转换时,会按照相应规则转换为字符串。例如:

num_float = 1.23e-4
string_from_float = str(num_float)
print(string_from_float)  

这里浮点数1.23e-4被转换为字符串"0.000123"。 2. 字符串转浮点数:使用float()函数可以将字符串转换为浮点数,字符串必须是合法的浮点数表示形式。例如:

string = "3.14"
num_float = float(string)
print(num_float)  

字符串"3.14"被转换为浮点数3.14。如果字符串格式不正确,会抛出ValueError

列表与数值类型的转换

  1. 列表转数值类型:列表不能直接转换为数值类型。如果列表中只有一个数值类型的元素,可以先获取该元素再进行操作。例如:
my_list = [10]
num = my_list[0]
print(num)  

这里先获取列表[10]中的唯一元素10,再进行后续操作。如果列表中有多个数值元素,可能需要进行聚合操作,例如求和后转换。

my_list = [1, 2, 3]
sum_value = sum(my_list)
num = sum_value
print(num)  

这里先对列表中的元素求和得到6,再将其作为数值使用。 2. 数值类型转列表:可以将数值类型包装在列表中。例如:

num = 5
list_from_num = [num]
print(list_from_num)  

这里将整数5包装在列表[5]中。如果要将数值的每一位拆分为列表元素,可以先转换为字符串再处理。例如:

num = 123
string_num = str(num)
list_from_num = list(string_num)
print(list_from_num)  

这里先将整数123转换为字符串"123",再将字符串转换为列表['1', '2', '3']

映射类型与其他类型的转换

字典与列表的转换

  1. 字典转列表:字典转列表通常是指将字典的键或值转换为列表。可以使用list()函数结合字典的keys()values()方法。例如,将字典的键转换为列表:
my_dict = {'a': 1, 'b': 2}
keys_list = list(my_dict.keys())
print(keys_list)  

这里将字典my_dict的键转换为列表['a', 'b']。如果要将值转换为列表,可以使用values()方法:

my_dict = {'a': 1, 'b': 2}
values_list = list(my_dict.values())
print(values_list)  

得到列表[1, 2]。如果要将字典的键值对以某种形式转换为列表,可以使用items()方法,例如:

my_dict = {'a': 1, 'b': 2}
items_list = list(my_dict.items())
print(items_list)  

得到列表[('a', 1), ('b', 2)],其中每个元素是一个包含键值对的元组。 2. 列表转字典:将列表转换为字典需要列表具有特定的结构。一种常见的情况是列表中包含成对的元素,可使用dict()函数将其转换为字典。例如:

my_list = [('a', 1), ('b', 2)]
my_dict = dict(my_list)
print(my_dict)  

这里列表[('a', 1), ('b', 2)]被转换为字典{'a': 1, 'b': 2}。如果列表结构不符合要求,例如列表元素不是成对的,会抛出ValueError

字典与字符串的转换

  1. 字典转字符串:可以使用str()函数将字典转换为字符串。例如:
my_dict = {'a': 1, 'b': 2}
string_from_dict = str(my_dict)
print(string_from_dict)  

得到字符串"{'a': 1, 'b': 2}"。这种转换后的字符串是字典的一种文本表示形式,主要用于显示或记录。 2. 字符串转字典:将字符串转换为字典需要字符串具有特定的格式,通常是类似字典字面量的格式。可以使用eval()函数或json.loads()函数(如果字符串是JSON格式)。例如,使用eval()函数:

string = "{'a': 1, 'b': 2}"
my_dict = eval(string)
print(my_dict)  

这里字符串"{'a': 1, 'b': 2}"被转换为字典{'a': 1, 'b': 2}。需要注意的是,eval()函数存在安全风险,如果字符串来自不可信的源,可能导致代码注入攻击。使用json.loads()函数处理JSON格式字符串更为安全,例如:

import json
string = '{"a": 1, "b": 2}'
my_dict = json.loads(string)
print(my_dict)  

这里JSON格式字符串'{"a": 1, "b": 2}'被转换为字典{'a': 1, 'b': 2}

集合类型与其他类型的转换

集合与列表的转换

  1. 集合转列表:使用list()函数可以将集合转换为列表。例如:
my_set = {1, 2, 3}
list_from_set = list(my_set)
print(list_from_set)  

集合{1, 2, 3}被转换为列表[1, 2, 3]。由于集合是无序的,转换后的列表元素顺序可能与集合创建时的顺序不同。 2. 列表转集合:使用set()函数可以将列表转换为集合,列表中的重复元素会被去除。例如:

my_list = [1, 2, 2, 3]
set_from_list = set(my_list)
print(set_from_list)  

列表[1, 2, 2, 3]被转换为集合{1, 2, 3},重复的2被去除。

集合与字典的转换

  1. 集合转字典:集合不能直接转换为字典,因为字典需要键值对结构,而集合只是单一元素的集合。但可以通过一些操作创建与集合相关的字典。例如,可以创建一个字典,其键为集合中的元素,值为固定值:
my_set = {'a', 'b', 'c'}
my_dict = {element: None for element in my_set}
print(my_dict)  

这里集合{'a', 'b', 'c'}被用于创建字典{'a': None, 'b': None, 'c': None}。 2. 字典转集合:可以将字典的键转换为集合,使用set()函数结合字典的keys()方法。例如:

my_dict = {'a': 1, 'b': 2}
set_from_dict = set(my_dict.keys())
print(set_from_dict)  

这里字典{'a': 1, 'b': 2}的键被转换为集合{'a', 'b'}

冻结集合与其他类型的转换

  1. 冻结集合与集合的转换:冻结集合转集合可以使用set()函数,集合转冻结集合可以使用frozenset()函数。例如:
my_frozenset = frozenset({1, 2, 3})
my_set = set(my_frozenset)
print(my_set)  

my_set = {1, 2, 3}
my_frozenset = frozenset(my_set)
print(my_frozenset)  
  1. 冻结集合与列表的转换:与集合类似,冻结集合转列表使用list()函数,列表转冻结集合先转集合再转冻结集合。例如:
my_frozenset = frozenset({1, 2, 3})
my_list = list(my_frozenset)
print(my_list)  

my_list = [1, 2, 3]
my_frozenset = frozenset(set(my_list))
print(my_frozenset)  

布尔类型与其他类型的转换

布尔与数值类型的转换

  1. 布尔转数值类型True转换为整数是1,转换为浮点数是1.0False转换为整数是0,转换为浮点数是0.0。例如:
bool_true = True
int_from_bool = int(bool_true)
float_from_bool = float(bool_true)
print(int_from_bool)  
print(float_from_bool)  

bool_false = False
int_from_bool = int(bool_false)
float_from_bool = float(bool_false)
print(int_from_bool)  
print(float_from_bool)  
  1. 数值类型转布尔:数值类型中,0(整数、浮点数)和0j(复数)转换为False,其他非零值转换为True。例如:
num_int = 0
bool_from_int = bool(num_int)
print(bool_from_int)  

num_int = 5
bool_from_int = bool(num_int)
print(bool_from_int)  

num_float = 0.0
bool_from_float = bool(num_float)
print(bool_from_float)  

num_float = 3.14
bool_from_float = bool(num_float)
print(bool_from_float)  

num_complex = 0j
bool_from_complex = bool(num_complex)
print(bool_from_complex)  

num_complex = 3 + 4j
bool_from_complex = bool(num_complex)
print(bool_from_complex)  

布尔与序列类型的转换

  1. 布尔转序列类型:布尔类型不能直接转换为序列类型,但可以基于布尔值构建序列。例如,根据布尔值决定是否将元素添加到列表中:
bool_value = True
my_list = []
if bool_value:
    my_list.append(1)
print(my_list)  

这里根据布尔值True,将元素1添加到列表my_list中。 2. 序列类型转布尔:空序列(空字符串、空列表、空元组、空集合、空字典)转换为False,非空序列转换为True。例如:

empty_string = ""
bool_from_string = bool(empty_string)
print(bool_from_string)  

non_empty_string = "hello"
bool_from_string = bool(non_empty_string)
print(bool_from_string)  

empty_list = []
bool_from_list = bool(empty_list)
print(bool_from_list)  

non_empty_list = [1, 2, 3]
bool_from_list = bool(non_empty_list)
print(bool_from_list)  

empty_tuple = ()
bool_from_tuple = bool(empty_tuple)
print(bool_from_tuple)  

non_empty_tuple = (1, 2, 3)
bool_from_tuple = bool(non_empty_tuple)
print(bool_from_tuple)  

empty_set = set()
bool_from_set = bool(empty_set)
print(bool_from_set)  

non_empty_set = {1, 2, 3}
bool_from_set = bool(non_empty_set)
print(bool_from_set)  

empty_dict = {}
bool_from_dict = bool(empty_dict)
print(bool_from_dict)  

non_empty_dict = {'a': 1}
bool_from_dict = bool(non_empty_dict)
print(bool_from_dict)  

通过深入理解Python内置类型的类型转换,可以更灵活地处理数据,编写出高效、健壮的Python程序。在实际应用中,需要根据具体的需求和场景选择合适的类型转换方式,并注意可能出现的错误和异常情况。