Python程序设计任务式教程(微课版)(AI助学)-习题答案 郑卉 单元2-6_第1页
Python程序设计任务式教程(微课版)(AI助学)-习题答案 郑卉 单元2-6_第2页
Python程序设计任务式教程(微课版)(AI助学)-习题答案 郑卉 单元2-6_第3页
Python程序设计任务式教程(微课版)(AI助学)-习题答案 郑卉 单元2-6_第4页
Python程序设计任务式教程(微课版)(AI助学)-习题答案 郑卉 单元2-6_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python程序设计任务式教程(微课版)(AIGC助学)习题答案单元2【基础练习】选择题1.B2.A3.D4.C5.B6.A7.D8.D9.D10.C11.D12.D13.C14.B15.C16.A17.B【进阶挑战】1.已知x=10,y=12,写出将x和y的值互相交换的表达式。Python特有链式解包赋值:x=10y=12#交换表达式x,y=y,xprint("交换后:x=",x,"y=",y)2.若a=3,b=4,c=5,x=1.2,y=2.4,z=−3.6,u=51274,n=128765,c1='a',c2='b'。想得到以下的输出格式和结果,请写出程序。a=

3

b=

4

c=

5x=1.200000,y=2.400000,z=−3.600000x+y=

3.60

y+z=−1.20

z+x=−2.40u=

51274

n=

128765c1='a'

or

97(ASCII)c2='b'

or

98(ASCII)#初始化所有变量a=3b=4c=5x=1.2y=2.4z=-3.6u=51274n=128765c1='a'c2='b'#按格式输出#第1行:a=3b=4c=5print(f"a={a}b={b}c={c}")#第2行:x=1.200000,y=2.400000,z=−3.600000(保留6位小数)print(f"x={x:.6f},y={y:.6f},z={z:.6f}")#第3行:x+y=3.60y+z=−1.20z+x=−2.40(保留2位小数,先计算再格式化)print(f"x+y={x+y:.2f}y+z={y+z:.2f}z+x={z+x:.2f}")#第4行:u=51274n=128765print(f"u={u}n={n}")#第5行:c1='a'or97(ASCII)(ord()函数获取字符的ASCII码)print(f"c1='{c1}'or{ord(c1)}(ASCII)")#第6行:c2='b'or98(ASCII)print(f"c2='{c2}'or{ord(c2)}(ASCII)")3.设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、球的表面积、球的体积、圆柱体积。用input()输入数据,输出计算结果;输出时要求有文字说明,结果取小数点后两位数字,请编写程序。#导入math模块,获取精确的圆周率piimportmath#1.输入数据(input()返回字符串,需转为浮点型float)r=float(input("请输入圆的半径r:"))h=float(input("请输入圆柱的高h:"))#2.计算各几何量circle_circumference=2*math.pi*r#圆周长:2πrcircle_area=math.pi*r**2#圆面积:πr²sphere_surface=4*math.pi*r**2#球表面积:4πr²sphere_volume=(4/3)*math.pi*r**3#球体积:4/3πr³cylinder_volume=math.pi*r**2*h#圆柱体积:πr²h#3.格式化输出结果,保留2位小数print(f"圆的周长为:{circle_circumference:.2f}")print(f"圆的面积为:{circle_area:.2f}")print(f"球的表面积为:{sphere_surface:.2f}")print(f"球的体积为:{sphere_volume:.2f}")print(f"圆柱的体积为:{cylinder_volume:.2f}")4.运用Python编写程序,要求从键盘输入n的值,求阶乘和1!+2!+3!+…+n!。#1.输入n,并转为整数类型n=int(input("请输入一个正整数n:"))#2.初始化变量:阶乘和sum_fact(初始0),当前阶乘current_fact(初始1,因为1!=1)sum_fact=0current_fact=1#3.循环计算1!到n!,并累加forkinrange(1,n+1):current_fact*=k#计算当前k的阶乘(利用前一次结果,优化计算,避免重复循环)sum_fact+=current_fact#累加到阶乘和中#4.输出结果print(f"1!+2!+...+{n}!的结果为:{sum_fact}")5.运用Python编写程序,要求从键盘输入n的值,输出形如以下的结果。n=int(input("请输入n的值:"))foriinrange(1,n+1):

print(str(i)*i)6.运用Python循环结构,输出10~100的全部素数。所谓素数n是指,除1和n之外,不能被2~(n−1)之间的任何整数整除的数。提示:可以先筛去所有2的倍数、3的倍数、5的倍数……依次类推。importmath#定义一个函数,判断一个数是否为素数defis_prime(num):#1.排除小于2的数(素数定义要求大于1)ifnum<2:returnFalse#2.优化:判断到num即可,无需到num-1max_divisor=int(math.sqrt(num))+1#+1确保覆盖边界值foriinrange(2,max_divisor):ifnum%i==0:#能被整除,说明不是素数returnFalse#3.循环结束未找到因数,说明是素数returnTrue#1.遍历10~100的所有数,筛选素数prime_list=[]fornuminrange(10,101):ifis_prime(num):prime_list.append(num)#2.输出结果print("10~100之间的所有素数为:")print(prime_list)

单元3【基础练习】一、选择题1.B2.C3.A4.C5.B6.A7.D8.B9.B10.(1)B(2)C(3)D(4)B11.(1)B(2)C(3)A二、填空题1.[1,2,3,1,2,3,1,2,3]2.[6,7,9,11]3.[1,4,7]4.[0,1,2,3,4]5.'3'6.'11'7.'11'8.len()三、判断题(正确的画“√”,错误的画“×”)1.√2.√3.√4.×5.√6.×7.√8.√9.√10.×11.×12.×13.√14.√15.√16.√【进阶挑战】1.针对列表,完成以下操作:(1)创建一个包含10个整数的列表;(2)反转这个列表;(3)找出列表中的最大值和最小值;(4)将列表中的所有元素乘以2。#(1)创建一个包含10个整数的列表(这里以0~9为例,也可以自定义其他整数)num_list=[0,1,2,3,4,5,6,7,8,9]print("(1)原始列表:",num_list)#(2)反转这个列表(3种常用方式,任选其一即可)#方式1:使用列表reverse()方法(修改原列表)num_list.reverse()#方式2:使用切片[::-1](生成新列表,原列表不变)#reversed_list=num_list[::-1]#方式3:使用reversed()函数(生成迭代器,需转为列表)#reversed_list=list(reversed(num_list))print("(2)反转后的列表:",num_list)#(3)找出列表中的最大值和最小值list_max=max(num_list)list_min=min(num_list)print("(3)列表最大值:",list_max,",最小值:",list_min)#(4)将列表中的所有元素乘以2(2种方式)#方式1:列表推导式(推荐,简洁高效)num_list=[x*2forxinnum_list]#方式2:循环遍历修改#foriinrange(len(num_list)):#num_list[i]*=2print("(4)元素乘以2后的列表:",num_list)2.针对元组,完成以下操作:(1)将一个包含10个整数的列表转换成元组;(2)访问元组中的第5个元素;(3)检查元组中是否包含某个特定的值。#先准备一个包含10个整数的列表num_list=[0,1,2,3,4,5,6,7,8,9]#(1)将列表转换成元组num_tuple=tuple(num_list)print("(1)转换后的元组:",num_tuple)#(2)访问元组中的第5个元素(注意:索引从0开始,第5个元素对应索引4)fifth_elem=num_tuple[4]print("(2)元组第5个元素:",fifth_elem)#(3)检查元组中是否包含某个特定的值(以值5为例,可自定义)target=5iftargetinnum_tuple:print(f"(3)元组中包含值{target}")else:print(f"(3)元组中不包含值{target}")3.针对字典,完成以下操作:(1)创建一个字典,存储学生的名字和成绩;(2)遍历这个字典,输出每个学生的名字和成绩;(3)更新字典,给每个学生的成绩增加5分;(4)删除字典中成绩最低的学生记录。#(1)创建一个字典,存储学生的名字和成绩student_scores={"张三":85,"李四":92,"王五":78,"赵六":95,"钱七":88}print("(1)原始学生成绩字典:",student_scores)#(2)遍历这个字典,输出每个学生的名字和成绩(3种遍历方式,任选其一)print("(2)学生成绩明细:")#方式1:遍历键值对(推荐,最直观)forname,scoreinstudent_scores.items():print(f"{name}:{score}分")#方式2:先遍历键,再通过键取值#fornameinstudent_scores.keys():#print(f"{name}:{student_scores[name]}分")#(3)更新字典,给每个学生的成绩增加5分fornameinstudent_scores:student_scores[name]+=5print("(3)成绩加5分后:",student_scores)#(4)删除字典中成绩最低的学生记录#步骤1:找出最低成绩min_score=min(student_scores.values())#步骤2:找出最低成绩对应的学生姓名(可能有多个,这里删除第一个)min_name=Noneforname,scoreinstudent_scores.items():ifscore==min_score:min_name=namebreak#步骤3:删除该学生记录ifmin_name:delstudent_scores[min_name]print("(4)删除最低分学生后的字典:",student_scores)4.针对集合,完成以下操作:(1)创建一个包含重复元素的集合;(2)使用集合来找出两个列表的交集;(3)使用集合来找出两个列表的差集;(4)检查某个元素是否在集合中。#(1)创建一个包含重复元素的集合(集合自动去重,直接传入含重复元素的可迭代对象即可)repeat_elem=[1,2,2,3,3,3,4,5,5]num_set=set(repeat_elem)print("(1)去重后的集合:",num_set)#准备两个列表,用于后续求交集、差集list1=[1,2,3,4,5]list2=[4,5,6,7,8]#先转为集合set1=set(list1)set2=set(list2)print("辅助列表1转集合:",set1)print("辅助列表2转集合:",set2)#(2)找出两个列表的交集(同时存在于两个集合中的元素)intersection_set=set1&set2#方式1:运算符&(直观)#intersection_set=ersection(set2)#方式2:方法调用(功能一致)print("(2)两个列表的交集:",intersection_set)#(3)找出两个列表的差集(set1有,set2没有;set2有,set1没有,分两种情况)diff1_2=set1-set2#set1-set2:set1有,set2没有diff2_1=set2-set1#set2-set1:set2有,set1没有#diff1_2=set1.difference(set2)#对应方法调用print(f"(3)差集(list1有,list2没有):{diff1_2}")print(f"差集(list2有,list1没有):{diff2_1}")#(4)检查某个元素是否在集合中(以元素4为例)target=4iftargetinnum_set:print(f"(4)集合中包含元素{target}")else:print(f"(4)集合中不包含元素{target}")5.使用列表推导式生成一个包含1~10的平方值的列表。

#列表推导式生成1~10的平方值列表square_list=[x**2forxinrange(1,11)]print("1~10的平方值列表:",square_list)6.求列表s=[2,8,9,6,7,1,5,66]中的元素个数、最大数、最小数、平均数。在末尾添加一个新元素10,删除元素5。#初始化列表s=[2,8,9,6,7,1,5,66]#1.统计元素个数elem_count=len(s)#2.统计最大数、最小数s_max=max(s)s_min=min(s)#3.统计平均数(总和/元素个数)s_avg=sum(s)/elem_count#输出统计结果print("原始列表:",s)print(f"元素个数:{elem_count}")print(f"最大数:{s_max}")print(f"最小数:{s_min}")print(f"平均数:{s_avg:.2f}(保留2位小数)")#4.在末尾添加一个新元素10s.append(10)print("末尾添加10后:",s)#5.删除元素5s.remove(5)#remove()删除第一个出现的指定值print("删除元素5后:",s)7.使用字典推导式创建一个字典,键是字符串,值是字符串的长度。#先准备一个包含若干字符串的列表(作为字典的键)str_list=["Python","Java","C++","JavaScript","Go"]#字典推导式创建字典(键:字符串,值:字符串长度len(字符串))str_len_dict={s:len(s)forsinstr_list}print("字符串-长度字典:",str_len_dict)8.使用集合推导式生成一个由列表中所有唯一元素组成的集合。#准备一个包含重复元素的列表repeat_list=[1,2,2,3,3,3,4,4,5,5,5]#集合推导式生成唯一元素集合(两种方式,效果一致)#方式1:直接推导(自动去重)unique_set={xforxinrepeat_list}#方式2:加条件判断(确保不重复,效果同上,更灵活)#unique_set={xforxinrepeat_listifrepeat_list.count(x)>=1}print("原始列表(含重复):",repeat_list)print("唯一元素集合:",unique_set)

单元4【基础练习】一、选择题1.C2.B3.C4.C5.A6.D7.D8.B9.C二、填空题def逗号(,)returnNone嵌套列表(list);迭代器(iterator,可迭代对象/匹配对象迭代器)三、判断题(正确的画“√”,错误的画“×”)1.×2.√3.√4.√5.×6.√7.×8.√9.√10.√11.×12.√13.√14.√15.√16.×17.×18.√19.√20.×21.×【进阶挑战】1.按要求编写函数。(1)编写一个函数,接收两个数字作为参数,并返回它们的和。(2)修改上一个函数,使其可以接收一个可选的第三个参数,表示是否返回和的平方值。#(1)编写函数,接收两个数字参数,返回它们的和defadd_two_nums(num1,num2):#确保传入的参数是数字类型(提升函数健壮性)ifnot(isinstance(num1,(int,float))andisinstance(num2,(int,float))):raiseTypeError("传入的参数必须是整数或浮点数")returnnum1+num2#(2)修改函数,增加可选第三个参数,控制是否返回和的平方defadd_two_nums_with_square(num1,num2,is_square=False):#先调用第一步的求和逻辑(代码复用),也可直接计算sum_result=add_two_nums(num1,num2)#根据可选参数判断返回结果ifis_square:returnsum_result**2else:returnsum_resultprint("=====测试函数(1)=====")print(f"3+5={add_two_nums(3,5)}")print(f"2.5+4.7={add_two_nums(2.5,4.7)}")print("\n=====测试函数(2)=====")#不传入第三个参数(使用默认值False,返回和)print(f"3+5(默认不平方)={add_two_nums_with_square(3,5)}")#传入第三个参数为True(返回和的平方)print(f"3+5(平方)={add_two_nums_with_square(3,5,is_square=True)}")#传入第三个参数为True(浮点数测试)print(f"2.5+4.7(平方)={add_two_nums_with_square(2.5,4.7,is_square=True)}")2.编写一个函数,接收一个数字列表,返回列表中的最大值和最小值。defget_max_and_min(num_list):#步骤1:健壮性判断1-检查是否为列表ifnotisinstance(num_list,list):raiseTypeError("传入的参数必须是列表类型")#步骤2:健壮性判断2-检查列表是否为空iflen(num_list)==0:raiseValueError("传入的列表不能为空,无法获取最大/最小值")#步骤3:健壮性判断3-检查列表中的元素是否均为数字(int/float)fornuminnum_list:ifnotisinstance(num,(int,float)):raiseTypeError("列表中的所有元素必须是整数或浮点数")#步骤4:计算并返回最大值和最小值(使用Python内置函数,高效简洁)max_num=max(num_list)min_num=min(num_list)return(max_num,min_num)#测试正常数字列表test_list1=[1,3,5,7,9,2,4]result1=get_max_and_min(test_list1)print(f"列表{test_list1}的最大值:{result1[0]},最小值:{result1[1]}")#测试包含浮点数的列表test_list2=[2.5,6.8,1.3,9.1,4.0]result2=get_max_and_min(test_list2)print(f"列表{test_list2}的最大值:{result2[0]},最小值:{result2[1]}")3.编写一个函数,接收另一个函数作为参数,并对这个函数进行调用。#第一步:定义一个普通函数(作为后续传入的参数)defsay_hello():print("Hello!这是被传入的函数~")#第二步:定义高阶函数(接收另一个函数作为参数)defcall_other_func(func):#健壮性判断:检查传入的参数是否是可调用的函数ifcallable(func):print("开始调用传入的函数...")func()#调用传入的函数print("传入的函数调用完成!")else:raiseTypeError("传入的参数必须是可调用的函数")#调用高阶函数,传入say_hello函数(注意:不加括号,传入的是函数对象,不是函数执行结果)call_other_func(say_hello)4.使用lambda函数来找出一个数字列表中的第一个偶数。deffind_first_even(num_list):#步骤1:健壮性判断ifnotisinstance(num_list,list):raiseTypeError("传入的参数必须是列表类型")iflen(num_list)==0:print("传入的列表为空,无元素可筛选")returnNonefornuminnum_list:ifnotisinstance(num,int):#偶数仅针对整数,浮点数(如2.0本质是整数,但2.5不是)需特殊处理,这里简化为仅支持整数raiseTypeError("列表中的元素必须是整数,才能判断奇偶性")#步骤2:使用lambda+filter筛选偶数#lambdax:x%2==0:判断x是否为偶数(核心筛选逻辑)#filter(筛选函数,可迭代对象):筛选出列表中符合条件的元素,返回一个迭代器even_iterator=filter(lambdax:x%2==0,num_list)#步骤3:使用next()获取迭代器的第一个元素(即第一个偶数)#next()第二个参数为默认值,当迭代器无元素(无偶数)时,返回None,避免报错first_even=next(even_iterator,None)returnfirst_even#测试用例1:包含偶数的列表test_list1=[1,3,5,4,7,8]result1=find_first_even(test_list1)print(f"列表{test_list1}的第一个偶数:{result1}")#测试用例2:无偶数的列表test_list2=[1,3,5,7,9]result2=find_first_even(test_list2)print(f"列表{test_list2}的第一个偶数:{result2}")#测试用例3:偶数在列表首位test_list3=[2,4,6,8]result3=find_first_even(test_list3)print(f"列表{test_list3}的第一个偶数:{result3}")5.创建一个名为math_operations的模块,包含加、减、乘、除4个函数,并在主程序中导入并使用这些函数。#math_operations.py-自定义数学运算模块defadd(a,b):ifnot(isinstance(a,(int,float))andisinstance(b,(int,float))):raiseTypeError("运算参数必须是整数或浮点数")returna+bdefsubtract(a,b):ifnot(isinstance(a,(int,float))andisinstance(b,(int,float))):raiseTypeError("运算参数必须是整数或浮点数")returna-bdefmultiply(a,b):ifnot(isinstance(a,(int,float))andisinstance(b,(int,float))):raiseTypeError("运算参数必须是整数或浮点数")returna*bdefdivide(a,b):ifnot(isinstance(a,(int,float))andisinstance(b,(int,float))):raiseTypeError("运算参数必须是整数或浮点数")ifb==0:raiseZeroDivisionError("除数不能为0,无法进行除法运算")returna/b#main.py-主程序,导入并使用math_operations模块#方式1:直接导入整个模块(推荐,模块名作为命名空间,避免命名冲突)importmath_operations#方式2:从模块中导入指定函数(使用时可省略模块名)#frommath_operationsimportadd,subtract,multiply,divide#方式3:导入模块的所有函数(不推荐,易引发命名冲突)#frommath_operationsimport*#定义测试数据num1=20num2=5num3=3.5num4=1.5print("=====自定义math_operations模块测试=====")#调用格式:模块名.函数名()print(f"{num1}+{num2}={math_operations.add(num1,num2)}")print(f"{num1}-{num2}={math_operations.subtract(num1,num2)}")print(f"{num1}×{num2}={math_operations.multiply(num1,num2)}")print(f"{num1}÷{num2}={math_operations.divide(num1,num2)}")#测试浮点数运算print(f"\n{num3}+{num4}={math_operations.add(num3,num4)}")print(f"{num3}÷{num4}={math_operations.divide(num3,num4)}")6.编写一个生成器函数,生成从1到用户指定数字的所有整数。defnum_generator(max_num):#健壮性判断:确保传入的参数是合法的正整数ifnotisinstance(max_num,int):raiseTypeError("指定的数字必须是整数类型")ifmax_num<1:raiseValueError("指定的数字必须大于或等于1")#生成器核心逻辑:使用yield逐个产生数据current=1whilecurrent<=max_num:yieldcurrent#暂停函数执行,返回当前current值,下次迭代从该位置继续current+=1#更新当前值,为下一次yield做准备#测试用例1:指定最大数字为10print("=====生成1到10的整数=====")#生成器对象是可迭代对象,可通过for循环遍历fornuminnum_generator(10):print(num,end="")print("\n")#测试用例2:获取生成器对象,手动迭代(理解生成器的惰性加载)print("=====手动迭代生成器(1到5)=====")gen=num_generator(5)#使用next()逐个获取生成器产生的值print("第一个值:",next(gen))print("第二个值:",next(gen))print("后续所有值:",list(gen))#剩余值转换为列表(一次性获取剩余所有数据)7.定义一个函数printInfo(name,age,**args):其中args为可变关键字参数,传入当前用户输入的课程名和分数。由于每个用户输入的课程名和分数不同,所以需要用可变关键字参数实现。在调用函数部分,要求输入姓名、年龄以及通过循环输入课程名和分数,并调用printInfo()实现输入信息的显示。提示:将课程名和分数保存在字典中,作为参数传递。defprintInfo(name,age,**args):"""展示用户的姓名、年龄以及课程和对应的分数:paramname:用户名(字符串):paramage:用户年龄(整数/浮点数):paramargs:可变关键字参数,接收课程名(键)和分数(值)"""#展示基础信息print("="*50)print(f"用户姓名:{name}")print(f"用户年龄:{age}")#展示课程和分数信息ifargs:#判断是否传入了课程分数数据print("\n课程成绩明细:")print("-"*30)#遍历可变关键字参数(本质是一个字典)forcourse,scoreinargs.items():#格式化输出,排版更整齐print(f"{course:>10}:{score:>6}分")else:print("\n暂无课程成绩信息")print("="*50)#======================主程序:直接硬编码数据,调用函数======================if__name__=="__main__":#1.定义测试数据(字典存储课程和分数,对应原用户输入的结果)student1_courses={"Python":95.5,"数学":88.0,"英语":92.3}student2_courses={"语文":89,"物理":76.5}#2.调用printInfo()函数,传递参数#关键:使用**字典解包,将字典转为可变关键字参数传递print("=====测试学生1信息=====")printInfo("张三",20,**student1_courses)print("\n=====测试学生2信息=====")printInfo("李四",19,**student2_courses)#3.测试无课程成绩的场景print("\n=====测试无课程成绩的学生=====")printInfo("王五",21)

单元5【基础练习】一、选择题1.B2.D3.C4.A5.B6.A7.B8.C9.A10.D11.A12.C13.C14.D二、判断题(正确的画“√”,错误的画“×”)1.√2.√3.×4.√5.√6.√7.×8.√9.√10.√11.×12.√13.√【进阶挑战】1.按要求完成以下有关Person类的操作。(1)定义一个名为Person的类,包含名字和年龄两个属性。(2)在Person类中编写一个初始化方法__init__(),用于设置名字和年龄。(3)在Person类中添加一个方法,输出个人的问候语。(4)在Person类中分别添加一个类方法和静态方法,类方法可以访问类属性,静态方法则不依赖于类或实例。(5)使用私有属性和公有属性来封装Person类的数据,使用getter和setter方法来访问和修改私有属性。(6)使用@property来创建只读属性。(7)在Person类中添加一个特殊的方法__del__()作为析构方法,当对象被销毁时输出一条消息。classPerson:#类属性(所有实例共享)species="人类"#(2)初始化方法__init__()+(1)定义名字/年龄属性+(5)公有/私有属性封装def__init__(self,name,age):"""构造方法:初始化Person实例:paramname:姓名(公有属性):paramage:年龄(私有属性,以双下划线开头)"""#公有属性:可直接通过实例访问=name#私有属性:仅能在类内部访问,外部无法直接修改(封装性)self.__age=age#(3)实例方法:输出个人问候语defsay_hello(self):"""实例方法:必须接收self参数,访问实例属性"""print(f"你好!我叫{},今年{self.get_age()}岁。")#(5)getter方法:访问私有属性__agedefget_age(self):"""公有方法:获取私有属性__age的值"""returnself.__age#(5)setter方法:修改私有属性__age(可添加合法性校验,提升封装性)defset_age(self,new_age):"""公有方法:修改私有属性__age,附带年龄合法性判断"""ifisinstance(new_age,int)and0<new_age<150:self.__age=new_ageprint(f"年龄已更新为:{new_age}岁")else:print("输入的年龄不合法(必须是0-150之间的整数)")#(6)@property:创建只读属性(此处以“出生年份”为例,无法直接修改,仅能通过年龄推导)@propertydefbirth_year(self):"""只读属性:通过当前年龄推导出生年份(假设当前年份为2026)"""current_year=2026returncurrent_year-self.get_age()#(4)类方法:访问类属性,接收cls参数(代表类本身)@classmethoddefshow_species(cls):"""类方法:可访问/修改类属性,无需创建实例即可调用"""print(f"该类的物种属性为:{cls.species}")#也可以修改类属性cls.species="智人"print(f"修改后的物种属性为:{cls.species}")#(4)静态方法:不依赖类/实例属性,无默认参数(self/cls)@staticmethoddefis_adult(age):"""静态方法:独立于类和实例,仅做通用逻辑判断"""returnage>=18#(7)析构方法:对象被销毁时自动调用def__del__(self):"""析构方法:对象回收时输出提示信息"""print(f"对象{}已被销毁,内存已释放。")#======================测试Person类的所有功能======================if__name__=="__main__":#1.创建Person实例p1=Person("张三",25)p2=Person("李四",17)#2.(3)调用实例方法:输出问候语print("=====测试实例方法=====")p1.say_hello()p2.say_hello()#3.(5)测试公有属性、私有属性的访问与修改(getter/setter)print("\n=====测试公有/私有属性(getter/setter)=====")#直接访问公有属性print(f"p1的姓名(公有属性):{}")#通过getter方法访问私有属性(无法直接p1.__age,会报错)print(f"p1的年龄(私有属性,通过getter获取):{p1.get_age()}")#通过setter方法修改私有属性p1.set_age(30)p1.set_age(200)#测试不合法年龄#4.(6)测试@property只读属性print("\n=====测试@property只读属性=====")print(f"p1的出生年份(只读):{p1.birth_year}")#尝试修改只读属性(会报错,验证只读特性)try:p1.birth_year=1990exceptAttributeErrorase:print(f"修改只读属性报错:{e}")#5.(4)测试类方法(两种调用方式:类直接调用/实例调用)print("\n=====测试类方法=====")Person.show_species()#推荐:类直接调用类方法p1.show_species()#也可通过实例调用,效果一致#6.(4)测试静态方法(两种调用方式:类直接调用/实例调用)print("\n=====测试静态方法=====")print(f"p1是否成年(静态方法判断):{Person.is_adult(p1.get_age())}")print(f"p2是否成年(静态方法判断):{p2.is_adult(p2.get_age())}")#7.(7)测试析构方法(手动删除对象,触发__del__)print("\n=====测试析构方法=====")delp1delp22.按要求完成以下有关Employee类的操作。(1)创建一个名为Employee的类,继承Person类,并添加一个新属性employee_id。(2)在Employee类中重写Person类中的问候方法,添加工作相关的问候。(3)编写一个函数,接收Person类型的对象作为参数,并调用其问候方法,演示多态性。#先定义父类Person(复用之前的完整实现,保证继承可用)classPerson:#类属性species="人类"#初始化方法def__init__(self,name,age):=name#公有属性self.__age=age#私有属性#实例方法:问候语(后续被子类重写)defsay_hello(self):"""父类问候方法:基础个人信息问候"""print(f"你好!我叫{},今年{self.get_age()}岁。")#getter方法:访问私有属性__agedefget_age(self):returnself.__age#setter方法:修改私有属性__agedefset_age(self,new_age):ifisinstance(new_age,int)and0<new_age<150:self.__age=new_ageelse:print("输入的年龄不合法(必须是0-150之间的整数)")#@property:只读属性@propertydefbirth_year(self):current_year=2026returncurrent_year-self.get_age()#类方法@classmethoddefshow_species(cls):print(f"该类的物种属性为:{cls.species}")#静态方法@staticmethoddefis_adult(age):returnage>=18#析构方法def__del__(self):print(f"对象{}已被销毁,内存已释放。")#======================(1)定义Employee子类,继承Person类======================classEmployee(Person):"""员工类:继承自Person类新增属性:employee_id(员工编号)"""def__init__(self,name,age,employee_id):"""子类初始化方法:先调用父类初始化,再初始化子类独有属性:paramname:姓名(继承自父类):paramage:年龄(继承自父类):paramemployee_id:员工编号(子类新增属性)"""#调用父类的__init__方法,初始化继承的属性(name、__age)super().__init__(name,age)#初始化子类独有的属性:员工编号(公有属性,也可设为私有)self.employee_id=employee_id#======================(2)重写父类Person的say_hello()方法======================defsay_hello(self):"""子类重写父类问候方法:保留基础信息,添加工作相关问候体现:子类对父类方法的扩展与重写"""#可选:调用父类的say_hello(),复用基础问候逻辑(也可完全重写)#super().say_hello()#扩展工作相关问候print(f"你好!我叫{},今年{self.get_age()}岁,我的员工编号是{self.employee_id},很高兴为你提供工作服务。")#======================(3)编写函数,接收Person类型对象,演示多态性======================defgreet_person(person_obj):"""通用问候函数:接收Person(或其子类)对象,调用其say_hello()方法演示多态性:同一方法调用,根据对象类型不同,执行不同的逻辑:paramperson_obj:Person类或其子类的实例对象"""#健壮性判断:确保传入的是Person(或子类)对象ifisinstance(person_obj,Person):person_obj.say_hello()#调用对象的say_hello()方法,多态性核心else:print("传入的对象不是Person类型(或其子类),无法执行问候。")#======================测试所有功能======================if__name__=="__main__":#1.创建父类Person实例p1=Person("张三",25)#2.创建子类Employee实例e1=Employee("李四",30,"E001")e2=Employee("王五",28,"E002")#3.演示多态性:调用同一个greet_person()函数,传入不同类型对象print("=====演示多态性=====")print("---传入Person实例---")greet_person(p1)#执行Person类的say_hello()print("\n---传入Employee实例1---")greet_person(e1)#执行Employee类重写后的say_hello()print("\n---传入Employee实例2---")greet_person(e2)#执行Employee类重写后的say_hello()#4.验证子类的独有属性print("\n=====验证Employee子类独有属性=====")print(f"李四的员工编号:{e1.employee_id}")print(f"王五的员工编号:{e2.employee_id}")

单元6【基础练习】一、选择题1.A2.A3.D4.C5.D二、判断题(正确的画“√”,错误的画“×”)1.×2.√3.√4.√5.×6.√7.√8.×三、填空题1.flush()2.open()3.with4.①importcsv②'s.csv','r',encoding='utf-8'③fr④r5.①'ss.csv','w',encoding='utf-8',newline=''②fw③w.writerows(lst1)【进阶挑战】1.创建一个文本文件myfile.txt,完成以下操作。(1)写入几行文本,再逐行读取文件,并输出每一行。(2)获取并输出文件的大小。(3)读取该文件的内容,并将其复制到newfile.txt文件中。importos#用于获取文件大小#===============(1)创建myfile.txt,写入文本并逐行读取输出======================defcreate_and_read_myfile():"""创建myfile.txt,写入内容,再逐行读取并输出"""#定义要写入的文本内容(多行)file_content=["这是myfile.txt的第一行文本\n","这是第二行,用于测试文件写入与读取\n","这是第三行,包含一些测试数据:123456\n","这是最后一行,结束测试\n"]#步骤1:写入文本到myfile.txt(使用with语句,自动关闭文件,避免资源泄露)withopen("myfile.txt","w",encoding="utf-8")asfw:fw.writelines(file_content)#批量写入多行文本print("=====(1)myfile.txt创建并写入完成=====")#步骤2:逐行读取myfile.txt并输出print("=====逐行读取myfile.txt内容=====")withopen("myfile.txt","r",encoding="utf-8")asfr:#遍历文件对象,逐行读取(高效,适合大文件)forline_num,lineinenumerate(fr,start=1):#strip()去除每行末尾的换行符,避免输出多余空行print(f"第{line_num}行:{line.strip()}")#===============(2)获取并输出myfile.txt的文件大小======================defget_file_size():"""获取myfile.txt的文件大小(字节数)并输出"""#方法1:使用os.path.getsize(),直接获取文件大小(字节)file_size_bytes=os.path.getsize("myfile.txt")#可选:转换为千字节(KB),方便阅读(1KB=1024字节)file_size_kb=round(file_size_bytes/1024,2)print("\n=====(2)myfile.txt文件大小=====")print(f"文件大小(字节):{file_size_bytes}B")print(f"文件大小(千字节):{file_size_kb}KB")returnfile_size_bytes#==========(3)将myfile.txt内容复制到newfile.txt======================defcopy_file_to_newfile():"""读取myfile.txt内容,复制到newfile.txt"""#步骤1:读取myfile.txt的全部内容withopen("myfile.txt","r",encoding="utf-8")asfr:all_content=fr.read()#读取全部内容(适合小文件,简洁高效)#步骤2:将内容写入newfile.txt(不存在则创建,存在则覆盖)withopen("newfile.txt","w",encoding="utf-8")asfw:fw.write(all_content)print("\n=====(3)文件复制完成=====")print("myfile.txt的内容已成功复制到newfile.txt")#======================主程序:按顺序执行所有操作======================if__name__=="__main__":#(1)创建、写入、逐行读取create_and_read_myfile()#(2)获取文件大小get_file_size()#(3)复制文件到newfile.txtcopy_file_to_newfile()2.在一个文本文件中搜索特定的单词或短语,并输出包含该单词的所有行。defsearch_word_in_file(file_path,target_word,ignore_case=True):#存储包含目标单词的行matched_lines=[]#以只读模式打开文件,指定utf-8编码避免中文乱码withopen(file_path,"r",encoding="utf-8")asfr:#逐行读取文件,记录行号(从1开始)forline_num,line_contentinenumerate(fr,start=1):#去除每行首尾空白字符(换行符、空格等)clean_line=line_content.strip()#处理大小写逻辑,统一转换为小写(若开启忽略大小写)ifignore_case:line_to_check=clean_line.lower()target_to_check=target_word.lower()else:line_to_check=clean_linetarget_to_check=target_word#判断目标单词是否在当前行中,匹配则输出并保存iftarget_to_checkinline_to_check:matched_lines.append((line_num,clean_line))print(f"第{line_num}行:{clean_line}")#处理无匹配结果的场景ifnotmatched_lines:print(f"未在文件《{file_path}》中找到包含「{target_word}」的内容")returnmatched_lines#======================主程序:测试搜索功能======================if__name__=="__main__":#配置文件路径和要搜索的目标单词(基于之前创建的myfile.txt)FILE_PATH="myfile.txt"TARGET_WORD="测试"#输出搜索标题并调用搜索函数print(f"=====开始在文件《{FILE_PATH}》中搜索「{TARGET_WORD}」=====")search_word_in_file(FILE_PATH,TARGET_WORD)3.读取一个文件,替换文件中的某些文本,并将结果写入新文件。defreplace_text_in_file(original_file,new_file,old_text,new_text,ignore_case=True):"""读取原文件,替换指定文本,将结果写入新文件(无异常处理):paramoriginal_file:源文件路径:paramnew_file:写入结果的新文件路径:paramold_text:要被替换的旧文本:paramnew_text:替换后的新文本:paramignore_case:替换时是否忽略大小写,默认True"""#步骤1:读取原文件的全部内容withopen(original_file,"r",encoding="utf-8")asfr:file_content=fr.read()#步骤2:处理文本替换逻辑ifignore_case:#忽略大小写替换(先转换为小写找到匹配位置,再进行替换,保持原文本其他大小写不变)#简易实现:直接使用字符串replace(严格忽略大小写可使用re模块,此处保持简洁)importre#编译正则表达式,忽略大小写标志pattern=pile(re.escape(old_text),re.IGNORECASE)replaced_content=pattern.sub(new_text,file_content)else:#严格区分大小写替换replaced_content=file_content.replace(old_text,new_text)#步骤3:将替换后的内容写入新文件withopen(new_file,"w",encoding="utf-8")asfw:fw.write(replaced_content)#提示操作完成print(f"=====文本替换完成=====")print(f"源文件:《{original_file}》")print(f"新文件:《{new_file}》")print(f"替换内容:「{old_text}」→「{new_text}」")print(f"是否忽略大小写:{ignore_case}")#======================主程序:测试文本替换功能======================if__name__=="__main__":#配置相关参数(基于之前创建的myfile.txt)ORIGINAL_FILE="myfile.txt"#源文件NEW_FILE="replaced_myfile.txt"#替换后的新文件OLD_TEXT="测试"#要被替换的旧文本NEW_TEXT="演示"#替换后的新文本#调用文本替换函数replace_text_in_file(ORIGINAL_FILE,NEW_FILE,OLD_TEXT,NEW_TEXT)4.读取一个文件,显示除了以“#”开头的行以外的所有行。defshow_non_comment_lines(file_path):"""读取文件,显示除了以“#”开头的行以外的所有行(无异常处理):paramfile_path:文本文件路径"""#步骤1:以只读模式打开文件,指定utf-8编码避免中文乱码withopen(file_path,"r",encoding="utf-8")asfr:#步骤2:逐行读取文件forline_num,line_contentinenumerate(fr,start

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论