还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
数据类型Python作为一种强大的编程语言,其丰富的数据类型是构建程序的基础作Python为一种动态类型语言,允许变量的类型在运行时自动确定,无需像静Python态类型语言那样预先声明支持多种内置数据类型,包括基本类型如整数、浮点数、字符串,以Python及复杂类型如列表、元组、字典等这些类型为程序员提供了灵活处理各种数据的能力,使得在数据分析、人工智能等领域广泛应用Python通过本课程,我们将深入探讨的各种数据类型的特性、用法以及它们Python之间的转换和操作,帮助大家全面掌握数据处理的基础知识Python数据类型的重要性内存管理性能影响数据类型决定了变量在内存中不同的数据类型有不同的操作的存储方式,影响程序的内存效率,例如列表查找比字典查占用效率不同类型的数据在找慢,适当选择数据类型可以内存中的表示形式各不相同,显著提升程序性能在处理大合理选择数据类型可以优化内量数据时,这种差异尤为明存使用显对象特性在中,几乎所有的数据都是对象,每种类型的对象都有其特定Python的属性和方法理解这一点对于编写优雅高效的代码至关重Python要的数据类型分类Python数值类型文本类型包括整数、浮点数和复数int float主要是字符串,用于存储文本数据complexstr序列类型包括列表、元组和范围list tuple二进制类型range包括字节、字节数组bytes和内存视图映射类型bytearraymemoryview主要是字典,存储键值对数据dict布尔类型集合类型布尔值,表示或bool True False包括集合和冻结集合set frozenset动态类型与函数type动态类型特性函数应用type是动态类型语言,这意味着变量的类型是在赋值时确定可以使用内置的函数来查询任何变量的类型这在调试代Python type的,而不是在声明时同一个变量可以在不同时刻指向不同类型码或处理未知数据时非常有用的对象,这提供了很大的灵活性x=10这与静态类型语言如或形成对比,后者要求在使用变Java C++printtypex#输出:量前先声明其类型,且类型一旦确定就不能改变y=Helloprinttypey#输出:z=[1,2,3]printtypez#输出:文本类型简介str创建字符串字符编码使用单引号存储字符•hello•Unicode使用双引号支持全球各种语言文字•world•三引号多行字符串多行处理和特殊符号••emoji文本字符串不可变性字符串对象创建后不能修改•所有修改操作都会创建新字符串•提高内存使用效率•核心用法示例str字符串拼接与重复使用运算符连接字符串+Hello++World=Hello World使用运算符重复字符串*Hi*3=HiHiHi字符串格式化姓名年龄f-string Python
3.6+f:{name},:{age}方法的价格是元苹果format{}{}.format,5操作符的价格是元苹果%%s%d%,5字符串切片与索引正向索引,Python
[0]=P Python
[1]=y负向索引,Python[-1]=n Python[-2]=o切片,,Python[1:4]=yth Python[:2]=Py Python[2:]=thon常用方法str方法功能示例转换为小写lower HELLO.lower→hello转换为大写upper hello.upper→HELLO分割字符串split a,b,c.split,→[a,b,c]连接字符串列表join,.join[a,b,c]→a,b,c去除首尾空白stripxyz.strip→xyz替换字符串replace hello.replacel,x→hexxo查找子串位置find hello.findll→2计算子串出现次数count hello.countl→2数值类型总览整数类型intPython中的整数可以是任意大小,仅受限于可用内存Python3不再区分长整型和普通整型,所有整数都由int类型表示在编程中,整数常用于计数、索引和精确计算浮点类型float用于表示带小数点的数值,内部使用IEEE754双精度格式存储需要注意的是,由于二进制表示的局限性,某些小数(如
0.1)无法被精确表示,可能导致精度问题复数类型complex用于表示数学中的复数,由实部和虚部组成,如3+4j复数类型主要用于科学计算、电气工程和信号处理等领域,支持常见的数学运算整数型详解int无限精度多进制表示的整数类型没有大小支持以多种进制表示Python Python限制,可以存储任意大的整整数十进制是默认的表示方数,只受限于系统可用内存式,而二进制、八进制和十六这使得特别适合需要进制则需要特定前缀二Python0b处理大数值的场景,如密码学进制、八进制、十0o0x或科学计算六进制内置数学功能为整数提供了丰富的内置操作,包括除法(,)、取模Python///()、幂运算()等此外,模块提供了更高级的数学函%**math数常见操作int基本算术运算加减乘除模、地板除和幂运算类型转换字符串、浮点数等转整数比较操作等于、大于、小于等比较内置数学函数绝对值、最大最小值等#基本算术x=10+5#加法15y=10-5#减法5z=10*5#乘法50a=10/5#除法
2.0(结果是float)b=10//3#整除3c=10%3#取模1d=2**3#幂运算8#类型转换int42#字符串转整数42int
3.14#浮点数转整数3浮点型详解float浮点数本质表示方式中的类型遵循标准,使用位双精度浮浮点数可以使用常规小数表示法(如)或科学计数法(如Python floatIEEE
754643.14点格式这种格式由符号位、指数和尾数组成,可以表示非常大,表示)表示科学计数法特别适合表示非常大
1.2e
31.2×10³和非常小的数,但精度有限或非常小的数由于二进制表示的局限性,某些十进制小数(如或)无法
0.
10.2#常规小数表示被精确表示为二进制浮点数,这可能导致计算结果的微小误差pi=
3.14159#科学计数法avogadro=
6.022e23#阿伏伽德罗常数plank=
6.626e-34#普朗克常数常见操作float算术运算四舍五入比较操作浮点数支持所有标使用函数可由于浮点数精度问round准数学运算,包括以将浮点数四舍五题,比较浮点数相加减乘除和幂运入到指定小数位等时应避免直接使算当整数和浮点数不指定小数位用,而应检查差==数混合运算时,结数时,默认舍入到值是否小于某个很果通常是浮点数最接近的整数小的数()epsilon类型转换可以使用函float数将整数或字符串转换为浮点数转换字符串时,该字符串必须表示有效的数值复数类型complex复数的构成复数的属性和操作中的复数由实部和虚部组成,表示为,其中是实部,是虚每个复数对象都有两个属性和,分别表示实部和虚部获取Python a+bj ab.real.imag部,是虚数单位(数学中常写作)复数类型在科学计算、信号处理和复数的共轭可以使用复数的方法j iconjugate电气工程等领域广泛应用#创建复数复数可以直接字面量创建,如,也可以使用函数创建,如3+4j complexz1=3+4j复数支持常见的数学运算,包括加减乘除和幂运算complex3,4z2=complex2,5#访问实部和虚部printz
1.real#输出:
3.0printz
1.imag#输出:
4.0#复数运算z3=z1+z2#复数加法z4=z1*z2#复数乘法z5=z
1.conjugate#复数共轭:3-4j数值类型的共性与区别共同特点整型特点都支持基本算术运算精确表示整数••都可以参与混合类型计算无大小限制••都支持比较操作支持位运算••复数特点浮点型特点包含实部和虚部可表示小数••支持复数运算精度有限••用于科学计算支持科学计数法••布尔类型bool布尔值的本质布尔值的应用中的布尔类型只有两个值和在布尔值主要用于条件判断和逻辑运算,如语句、循环、Python boolTrueFalsePython ifwhile内部,布尔类型实际上是整数类型的子类,其中等价于整运算等任何对象都可以被解释为布尔值,这称为真值int Trueand/or/not数,等价于整数测试1False0在中,以下值被视为、、数值(包括Python FalseNone False0#布尔值的整数等价性、、)、空序列(、、、、)等其他所有值都
00.00j[]{}setprintTrue+True#输出:2被视为TrueprintFalse*10#输出:0printTrue==1#输出:True#真值测试示例printFalse==0#输出:Trueif[]print这不会打印,因为空列表是Falseif[1,2,3]print这会打印,因为非空列表是True序列类型概览序列的共性索引、切片、迭代、长度、包含关系检查列表list可变有序集合,使用[]表示元组tuple不可变有序集合,使用表示范围range不可变的数字序列,常用于循环Python的序列类型包括列表、元组和范围,它们都是有序的集合类型,可以通过索引访问元素序列类型共享许多操作和方法,如len、min、max、count等所有序列都支持迭代,可以在for循环中使用列表是最常用的序列类型,它是可变的,可以随时添加、删除或修改元素元组与列表类似,但它是不可变的,创建后不能修改range类型用于生成一个不可变的数字序列,常用于for循环中,以控制循环次数列表类型详解list可变特性异构元素列表是中最灵活的序列表可以包含任何类型的元Python列类型,它的元素可以随时添素,甚至是混合类型一个列加、删除或修改这与元组的表可以同时包含整数、字符不可变性形成鲜明对比列表串、布尔值,甚至其他列表或的可变特性使其成为存储和操复杂对象这种灵活性使得列作数据的理想选择表能够适应各种数据组织需求丰富的方法列表类型提供了丰富的内置方法,如、、append extendinsert用于添加元素;、用于删除元素;、remove popsort reverse用于排序和反转等这些方法使得列表操作既简洁又高效实用示例list列表的混合类型列表的修改Python列表可以包含不同类型的元素,这使得列表非常灵活,能够列表的创建与访问列表元素可以通过索引直接修改,也可以使用切片替换一段元素列适应各种数据组织需求列表甚至可以包含其他列表,形成嵌套结列表可以通过方括号直接创建,或者使用list函数将其他可迭代对表提供了多种方法来添加和删除元素,如append、insert、构象转换为列表列表元素可以通过索引访问,索引从0开始负索引remove、pop等表示从末尾开始计数,如-1表示最后一个元素#混合类型列表#修改元素mixed=[1,文本,True,[2,3,4]]#创建列表fruits
[1]=梨#[苹果,梨,橙子]fruits=[苹果,香蕉,橙子]#访问嵌套列表元素numbers=listrange1,6#[1,2,3,4,5]#添加元素inner_list=mixed
[3]#[2,3,4]fruits.append葡萄#[苹果,梨,橙子,inner_element=mixed
[3]
[1]#3#访问元素葡萄]first_fruit=fruits
[0]#苹果fruits.insert1,草莓#[苹果,草莓,梨,last_fruit=fruits[-1]#橙子橙子,葡萄]#删除元素fruits.remove梨#[苹果,草莓,橙子,葡萄]last=fruits.pop#返回并删除葡萄常用高级操作list列表推导式排序与拷贝列表推导式提供了一种简洁的方式来创建列表,它结合了for循环和条件语句,使得代码更Python提供了两种排序列表的方式sort方法和sorted函数sort方法原地排序列加紧凑和高效列表推导式的语法为[表达式for变量in可迭代对象if条件],其中if条件表,修改原列表;sorted函数返回一个新的排序列表,不修改原列表对于复杂对象,部分是可选的可以使用key参数指定排序依据Python中的赋值是引用传递,对于可变对象如列表,直接赋值会创建指向同一对象的引#生成平方数列表用如果需要创建独立的副本,可以使用切片[:]、list函数或copy模块中的copy和squares=[x**2for x in range10]#[0,1,4,9,16,25,36,49,deepcopy函数64,81]#排序#筛选偶数numbers=[3,1,4,1,5,9]evens=[x for xin range10if x%2==0]#[0,2,4,6,8]numbers.sort#原地排序,变为[1,1,3,4,5,9]sorted_numbers=sortednumbers,reverse=True#返回逆序排序的新列表#嵌套列表推导式matrix=[[i*j forj in range3]for iin range3]#拷贝#[[0,0,0],[0,1,2],[0,2,4]]import copya=[1,2,[3,4]]b=a#引用同一对象c=a[:]#浅拷贝d=copy.deepcopya#深拷贝元组类型tuple不可变性创建语法性能优势元组的最大特点是不可变性,元组使用小括号创建,元素由于元组是不可变的,一旦创建,其元素就不能被修之间用逗号分隔注意,单元Python解释器可以对其进行改、添加或删除这种特性使素元组必须在元素后加逗号,一些内部优化,使得元组在某元组成为存储固定数据集合的否则Python会将其解释为普些情况下比列表更高效,特别理想选择,例如坐标点、RGB通的括号表达式也可以不使是在创建和访问元素时此颜色值等元组的不可变性也用括号,只用逗号分隔元素来外,元组占用的内存通常比同使其可以用作字典的键创建元组等大小的列表少操作方法虽然元组不能修改元素,但它支持许多与列表相同的操作,如索引、切片、连接、重复等元组也可以使用count和index方法来计数和查找元素的应用场景tuple多值返回数据保护字典键函数可以返回元组来实现多值返回这是元组的不可变性使其成为存储不应改变的数据要求字典的键必须是可哈希的(即不可Python中一种常见的模式,允许函数同时返回的理想选择这可以防止数据被意外修改,增变的)元组如果只包含可哈希元素(如数Python多个值,调用者可以通过解包赋值来获取这些加程序的健壮性字、字符串或其他只包含可哈希元素的元值组),就可以用作字典的键,而列表则不能#使用元组存储固定配置def get_dimensions:settings=localhost,8080,#使用元组作为字典键return1920,1080#返回一个UTF-8coordinate_values={元组host,port,encoding=settings0,0:原点,1,0:x轴正方向单位点,width,height=get_dimensions#尝试修改元组会引发TypeError0,1:y轴正方向单位点#解包赋值#settings
[1]=9090#这会引发错}printf宽度:{width},高度:误{height}#宽度:1920,高度:printcoordinate_values[0,0]1080#输出:原点序列类型range创建range对象内存效率range类型用于表示一个不可变的数字序range对象占用固定的少量内存,无论其列,通常用于for循环中range可以接受1表示的序列有多长这是因为range只存到3个参数rangestop、rangestart,储start、stop和step值,而不是存储序列stop或rangestart,stop,step中的每个值这使得range非常适合表示大范围的数字序列•start序列的起始值,默认为0•stop序列的结束值(不包含)•range1000000只占用几十字节内存•step序列的步长,默认为1•等效列表listrange1000000将占用数兆字节常见应用range主要用于for循环中进行计数迭代,也可以转换为列表或用于其他需要数字序列的场景•for循环for iin range5•生成数字列表listrange1,11•序列索引for iin rangelenseq•反向迭代for iin range10,0,-1序列类型的共性索引与切片所有序列类型都支持通过索引访问元素(如seq
[0])和切片操作(如seq[1:4])索引从0开始,负索引表示从末尾开始计数切片语法为seq[start:stop:step],其中start、stop和step都是可选的类型转换序列类型之间可以相互转换可以使用list函数将其他序列转换为列表,使用tuple函数将其他序列转换为元组range对象可以通过list转换为列表,但不能直接转换为元组迭代能力所有序列类型都是可迭代的(iterable),可以在for循环中使用这是序列类型最基本和最重要的特性之一Python的for循环本质上是对可迭代对象的迭代通用函数所有序列类型都支持一系列通用函数,如len(返回序列长度)、min和max(返回序列中的最小值和最大值)、sum(对数字序列求和)、sorted(返回排序后的序列副本)等字典类型dict创建语法键值映射使用花括号或构造函数创建dict字典存储键值对,通过键快速查找值键的要求键必须是不可变对象(可哈希)可变性查找效率可以动态添加、修改和删除键值对基于哈希表实现,查找操作时间复杂度为O1字典是中最强大的数据类型之一,它提供了一种灵活的方式来存储和检索键值对字典基于哈希表实现,具有极高的查找效率,这使得字典Python在处理大量数据时表现出色在及以后的版本中,字典保持了元素的插入顺序这意味着当你迭代一个字典时,键值对的顺序与它们被添加到字典中的顺序相同这Python
3.7一特性使得字典更加易于使用和预测基础用法dict创建字典有多种方式可以创建字典,最常见的是使用花括号语法和键值对还可以使用dict构造函数,或者通过其他映射或键值对序列创建#使用花括号创建student={name:张三,age:20,score:85}#使用dict构造函数student=dictname=张三,age=20,score=85#通过键值对列表创建student=dict[name,张三,age,20,score,85]访问与修改可以使用方括号和键来访问、修改或添加字典中的值如果键不存在,访问会引发KeyError,可以使用get方法提供默认值避免异常#访问值name=student[name]#张三age=student.getage#20grade=student.getgrade,未知#提供默认值,键不存在返回未知#修改/添加值student[score]=90#修改已有键的值student[grade]=A#添加新键值对删除与查询可以使用del语句或pop方法删除键值对pop方法还会返回被删除的值可以使用in运算符检查键是否存在于字典中#删除键值对del student[age]#使用del语句score=student.popscore#使用pop方法,返回并删除值#检查键是否存在has_name=name instudent#Truehas_age=age instudent#False字典方法进阶操作dict字典推导式嵌套字典字典合并字典推导式提供了一种简洁的方式来创建字典,类似于字典的值可以是任何Python对象,包括其他字典这Python
3.5及以上版本可以使用update方法或列表推导式字典推导式的语法为{key_expr:使得可以创建嵌套的数据结构,非常适合表示层次化数{**d1,**d2}语法合并两个字典Python
3.9引入了更value_expr for item initerable ifcondition},其中if据,如JSON数据简洁的合并操作符|条件部分是可选的#嵌套字典#使用update方法#创建平方映射student={dict1={a:1,b:2}squares={x:x**2for xinrange1,6}name:张三,dict2={b:3,c:4}#结果:{1:1,2:4,3:9,4:16,5:25}courses:{merged=dict
1.copy#创建副本,避免修math:{score:90,credit:改原字典#使用条件过滤3},merged.updatedict2#合并,重复键会被覆even_squares={x:x**2forxinrange10python:{score:95,credit:盖if x%2==0}4},#结果:{a:1,b:3,c:4}#结果:{0:0,2:4,4:16,6:36,8:64}english:{score:85,credit:2}#使用解包语法Python
3.5+#从两个列表创建字典}merged={**dict1,**dict2}keys=[a,b,c]}#结果:{a:1,b:3,c:4}values=[1,2,3]mapping={k:v fork,v inzipkeys,#访问嵌套值#使用合并操作符Python
3.9+values}math_score=merged=dict1|dict2#结果:{a:1,b:2,c:3}student[courses][math][score]#90#结果:{a:1,b:3,c:4}python_credit=student[courses][python][credit]#4集合类型set唯一元素集合集合是一个无序的、不重复元素的集合当你向集合中添加重复元素时,会自动忽略重复项这使得集合成为去除序列中重复元素的理想工具创建语法集合可以使用花括号创建,元素之间用逗号分隔,如{1,2,3}也可以使用set函数从其他可迭代对象创建集合注意,空花括号{}创建的是空字典,而不是空集合;空集合应使用set快速成员检测与列表和元组不同,集合基于哈希表实现,这使得检查元素是否在集合中的操作非常快(时间复杂度为O1)这使得集合特别适合需要频繁检查成员资格的场景数学集合操作集合支持各种数学集合操作,如并集|、交集、差集-和对称差集^这些操作使得集合成为处理集合关系的强大工具常见操作set操作类型方法/运算符说明示例添加元素add添加单个元素s.add4添加多个元素update添加多个元素s.update[4,5,6]删除元素remove删除元素,不存在时抛出s.remove3KeyError安全删除discard删除元素,不存在时不抛s.discard3出异常弹出元素pop随机移除一个元素并返回x=s.pop并集|或union返回包含两个集合中所有s1|s2元素的新集合交集或intersection返回仅包含两个集合共有s1s2元素的新集合差集-或difference返回包含在第一个集合但s1-s2不在第二个集合中的元素的新集合对称差集^或返回包含仅在一个集合中s1^s2symmetric_difference出现的元素的新集合的应用举例set元素去重成员测试集合运算集合的最常见应用之一是从序列中去除重复元素只需将序列转换为集集合的另一个重要应用是高效的成员测试当需要频繁检查元素是否在集合的数学运算使其成为处理数据关系的理想工具可以使用集合运算合,然后再转回所需的类型,就可以轻松实现去重一个集合中时,使用集合比使用列表或元组更高效来查找共有元素、差异元素或合并集合#列表去重#在大型数据集中检查成员资格#查找两个列表的共同元素numbers=[1,2,2,3,3,3,4,4,4,4]valid_usernames={user1,user2,admin,guest}list1=[1,2,3,4,5]unique_numbers=listsetnumbers list2=[3,4,5,6,7]#结果:[1,2,3,4]#检查用户名是否有效common=setlist1setlist2def is_valid_usernameusername:#结果:{3,4,5}return usernamein valid_usernames#查找list1中有但list2中没有的元素printis_valid_usernameadmin#True only_in_list1=setlist1-setlist2printis_valid_usernamehacker#False#结果:{1,2}#查找出现在list1或list2中,但不同时出现的元素symmetric_diff=setlist1^setlist2#结果:{1,2,6,7}不可变集合frozensetfrozenset的特性应用场景frozenset是set的不可变版本,创建后不能添加或删除元素它支持与set相同的操作和方frozenset主要用于需要不可变集合的场景,特别是当需要将集合用作字典键或其他需要不可法,除了那些会修改集合的方法(如add、remove等)变对象的情况它也适用于那些需要确保数据不被修改的敏感操作与set类似,frozenset也是无序的,元素唯一的集合不同之处在于,由于frozenset不可#使用frozenset作为字典键变,它是可哈希的,因此可以用作字典的键或其他集合的元素,而普通的set不行person_hobbies={frozenset[阅读,写作,编程]:张三,#创建frozensetfrozenset[游泳,跑步]:李四,fs=frozenset[1,2,3,2,1]#重复元素会被自动去除frozenset[绘画,摄影]:王五printfs#frozenset{1,2,3}}#尝试修改会报错#查找具有特定兴趣组合的人#fs.add4#AttributeError:frozenset objecthas noattributeinterests=frozenset[阅读,写作,编程]addperson=person_hobbies.getinterestsprintperson#张三#集合运算fs1=frozenset[1,2,3]fs2=frozenset[3,4,5]printfs1fs2#交集:frozenset{3}printfs1|fs2#并集:frozenset{1,2,3,4,5}二进制类型总览类型类型bytes bytearray不可变的字节序列,用于存储二进可变的字节序列,功能与类bytes制数据每个元素是一个到之似,但可以修改元素这使得0255间的整数,表示一个字节常用于适合需要就地修改二进bytearray处理图像、音频文件或网络通信中制数据的情况,比如文件编辑或实的二进制数据时数据处理类型memoryview内存视图对象,提供对其他二进制对象的内存级访问,无需创建数据的副本这在处理大型二进制数据时非常有用,可以显著提高性能和减少内存使用的二进制类型专为处理二进制数据而设计,这包括文件内容、网络协议数据、图Python像和音频数据等这些类型在与底层系统交互、进行网络编程或处理多媒体数据时特别有用二进制类型与字符串的主要区别在于,字符串处理的是文本,而二进制类型处理Unicode的是原始字节在处理二进制数据时,通常需要在字符串和二进制类型之间进行编码和解码,常用的编码包括、等UTF-8ASCII类型bytes创建和初始化bytes的操作和方法bytes对象可以通过多种方式创建,包括字节字面量、从字符串编码、从整数序列或使用bytes支持许多与字符串类似的操作,如索引、切片、查找和替换等不同的是,索引bytes构造函数创建后,bytes对象的内容不能修改bytes返回的是整数(0-255),而不是单字符字符串#使用字节字面量(前缀b)#创建一个bytes对象b1=bhello#仅包含ASCII字符b=bPython#从字符串编码#索引和切片b2=你好.encodeutf-8#非ASCII字符需要指定编码printb
[0]#80字符P的ASCII值printb[1:3]#byt#从整数序列b3=bytes[65,66,67]#相当于bABC#解码为字符串s=b.decodeutf-8#Python#使用bytes构造函数b4=bytes5#创建5个值为0的字节:b\x00\x00\x00\x00\x00#常用方法printb.startswithbPy#Trueprintb.findbth#2printb.replacebth,bTH#bPyTHon#转换为整数列表list_of_bytes=listb#[80,121,116,104,111,110]类型bytearray创建bytearraybytearray对象可以通过多种方式创建,包括从bytes对象、整数序列或通过字符串编码与bytes不同,bytearray是可变的,可以修改其内容#从bytes创建ba1=bytearraybhello#从整数序列创建ba2=bytearray[65,66,67]#相当于bytearraybABC#从字符串编码创建ba3=bytearray你好.encodeutf-8#创建指定大小的bytearrayba4=bytearray5#创建5个值为0的字节修改元素bytearray的主要优势是可以修改其内容可以通过索引赋值、切片赋值或使用列表类似的方法(如append、extend、insert、remove等)来修改bytearray#创建一个bytearrayba=bytearraybPython#通过索引修改ba
[0]=74#修改第一个字节为J,现在ba是bytearraybJython#使用列表类似的方法ba.append33#添加感叹号!,现在ba是bytearraybJython!ba.extendb
3.0#添加字符串,现在ba是bytearraybJython!
3.0ba.insert0,80#在开头插入P,现在ba是bytearraybPJython!
3.0ba.remove74#删除J,现在ba是bytearraybPython!
3.0转换与兼容性bytearray可以很容易地与bytes、列表和字符串之间相互转换它支持几乎所有bytes支持的操作和方法,外加可变序列的方法#转换为bytes(不可变)b=bytesba#转换为列表l=listba#解码为字符串s=ba.decodeutf-8#与其他二进制类型的互操作ba5=bytearraybhelloba5+=b world#可以与bytes连接类型memoryview概念与作用高级用法memoryview提供了对二进制数据的内存级访问,无需创建数据的副本这在处理大型二进制对memoryview支持切片,可以创建原始数据的子视图,而不会复制数据它还提供了各种方法和象(如图像、视频或大文件)时非常有用,可以显著提高性能并减少内存使用属性来检查和操作底层数据memoryview接受任何实现了缓冲协议的对象,如bytes、bytearray和数组它创建了一个视#创建一个大的bytearray图,通过这个视图可以访问和操作原始数据,而不需要复制数据large_ba=bytearray10**7#约10MB#创建一个bytearray#使用memoryview进行切片ba=bytearraybPython memoryviewmv_slice=memoryviewlarge_ba[1000:2000]#创建memoryview#获取memoryview的属性mv=memoryviewbaprintmv.itemsize#每个元素的字节大小(通常为1)printmv.shape#数据的维度#通过memoryview访问和修改数据printmv.strides#跨越维度的字节数printmv
[0]#80字符P的ASCII值printmv.ndim#维度数量mv
[0]=74#修改第一个字节为Jprintmv.format#格式字符串#原始数据也被修改#转换回其他对象printba#bytearraybJython memoryviewbytes_obj=bytesmvlist_obj=listmv在处理大型数据集时,特别是需要多次访问或修改数据的不同部分时,memoryview可以显著提高性能它避免了不必要的数据复制,减少了内存使用,并提高了处理速度数据类型间的类型转换类型转换函数int,float,str,bool,list,tuple,set,dict自动类型转换混合类型运算时自动转换为兼容类型转换限制不是所有类型间都能直接转换异常处理4转换失败时抛出TypeError或ValueError自定义转换可通过特殊方法定义转换行为Python提供了多种内置函数,用于在不同数据类型之间进行转换这些转换函数通常以目标类型命名,如int、float、str等转换可能是隐式(自动)的,如在混合类型运算中;也可能是显式(手动)的,通过调用转换函数需要注意的是,并非所有类型转换都能成功例如,将包含非数字字符的字符串转换为整数会抛出ValueError在编写代码时,应当考虑到转换可能失败的情况,并适当处理可能的异常某些类型之间的转换可能需要特殊处理或多步转换隐式与显式类型转换隐式类型转换显式类型转换隐式类型转换(自动类型转换)是Python解释器自动执行的转换,通常发生在混合类型运算或比显式类型转换(强制类型转换)是通过调用转换函数明确指定的转换这种转换使代码意图更加明较操作中Python会尝试将操作数转换为兼容的类型,以便执行操作确,并允许在更广泛的情况下进行转换#整数和浮点数混合运算,整数会隐式转换为浮点数#字符串转整数result=5+
3.14#结果为浮点数:
8.14num_str=42num_int=intnum_str#42#布尔值在算术运算中会隐式转换为整数sum_with_bool=5+True#True转换为1,结果为:6#整数转浮点数num_float=float5#
5.0#字符串拼接会隐式将非字符串转换为字符串message=Total:+str42#必须显式转换,Python不会隐式转换此种情况#数值转字符串str_value=str
3.14#
3.14#其他类型转布尔值Python中的隐式类型转换相对保守,与一些其他语言相比更加谨慎例如,Python不会自动将字bool_value=bool0#False,0是假值符串转换为数字,或者将不同的集合类型相互转换这种设计减少了意外错误的可能性bool_empty=bool#False,空字符串是假值bool_nonempty=boolhello#True,非空字符串是真值#集合类型间的转换list_from_tuple=list1,2,3#[1,2,3]set_from_list=set[1,2,2,3]#{1,2,3},自动去重tuple_from_list=tuple[1,2,3]#1,2,3类型转换实践示例数值类型转换数值类型间的转换是最常见的转换类型之一整数可以转换为浮点数,浮点数可以截断为整数(丢弃小数部分)复数可以提取其实部或虚部这些转换在数学计算和数据处理中经常使用#整数转浮点数float_num=float42#
42.0#浮点数转整数(截断,不是舍入)int_num=int
3.99#3#舍入浮点数rounded=round
3.5#4#获取复数的实部和虚部complex_num=3+4jreal_part=complex_num.real#
3.0imag_part=complex_num.imag#
4.0字符串与数值转换在处理用户输入、文件内容或其他外部数据时,字符串与数值之间的转换非常常见Python提供了简单直观的方式来进行这些转换,但需注意处理可能的格式错误#字符串转整数str_to_int=int42#42hex_to_int=int2A,16#42(十六进制)#字符串转浮点数str_to_float=float
3.14#
3.14sci_to_float=float
1.5e3#
1500.0#数值转字符串int_to_str=str42#42float_to_str=str
3.14#
3.14#格式化的数值转字符串formatted=f{
3.1415:.2f}#
3.14集合类型转换类型判断与isinstancetype与isinstance比较继承和多类型检查Python提供了两种主要方式来判断对象的类型type函数和isinstance函数type返回对象的确切类型,isinstance的一个重要优势是它可以处理继承关系例如,如果类B继承自类A,那么isinstanceobj,A对于类而isinstance检查对象是否是特定类型或其子类型的实例B的实例也会返回True此外,isinstance还支持检查对象是否是多个类型中的任何一个在大多数情况下,推荐使用isinstance而不是type进行类型检查,因为isinstance支持继承关系这使得代#继承关系码更灵活,能够处理子类对象,同时保持多态性class Animal:pass#创建不同类型的对象num=42class DogAnimal:text=hellopassitems=[1,2,3]dog=Dog#使用type检查类型printisinstancedog,Dog#Trueprinttypenum isint#Trueprintisinstancedog,Animal#True,因为Dog继承自Animalprinttypetext isstr#Trueprinttypedog isAnimal#False,因为type不考虑继承关系printtypeitems islist#True#检查多个类型#使用isinstance检查类型printisinstance42,int,float#True,42是intprintisinstancenum,int#Trueprintisinstance
3.14,int,float#True,
3.14是floatprintisinstancetext,str#Trueprintisinstancetext,int,float#False,字符串既不是int也不是floatprintisinstanceitems,list#True#内置类型之间的关系printisinstanceTrue,int#True,在Python中bool是int的子类printisinstance5,bool#False,int不是bool的子类在开发通用函数或需要灵活处理不同类型输入的代码时,isinstance的这些特性非常有用它允许编写更加灵活和可扩展的代码,同时保持类型安全不同数据类型操作符差异操作符字符串str列表list元组tuple字典dict集合set+连接字符串连接列表连接元组不支持不支持*重复字符串重复列表重复元组不支持不支持[]索引/切片索引/切片索引/切片键访问不支持in子串检查元素检查元素检查键检查元素检查|不支持不支持不支持合并字典并集
3.9+不支持不支持不支持不支持交集-不支持不支持不支持不支持差集不同的数据类型支持不同的操作符和方法,这反映了它们的设计目的和用途例如,字符串、列表和元组作为序列类型,支持索引、切片和连接操作;而集合类型则支持集合运算,如并集、交集和差集了解每种数据类型支持的操作符和方法有助于选择最适合特定任务的数据类型,也有助于编写更加高效和直观的代码当尝试对数据类型使用不支持的操作时,Python会引发TypeError异常容器类型的嵌套嵌套列表列表可以包含其他列表作为元素,形成多维结构嵌套列表常用于表示矩阵、表格数据或树形结构访问嵌套列表的元素需要多级索引#创建一个3x3矩阵matrix=[[1,2,3],[4,5,6],[7,8,9]]#访问元素element=matrix
[1]
[2]#获取第2行第3列的元素:6#修改元素matrix
[0]
[1]=20#将第1行第2列的元素修改为20#遍历矩阵for rowin matrix:for elementin row:printelement,end=print#换行复杂的嵌套结构Python允许任意深度和组合的嵌套例如,字典的值可以是列表,列表的元素可以是字典,依此类推这种灵活性使得Python能够表示复杂的数据结构#包含多种嵌套的复杂数据结构users={user1:{name:张三,skills:[Python,JavaScript],contact:{email:zhangsan@example.com,phone:123-456-7890}},user2:{name:李四,skills:[Java,C++,SQL],contact:{email:lisi@example.com,phone:987-654-3210}}}#访问嵌套数据user1_name=users[user1][name]#张三user2_skills=users[user2][skills]#[Java,C++,SQL]user1_email=users[user1][contact][email]#zhangsan@example.com#修改嵌套数据users[user1][skills].appendHTML#添加新技能users[user2][contact][phone]=555-555-5555#更新电话数据类型的内存与性能内置数据结构模块举例Python模块模块模块array collections.deque heapq enum模块提供了一个类似是一个双端队列实模块提供了堆队列算模块提供了枚举类型array dequeheapqenum于列表的类,但所有现,支持从两端高效添加和法的实现堆是一种特殊的的支持,允许为一组相关的array元素必须是同一类型由于删除元素与列表相比,树形数据结构,父节点的值常量值创建符号名称枚举存储的元素类型一致,在队列两端的操作复总是小于或等于子节点的成员具有标识、名称和值属deque比列表更节省内存,杂度为,而列表在开头值使用列表来表示性,可以进行比较和迭代array O1heapq特别适用于数值计算插入或删除的复杂度为堆,并提供了、等枚举类型增强了代码的可读push pop支持与列表类似的操它特别适用于需要快操作函数堆队列最常用于性和类型安全性,特别适合array On作,但限制了元素类型速从两端操作的场景,如队优先级队列实现表示有限的选项集列处理日期类型datetime主要类型常见操作datetime模块提供了多种处理日期和时间的类,包括#导入模块•datetime.date表示日历日期(年、月、日)from datetimeimport datetime,date,time,timedelta•datetime.time表示一天中的时间(时、分、秒、微秒)#获取当前日期和时间•datetime.datetime组合了日期和时间now=datetime.now•datetime.timedelta表示时间间隔printnow#如2023-07-1514:30:
45.123456•datetime.tzinfo时区相关基类#创建特定日期和时间这些类提供了丰富的方法和属性,用于创建、格式化、比较和操作日期时间值它们是处理日期时间数据的标准方式,specific_date=date2023,7,15广泛用于日志记录、调度、数据分析等场景specific_time=time14,30,45specific_datetime=datetime2023,7,15,14,30,45#格式化日期和时间formatted=now.strftime%Y年%m月%d日%H:%M:%Sprintformatted#如2023年07月15日14:30:45#解析日期字符串parsed=datetime.strptime2023-07-1514:30:45,%Y-%m-%d%H:%M:%S#日期计算tomorrow=specific_date+timedeltadays=1one_hour_later=now+timedeltahours=1#提取日期组件year=now.yearmonth=now.monthday=now.dayhour=now.hour常见数据类型的错误和异常索引和键错误•IndexError当尝试访问超出范围的序列索引时抛出•KeyError当尝试访问字典中不存在的键时抛出•示例my_list
[100](列表只有10个元素)或my_dict[nonexistent]类型错误•TypeError当对对象执行不支持的操作时抛出•示例text+5(字符串和整数不能直接相加)•示例len5(整数没有长度)值错误•ValueError当操作或函数接收到类型正确但值不合适的参数时抛出•示例inta(a不能转换为整数)•示例[1,2,3].remove4(列表中不存在元素4)属性和名称错误•AttributeError当访问对象不存在的属性时抛出•NameError当使用未定义的变量名时抛出•示例hello.uppercase(应该是upper)数据类型实践学生成绩表1需求分析代码实现我们需要设计一个数据结构来存储多个学生的课程成绩信息每个学生有姓名、学号等基本信息,以及多门课程的成绩我们需要能够方便地#创建学生成绩表查询、添加和更新学生的成绩信息students=[考虑到这些需求,我们可以使用列表嵌套字典的结构外层列表包含多个学生信息,每个学生信息是一个字典,包含基本信息和课程成绩子字{典这种结构既能保持学生信息的完整性,又能方便地进行查询和更新操作id:001,name:张三,age:20,courses:{Python:95,数据结构:88,数据库:90}},{id:002,name:李四,age:21,courses:{Python:85,数据结构:92,数据库:78}}]#查询学生成绩def get_scorestudent_id,course_name:for studentin students:if student[id]==student_id:return student[courses].getcourse_name,未选修该课程return学生不存在#添加新学生def add_studentid,name,age,courses=None:if coursesis None:courses={}#检查学生ID是否已存在for studentin students:if student[id]==id:return False#学生已存在students.append{id:id,name:name,age:age,courses:courses}return True#更新学生成绩def update_scorestudent_id,course_name,score:for studentin students:if student[id]==student_id:student[courses][course_name]=scorereturn Truereturn False#使用示例printget_score001,Python#95add_student003,王五,19,{Python:88}update_score002,Python,90数据类型实践标签去重2问题描述在一个内容平台上,用户可以为文章添加标签我们需要实现一个功能,对用户输入的标签进行处理去除重复标签,同时保持标签的顺序,并且确保处理后的标签列表不可被意外修改这个问题涉及到多种数据类型的应用列表用于初始存储标签,集合用于高效去重,元组用于创建不可变的最终结果实现方案我们将使用以下步骤处理标签
1.使用列表初始存储用户输入的所有标签
2.使用集合的特性高效去除重复标签
3.保持原始标签的顺序
4.将最终结果转换为元组,确保不可变性由于集合是无序的,我们不能直接将列表转换为集合再转回,因为这样会丢失原始顺序我们需要一种特殊的方法来保持顺序代码实现def process_tagstags:处理用户标签去重并保持顺序,返回不可变元组参数:tags:列表,包含用户输入的标签返回:元组,包含去重后的标签,保持原始顺序#使用字典的键来去重并保持顺序#在Python
3.7+中,字典保持插入顺序unique_tags=dict.fromkeystags#转换为元组,确保不可变return tupleunique_tags.keys#测试user_tags=[Python,Web,Python,Data,Web,AI]processed_tags=process_tagsuser_tagsprintprocessed_tags#Python,Web,Data,AI#验证不可变性try:processed_tags
[0]=Java#尝试修改元组except TypeErroras e:printf不能修改元组:{e}#另一种实现方式使用有序集合OrderedDictfrom collectionsimport OrderedDictdef process_tags_orderedtags:#使用OrderedDict保持顺序(Python
3.7以前的版本)unique_tags=OrderedDict.fromkeystagsreturn tupleunique_tags.keys数据类型实践文件二进制读写3问题背景代码实现在许多实际应用中,我们需要处理二进制文件,如图像、音频或视频文件Python的二进制数据类型(bytes和bytearray)提供了高效处理defprocess_image_binary:这类数据的能力以下我们将展示如何使用这些类型读取、处理和写入二进制图像文件在这个实例中,我们将读取图像文件,处理二进制数据,并保存为新文件
1.读取一个图像文件到bytes对象try:
2.将bytes转换为bytearray以进行修改#读取二进制图像文件
3.对图像数据进行简单处理with openinput.jpg,rb asf:image_data=f.read#读取为bytes对象
4.将处理后的bytearray保存为新文件这个例子展示了bytes和bytearray在实际应用中的互操作性,以及如何利用它们的特性处理二进制数据printf原始图像大小:{lenimage_data}字节#转换为bytearray以便修改mutable_data=bytearrayimage_data#简单处理修改部分字节#注意这仅用于演示,实际图像处理更复杂#这里我们只修改文件头之后的一些字节header_size=100#假设的头部大小,实际值取决于图像格式foriin rangeheader_size,minheader_size+1000,lenmutable_data:#对每个字节进行简单变换mutable_data[i]=mutable_data[i]+10%256#将修改后的bytearray转回bytesprocessed_data=bytesmutable_data#保存处理后的图像with openoutput.jpg,wb asf:f.writeprocessed_dataprintf处理后图像已保存,大小:{lenprocessed_data}字节return TrueexceptFileNotFoundError:print找不到输入文件return FalseexceptException ase:printf处理图像时出错:{e}returnFalse#调用函数process_image_binary数据类型与语法联系Python控制流与数据类型Python的控制流结构(如if、for、while等)与数据类型紧密相连例如,for循环可以遍历任何可迭代类型,if语句可以根据任何对象的真值进行条件判断不同类型的真值测试行为不同,影响控制流执行路径函数参数与返回值Python函数的参数和返回值可以是任何类型,包括复杂的嵌套结构函数可以返回多个值(作为元组)默认参数的可变性(如列表作为默认参数)需要类型提示特别注意,因为它们在函数定义时就被创建Python
3.5引入了类型提示,允许开发者指定变量、参数和返回值的预期类型虽然Python仍然是动态类型语言,但类型提示提高了代码可读性,并支4推导式与生成器持静态类型检查工具如mypy进行类型验证Python提供了列表、字典和集合推导式,以简洁的方式创建这些数据结构生成器表达式和生成器函数则允许惰性计算,适用于处理大量数据时节省内存这些特性使数据处理更加高效和优雅本节小结与常见面试题浅拷贝vs深拷贝list与tuple区别浅拷贝(如list.copy、dict.copy或主要区别是可变性列表可修改,元组不copy.copy)创建新对象,但内部元素可修改这导致了其他差异元组可以作仍是原对象的引用深拷贝为字典键和集合元素;元组通常内存占用(copy.deepcopy)创建新对象,并递更少,创建和访问速度更快;元组暗示数归地复制所有内部元素这在处理嵌套结据结构不应更改构时很重要类型转换失败情景常见失败情况将非数字字符串转换为数字(intabc);将复杂结构如字典直接转换为不兼容类型;在数学运算中混用不兼容类型;尝试修改不可变对象本节课我们全面介绍了Python的数据类型系统,包括基本类型(数字、字符串、布尔)、集合类型(列表、元组、字典、集合)和特殊类型(二进制类型、日期时间)我们探讨了各类型的特性、用法和性能特点,以及它们之间的关系和转换掌握这些知识对于编写高效、正确的Python代码至关重要数据类型的选择直接影响程序的内存使用、执行效率和代码简洁性希望本课程能帮助你深入理解Python的数据类型,为更高级的Python编程打下坚实基础互动与答疑现在是互动与答疑环节,请大家提出关于数据类型的任何问题无论是关于今天所学内容的疑惑,还是实际编程中遇到的数据类型相关Python问题,都可以在此讨论为了巩固所学知识,建议大家课后完成以下实践尝试使用不同的数据类型解决同一个问题,比较它们的性能和代码可读性;实现一个小项目,综合应用多种数据类型;查阅官方文档,探索本课未详细介绍的数据类型特性和方法Python记住,编程能力的提升主要来自实践通过不断尝试和应用这些数据类型,你将逐渐掌握在不同场景下选择最合适数据类型的能力,这是成为高手的重要一步Python。
个人认证
优秀文档
获得点赞 0