Python3练习题
上一节中全面讲解了基础知识,为了巩固知识点,当然最好的方法就是练习了。
练习 1:变量类型转换与算术运算
需求:接收用户输入的两个数字(可能是整数或字符串格式),转换为浮点数后计算 “幂运算、整除、取余” 结果,并打印类型信息。
def main():num1_str = input("first number:")num2_str = input("second number:")fnum1 = float(num1_str)fnum2 = float(num2_str)pow_result = fnum1 ** fnum2div_result = fnum1 // fnum2mod_result = fnum1 % fnum2# 打印结果与类型print(f"\n{fnum1} 的 {fnum2} 次幂:{pow_result},类型:{type(pow_result)}")print(f"{fnum1} 整除 {fnum2}:{div_result},类型:{type(div_result)}")print(f"{fnum1} 取余 {fnum2}:{mod_result},类型:{type(mod_result)}")if __name__ == "__main__":main()
结果:
练习 2:多条件判断与循环
需求:遍历 1~20 的整数,按以下规则分类打印:
能被 3 和 5 同时整除:打印 “[数字] 是 3 和 5 的倍数”
能被 3 整除:打印 “[数字] 是 3 的倍数”
能被 5 整除:打印 “[数字] 是 5 的倍数”
其余数字:打印 “[数字] 不是目标倍数”
def main():for i in range(1,21):if i % 3 == 0 and i %5 == 0:print(f"[{i}] 是 3 和 5 的倍数")elif i %3 == 0:print(f"[{i}] 是 3 的倍数")elif i % 5 == 0:print(f"[{i}] 是 5 的倍数")else:print(f"[{i}] 不是目标倍数")if __name__ == "__main__":main()
结果:
练习 3:可变参数与多返回值
需求:定义一个函数,接收 “固定参数(商品基础价)+ 可变位置参数(折扣比例列表)+ 可变关键字参数(额外费用,如运费、服务费)”,计算并返回 “最低折扣价、最高折扣价、最终总价(基础价 × 折扣 + 额外费用总和)”。
def calculate_price(base_price,*discount,**extra_fees):# 计算最低/最高折扣价min_discount_price = base_price * min(discount)max_discount_price = base_price * max(discount)# 计算额外费用总和(关键字参数的value求和)total_extra = sum(extra_fees.values())# 计算最终总价(取最低折扣价+额外费用)final_price = min_discount_price + total_extra# 多返回值(实际返回元组)return min_discount_price, max_discount_price, final_priceif __name__ == "__main__":min_p,max_p,final_p = calculate_price(100,0.8,0.9,ship = 10,servce=5)# 打印结果print(f"基础价:100 元")print(f"最低折扣价:{min_p:.2f} 元")print(f"最高折扣价:{max_p:.2f} 元")print(f"最终总价(最低折扣+额外费用):{final_p:.2f} 元")
结果:
练习 4:函数装饰器
需求:定义一个 “计时装饰器”,用于统计任意函数的执行时间,并打印 “函数名、参数、返回值、执行耗时”。
import timeimport time# 定义计时装饰器
def time_decorator(func):def wrapper(*args, **kwargs):# 执行前:记录开始时间start_time = time.time()# 调用原函数,获取返回值result = func(*args, **kwargs)# 执行后:计算耗时,打印信息end_time = time.time()cost_time = (end_time - start_time) * 1000 # 转换为毫秒print(f"\n=== 函数执行报告 ===")print(f"函数名:{func.__name__}")print(f"位置参数:{args}")print(f"关键字参数:{kwargs}")print(f"返回值:{result}")print(f"执行耗时:{cost_time:.2f} 毫秒")return resultreturn wrapper# 使用装饰器装饰目标函数(计算1到n的和)
@time_decorator
def sum_to_n(n):total = 0for i in range(1, n+1):total += ireturn totalif __name__ == "__main__":sum_result = sum_to_n(100000)print(f"\n1到100000的和:{sum_result}")sum_result = sum_to_n(1000000)print(f"\n1到100000的和:{sum_result}")
结果:
练习 5:列表与字典操作
需求:
用列表存储 5 个学生的姓名和成绩(格式:["张三:90", "李四:85", ...])
将列表转换为字典(键:姓名,值:成绩)
筛选出成绩≥85 的学生,按成绩降序排序并打印
def main():students = ["张三:88","李四:66","王五:99","赵六:66","二蛋:85"]#2.转换为字典score_dict = {}for text in students:key,value = text.split(":")score_dict[key] = int(value)high_score_student = [(name,score) for name,score in score_dict.items() if score >= 85]print(high_score_student)sorted_student = sorted(high_score_student,key = lambda x :x[1],reverse = True)print(sorted_student)if __name__ == "__main__":main()
结果:
练习 6:集合运算
需求:已知两个集合(A:数学满分学生,B:语文满分学生),计算 “两科都满分(交集)、至少一科满分(并集)、仅数学满分(差集)” 的学生名单。
def main():# 定义两个集合math_full = {"张三", "李四", "赵六"} # 数学满分chinese_full = {"李四", "王五", "孙七"} # 语文满分# 集合运算both_full = math_full & chinese_full # 交集:两科都满分any_full = math_full | chinese_full # 并集:至少一科满分only_math = math_full - chinese_full # 差集:仅数学满分# 打印结果print("数学满分学生:", math_full)print("语文满分学生:", chinese_full)print("两科都满分学生:", both_full)print("至少一科满分学生:", any_full)print("仅数学满分学生:", only_math)if __name__ == "__main__":main()
结果:
练习 7:字符串格式化与常用方法
需求:接收用户输入的 “姓名、年龄、身高(cm)”,按以下格式输出个人信息,并统计 “姓名长度、身高是否≥170cm”:
def main():# 接收用户输入name = input("请输入姓名:")age_str = input("请输入年龄:")height_str = input("请输入身高(cm):")# 数据处理:年龄转整数,身高转整数age = int(age_str)height = int(height_str)# 字符串格式化(f-string)info = f"""【个人信息卡】
姓名:{name}(长度:{len(name)}字)
年龄:{age}岁(明年:{age+1}岁)
身高:{height}cm(是否达标:{'是' if height >= 170 else '否'})"""# 打印结果print(info)if __name__ == "__main__":main()
结果:
练习 8:文件读写与内容统计
需求:
向 “student.txt” 文件写入 3 行学生信息(格式:姓名,年龄,成绩)
读取文件内容,统计 “平均成绩、最高成绩及对应姓名”
将统计结果追加到文件末尾
def file_read_write_demo():# 1. 写入文件(覆盖模式,若文件不存在则创建)with open("student.txt", "w", encoding="utf-8") as f:f.write("张三,20,90\n")f.write("李四,19,85\n")f.write("赵六,21,95\n")print("已写入学生信息到 student.txt")# 2. 读取文件并统计names = []scores = []with open("student.txt", "r", encoding="utf-8") as f:for line in f:line = line.strip() # 去除换行符和空格if not line:continue # 跳过空行name, age_str, score_str = line.split(",")names.append(name)scores.append(int(score_str))# 计算统计结果avg_score = sum(scores) / len(scores)max_score = max(scores)max_score_name = names[scores.index(max_score)]# 3. 追加统计结果到文件with open("student.txt", "a", encoding="utf-8") as f:f.write("\n=== 成绩统计结果 ===\n")f.write(f"平均成绩:{avg_score:.1f}\n")f.write(f"最高成绩:{max_score}({max_score_name})\n")print("已追加统计结果到 student.txt")# 验证:读取文件全部内容并打印with open("student.txt", "r", encoding="utf-8") as f:content = f.read()print("\n文件全部内容:")print(content)# 调用函数
file_read_write_demo()
结果:
练习 9:类的继承与多态
需求:
定义父类 “Animal”,包含 “name” 属性和 “make_sound” 方法(纯虚函数风格)
定义子类 “Dog”“Cat”“Bird”,重写 “make_sound” 方法(分别输出 “汪汪”“喵喵”“叽叽”)
定义函数 “animal_sound_show”,接收任意 Animal 对象,调用其 “make_sound” 方法(多态)
class Animal:def __init__(self, name):self.name = name # 公开属性def make_sound(self):# 父类方法:子类需重写raise NotImplementedError("子类必须重写 make_sound 方法")# 子类1:Dog
class Dog(Animal):def make_sound(self):print(f"{self.name} 叫:汪汪汪!")# 子类2:Cat
class Cat(Animal):def make_sound(self):print(f"{self.name} 叫:喵喵喵!")# 子类3:Bird
class Bird(Animal):def make_sound(self):print(f"{self.name} 叫:叽叽叽!")# 多态函数:接收任意Animal子类对象
def animal_sound_show(animal):if isinstance(animal, Animal): # 检查是否为Animal类型animal.make_sound()else:print("不是有效的Animal对象!")# 测试:创建对象并调用多态函数
dog = Dog("大黄")
cat = Cat("小白")
bird = Bird("啾啾")animal_sound_show(dog)
animal_sound_show(cat)
animal_sound_show(bird)
# 测试无效对象
animal_sound_show("不是动物")
练习 10:特性(property)与访问控制
需求:定义 “Person” 类,用 “特性” 控制 “age” 属性:
年龄必须是 0~150 的整数,否则报错
提供 “get_age”(获取年龄)和 “set_age”(设置年龄)的逻辑,外部通过 “p.age” 直接访问
class Person:def __init__(self, name, age):self.name = name# 初始化时调用setter,确保年龄合法self.age = age# 特性:getter(获取年龄)@propertydef age(self):return self._age # _age 是约定的私有变量# 特性:setter(设置年龄,带验证)@age.setterdef age(self, value):# 验证:必须是整数,且在0~150之间if not isinstance(value, int):raise TypeError("年龄必须是整数!")if value < 0 or value > 150:raise ValueError("年龄必须在 0~150 之间!")self._age = value# 测试:正常情况
p1 = Person("张三", 25)
print(f"{p1.name} 的年龄:{p1.age}")# 测试:修改年龄(合法)
p1.age = 30
print(f"{p1.name} 修改后的年龄:{p1.age}")# 测试:非法情况(触发异常,可注释后运行)
# p2 = Person("李四", "20") # 类型错误
# p3 = Person("王五", 200) # 值错误
结果:
练习 11:自定义模块调用
需求:
创建自定义模块 “math_tools.py”,包含 “add(加法)、multiply(乘法)、is_prime(判断质数)” 三个函数
在主脚本中导入该模块,调用函数并测试
步骤 1:创建模块文件 “math_tools.py”
# math_tools.py(自定义模块)
def add(a, b):"""加法运算"""return a + bdef multiply(a, b):"""乘法运算"""return a * bdef is_prime(n):"""判断n是否为质数(质数:大于1的整数,仅能被1和自身整除)"""if n <= 1:return Falseif n == 2:return Trueif n % 2 == 0:return False# 检查3到sqrt(n)的奇数for i in range(3, int(n**0.5) + 1, 2):if n % i == 0:return Falsereturn True
步骤 2:主脚本调用模块
# 主脚本 main.py
# 导入自定义模块(三种方式任选)
import math_tools as mt
from math_tools import is_prime# 测试加法
print("3 + 5 =", mt.add(3, 5))# 测试乘法
print("4 × 6 =", mt.multiply(4, 6))# 测试质数判断
test_nums = [7, 12, 17, 20]
for num in test_nums:print(f"{num} 是质数吗?", is_prime(num))
结果:
练习 12:多线程与锁同步
需求:创建 3 个线程,共享 “计数器” 变量,每个线程对计数器累加 1000 次,用锁确保计数器最终结果正确(避免竞态条件)。
import threading
import time
num =0
lock = threading.Lock()def increment_counter(thread_name):global numfor _ in range(1000):with lock:num+=1time.sleep(0.001)print(f"线程 {thread_name} 执行完毕,当前计数器:{num}")thread1 = threading.Thread(target=increment_counter,args=("thread1",))
thread2 = threading.Thread(target=increment_counter,args=("thread2",))
thread3 = threading.Thread(target=increment_counter,args=("thread3",))thread1.start()
thread2.start()
thread3.start()# 等待所有线程结束
thread1.join()
thread2.join()
thread3.join()print(f"\n所有线程执行完毕,最终计数器:{num}")
结果: