网站首页> 文章专栏> 机器学习之Python(4):Python数据类型介绍
机器学习之Python(4):Python数据类型介绍
原创 时间:2025-02-24 21:18 作者:管理员 浏览量:118

在 Python 的编程世界里,数据类型是构建程序大厦的基石。无论你是刚踏入编程领域的小白,还是已经在代码江湖中闯荡许久的高手,熟练掌握 Python 的数据类型,都是写出高效、优雅代码的关键。从简单的整数、浮点数,到复杂的列表、字典,每一种数据类型都有其独特的用途和操作方法。接下来,就让我们一起深入探索 Python 数据类型的奥秘,看看它们如何在编程中发挥巨大的作用。


Python 基础数据类型

(一)整数(int)

整数,是 Python 中最基础的数据类型之一,用于表示没有小数部分的数值 。在 Python 里,定义整数非常简单,直接输入数字即可,比如age = 25,这里的25就是一个整数类型,age则是一个被赋值为整数的变量。而且,Python 中的整数没有长度限制,只要机器内存足够,就能表示非常大的数,像big_number = 123456789012345678901234567890,Python 可以轻松处理。
整数的运算丰富多样,涵盖了加法、减法、乘法、除法、取余、指数等常见运算。加法如result = 5 + 3,结果为8;减法result = 10 - 4,结果是6;乘法result = 7 * 2,结果为14;除法中,/是普通除法,会返回浮点数,比如result = 15 / 2,结果是7.5,而//是整数除法运算符,它会返回不带小数的商,result = 15 // 2,结果为7 ;取余运算%用于获取除法后的余数,remainder = 15 % 4,结果是3;指数运算**用于计算一个数的幂次方,power = 2 ** 3,结果为8 。

(二)浮点数(float)

浮点数,用于表示带有小数部分的数字。它可以用十进制形式直接表示,像pi = 3.14159,也能用科学计数法表示,例如speed_of_light = 2.998e8(表示 2.998 乘以 10 的 8 次方)。在 Python 中定义浮点数和定义整数类似,直接赋值即可,如a = 0.1,b = 1.23e-5。
不过,浮点数运算时需要格外注意精度问题。因为计算机是以二进制存储浮点数的,而某些十进制小数无法精确转换为二进制,这就导致运算结果可能和预期有偏差。比如0.1 + 0.2,理论结果是0.3,但在 Python 中运行print(0.1 + 0.2),输出的可能是0.30000000000000004 。
如果对精度要求较高,可以使用decimal模块。这个模块实现的十进制数运算,非常适合会计方面的应用和有高精度要求的场景。使用时,先引入模块import decimal ,然后用decimal.Decimal()来创建对象进行运算,如a = decimal.Decimal("10.0"),b = decimal.Decimal("3"),print(a / b),得到的结果会比普通浮点数运算更精确。

(三)布尔值(bool)

布尔值是一种逻辑数据类型,在 Python 中,它只有True和False两个值 ,首字母必须大写。这两个值常用于条件判断和逻辑运算,是程序控制流程和逻辑判断的基础。
在条件判断中,比如判断一个人的年龄是否成年:
age = 20
if age >= 18:
print("成年人")
else:
print("未成年人")
这里age >= 18就是一个条件判断,结果为布尔值,如果age大于等于 18,返回True,执行print("成年人"),否则返回False,执行print("未成年人") 。

在逻辑运算中,Python 提供了and(与)、or(或)、not(非)三种逻辑运算符。and运算符连接两个布尔表达式,只有当两个表达式都为True时,结果才为True,否则为False,例如True and True结果是True,True and False结果是False ;or运算符连接两个布尔表达式,只要至少有一个表达式为True,结果就为True,只有两个表达式都为False时,结果才为False,如True or False结果是True,False or False结果是False ;not运算符用于对单个布尔表达式进行取反操作,not True结果是False,not False结果是True 。


Python 容器数据类型

(一)列表(list)

列表是 Python 中最常用的数据结构之一,它是一个可变、有序的集合,可以包含不同类型的元素 。在 Python 里,创建列表非常简单,用方括号[]把元素括起来,元素之间用逗号隔开就行,像fruits = ['apple', 'banana', 'cherry'],这个fruits列表就包含了三个字符串元素;mixed_list = [1, 'hello', 3.14, True],这个mixed_list列表则包含了整数、字符串、浮点数和布尔值四种不同类型的元素。
访问列表元素时,通过索引就能轻松实现,索引从 0 开始。比如要访问fruits列表中的第一个元素'apple',可以用fruits[0];如果想从列表末尾开始访问,就使用负数索引,fruits[-1]获取的就是最后一个元素'cherry' 。
列表的操作方法丰富多样。添加元素时,append()方法能在列表末尾添加一个元素,fruits.append('orange'),这样fruits列表就变成了['apple', 'banana', 'cherry', 'orange'];insert()方法可以在指定索引位置插入元素,fruits.insert(1, 'grape'),此时fruits列表变为['apple', 'grape', 'banana', 'cherry', 'orange'] 。删除元素时,remove()方法用于移除列表中第一个匹配的元素,fruits.remove('banana'),fruits列表就成了['apple', 'grape', 'cherry', 'orange'];pop()方法能删除并返回指定索引位置的元素,默认是最后一个元素,removed_fruit = fruits.pop(2),fruits列表变为['apple', 'grape', 'orange'],removed_fruit的值为'cherry' 。修改元素也很简单,直接通过索引重新赋值即可,fruits[1] = 'kiwi',fruits列表就变成['apple', 'kiwi', 'orange'] 。
切片操作可以获取列表的一部分,fruits[1:3]会返回索引 1(包含)到索引 3(不包含)的元素,结果是['kiwi', 'orange'];fruits[:2]获取前两个元素,结果是['apple', 'kiwi'];fruits[2:]获取从索引 2 开始的所有元素,结果是['orange'] 。
列表推导式是一种非常强大的特性,能简洁地创建列表。比如要创建一个包含 1 到 10 的平方的列表,用列表推导式可以写成squares = [x**2 for x in range(1, 11)] ,得到的squares列表就是[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 。

(二)元组(tuple)

元组和列表类似,也是有序的元素集合,但元组最大的特点是不可变,一旦创建,就不能修改其元素 。创建元组用圆括号(),元素之间同样用逗号隔开,像numbers = (1, 2, 3, 4, 5),这是一个包含五个整数的元组;coordinates = (10.5, 20.3),这是一个包含两个浮点数的元组 。创建只包含一个元素的元组时,要在元素后面加个逗号,single_element_tuple = (42,),不然 Python 会把它当成普通的括号表达式。
元组的访问方式和列表一样,通过索引来获取元素,numbers[0]得到的是1,coordinates[-1]得到的是20.3 。不过因为元组不可变,所以不能像列表那样修改元素,比如numbers[1] = 10这样的操作会报错。但如果元组中包含可变对象,像列表,那么可变对象本身是可以被修改的,my_tuple = (1, [2, 3], 4),my_tuple[1].append(5),此时my_tuple变为(1, [2, 3, 5], 4) 。
虽然元组不可变,但在一些场景中,它比列表更有优势,比如作为字典的键,或者在需要确保数据不被意外修改的情况下。而且元组的不可变性使得它在内存占用和性能上相对更高效,因为它不需要额外的空间来支持元素的修改操作。

(三)集合(set)

集合是一种无序、无重复元素的集合,它基于哈希表实现,这使得集合在判断元素是否存在时非常高效,时间复杂度接近 O (1) 。在 Python 中,创建集合可以用大括号{},像fruits_set = {'apple', 'banana', 'cherry'},也可以用set()函数,numbers_set = set([1, 2, 3, 4, 5]) 。需要注意的是,创建空集合只能用set(),因为{}创建的是空字典 。
集合的常见操作方法有很多。添加元素时,add()方法用于添加单个元素,fruits_set.add('orange'),集合变为{'apple', 'banana', 'cherry', 'orange'};update()方法可以添加多个元素,fruits_set.update(['kiwi', 'mango']),集合变为{'apple', 'banana', 'cherry', 'orange', 'kiwi', 'mango'} 。删除元素时,remove()方法会移除指定元素,如果元素不存在会报错,fruits_set.remove('banana'),集合变为{'apple', 'cherry', 'orange', 'kiwi', 'mango'};discard()方法也能移除指定元素,但元素不存在时不会报错,fruits_set.discard('grape'),集合不变 。
集合还支持一些数学运算,比如交集、并集、差集等。假设有两个集合set1 = {1, 2, 3, 4}和set2 = {3, 4, 5, 6},它们的交集set1.intersection(set2)结果是{3, 4},表示两个集合中都有的元素;并集set1.union(set2)结果是{1, 2, 3, 4, 5, 6},包含两个集合的所有元素;差集set1.difference(set2)结果是{1, 2},表示在set1中但不在set2中的元素 。

(四)字典(dict)

字典是一种键值对的集合,它的底层基于哈希表实现,这使得字典在查找、插入和删除操作上都非常高效,时间复杂度平均为 O (1) 。在 Python 中,字典用大括号{}创建,每个键值对之间用逗号隔开,键和值之间用冒号:连接,比如person = {'name': 'Alice', 'age': 25, 'city': 'New York'} 。这里'name'、'age'、'city'是键,'Alice'、25、'New York'是对应的值 。
访问字典中的值通过键来实现,person['name']会返回'Alice' 。如果访问不存在的键,会抛出KeyError异常,为了避免这种情况,可以使用get()方法,person.get('gender', 'Unknown'),如果'gender'键不存在,就会返回默认值'Unknown' 。
字典的常见操作方法也不少。修改键值对时,直接赋值即可,person['age'] = 26,字典中的'age'值就被更新为26;添加新键值对同样直接赋值,person['email'] = 'alice@example.com',字典就新增了一个键值对 。删除键值对可以用del语句,del person['city'],字典中'city'键值对就被删除了;也可以用pop()方法,removed_value = person.pop('age'),person字典中'age'键值对被删除,同时removed_value会返回'age'对应的值26 。

字典推导式可以快速创建字典,比如要创建一个键为 1 到 5,值为键的平方的字典,可以写成squares_dict = {x: x**2 for x in range(1, 6)} ,得到的squares_dict字典就是{1: 1, 2: 4, 3: 9, 4: 16, 5: 25} 。


Python 其他数据类型

(一)字符串(str)

字符串是 Python 中用于表示文本的数据类型,它是一个不可变的字符序列 。在 Python 里,定义字符串非常灵活,可以用单引号'、双引号"或三引号'''(或""")括起来 。比如message1 = 'Hello, World!',message2 = "Python is awesome",message3 = '''This is a multi - line string.
It can span multiple lines.''' 。单引号和双引号的作用基本相同,主要用于定义单行字符串,而三引号常用于定义多行字符串,在处理包含大量文本或需要保留换行格式的场景中非常实用,像文档注释、诗歌文本等 。
字符串有许多常见的操作方法。获取字符串长度用len()函数,length = len('Hello'),length的值就是5 。修改大小写时,upper()方法将字符串转换为大写,'hello'.upper()返回'HELLO';lower()方法将字符串转换为小写,'WORLD'.lower()返回'world' 。替换操作使用replace()方法,'I love Python'.replace('Python', 'programming'),会返回'I love programming' 。切割字符串用split()方法,'apple,banana,cherry'.split(','),返回一个列表['apple', 'banana', 'cherry'] 。拼接字符串可以用+运算符,greeting = 'Hello,'+ 'Alice',greeting的值为'Hello, Alice' 。

(二)NoneType

在 Python 中,None是一个特殊的对象,表示 “无” 或 “空”,它属于NoneType类型 。None常被用作占位符,比如在变量尚未赋值或函数没有明确返回值时 。当一个变量没有被赋予具体的值时,可以先将其赋值为None,user_name = None,表示这个变量暂时没有实际的用户名,后续可以再根据具体情况进行赋值 。
函数如果没有使用return语句返回值,或者return后面没有跟任何表达式,默认返回None 。比如:
def greet():
print('Hello!')
result = greet()
print(result) # 输出None
这里greet函数没有返回值,所以result的值就是None 。在条件判断中,None被视为False,可以通过is关键字来判断一个变量是否为None,if user_name is None:,这种方式比使用==更准确,因为None是一个单例对象,只有一个实例,用is能确保判断的是同一个对象 。

(三)字节(bytes)和字节数组(bytearray)

字节(bytes)和字节数组(bytearray)主要用于处理二进制数据,比如在文件 I/O、网络通信等场景中 。bytes是不可变的字节序列,bytearray是可变的字节序列 。
定义bytes类型可以用b前缀加上字符串,data = b'Hello',这里data就是一个bytes对象;也可以使用bytes()函数,bytes(range(10))会创建一个包含 10 个字节的bytes对象,每个字节的值依次是 0 到 9 。定义bytearray类型用bytearray()函数,arr = bytearray(b'Hello'),arr就是一个bytearray对象,初始值是'Hello'的字节表示 。
在文件操作中,读取二进制文件时会返回bytes类型数据,with open('image.jpg', 'rb') as f:

image_data = f.read(),这里image_data就是bytes类型,包含了图片的二进制数据 。在网络通信中,发送和接收的数据通常也是以字节的形式传输,比如使用socket模块进行网络编程时,sock.send(b'Hello, Server!'),将bytes类型的数据发送到服务器 。bytearray的可变性使得它在需要频繁修改二进制数据的场景中很有用,像在解析二进制协议数据时,如果需要对部分数据进行修改,就可以使用bytearray 。


数据类型的选择与应用场景

(一)根据需求选择数据类型

在实际编程中,选择合适的数据类型至关重要,它直接影响到程序的效率和可读性。如果需要一个可变的有序序列,用于存储和操作一组相关的数据,比如一个班级学生的成绩列表,就可以选择列表 。列表的灵活性使得添加、删除和修改成绩变得轻松,能满足动态变化的数据需求。
当数据不需要被修改,像存储圆周率的近似值,或者函数返回多个固定值时,元组就派上用场了 。元组的不可变性保证了数据的稳定性,也在一定程度上提高了程序的性能。
如果要存储具有映射关系的数据,比如一个单词及其对应的释义,字典就是最佳选择 。通过键来快速查找对应的值,字典的这种特性使得查询操作非常高效。

(二)实际案例分析

以一个简单的学生信息管理系统为例,假设我们要管理学生的姓名、年龄、成绩和选课信息。学生姓名和年龄可以用字符串和整数类型存储,比如name = 'Tom',age = 20 。
学生的成绩是一个可变的有序序列,不同课程的成绩会动态变化,所以可以用列表存储,scores = [85, 90, 78] ,分别代表不同课程的成绩。
学生的选课信息,每门课程和对应的成绩之间存在映射关系,适合用字典来存储,course_scores = {'Math': 85, 'English': 90, 'Science': 78} 。

通过综合运用这些数据类型,我们可以方便地实现学生信息的存储、查询、修改等操作 。比如要查询某个学生的数学成绩,通过course_scores['Math']就能快速获取;要修改学生的年龄,直接对age变量重新赋值即可;要添加一门课程的成绩,往scores列表中追加元素,或者往course_scores字典中添加新的键值对就行。


总结

Python 的数据类型丰富多样,每种都有其独特的特性和适用场景。基础数据类型如整数、浮点数和布尔值,是进行数值计算和逻辑判断的基础;容器数据类型像列表、元组、集合和字典,为数据的组织和管理提供了强大的工具;字符串用于处理文本,NoneType表示空值,字节和字节数组则在二进制数据处理中发挥作用。在实际编程中,深入理解并正确选择数据类型,能让你的代码更加高效、简洁和易维护。
动动小手 !!!
来说两句吧
最新评论