综合练习集
本章节收录了 Python 基础各主题的综合练习,每道题均附有参考答案。建议在尝试独立完成后,再对照答案进行复盘。
来源:极客时间 Python 基础课程练习 + 课程实战项目
练习一:变量
题目
- 定义两个变量分别为美元和汇率
- 通过搜索引擎找到美元兑人民币汇率
- 使用 Python 计算 100 美元兑换的人民币数量并用
print()进行输出
参考答案
python
# 定义美元
dollar = 100
# 定义汇率
exchange = 6.4696
# 输出结果
print('{dol}美元兑换的人民币数量为{yuan}'.format(dol=dollar, yuan=dollar * exchange))练习二:序列(字符串)
题目
- 定义一个字符串
Hello Python并使用print()输出 - 定义第二个字符串
Let's go并使用print()输出 - 定义第三个字符串
"The Zen of Python" -- by Tim Peters并使用print()输出
参考答案
python
# 1. 定义一个字符串 Hello Python 并使用 print() 输出
string1 = 'Hello Python'
print(string1)
# 2. 定义第二个字符串 Let's go 并使用 print() 输出
string2 = "Let's go"
print(string2)
# 3. 定义第三个字符串 "The Zen of Python" -- by Tim Peters 并使用 print() 输出
string3 = '"The Zen of Python" -- by Tim Peters'
print(string3)练习三:条件语句
题目
- 使用
if语句判断字符串的长度是否等于 10,根据判断结果进行不同的输出 - 提示用户输入一个 1-40 之间的数字,使用
if语句根据输入数字的大小进行判断,如果输入的数字在 1-10、11-20、21-30、31-40,分别进行不同的输出
参考答案
python
# 1. 使用 if 语句判断字符串的长度是否等于 10
string1 = '123456789'
print(len(string1))
if not len(string1) == 10:
print('字符串长度不等于10')
else:
print('字符串长度等于10')
# 2. 根据输入数字大小进行判断
num = int(input('请输入一个1-40之间的数字:'))
if 1 <= num <= 10:
print('输入的数字在 1-10 之间')
elif 11 <= num <= 20:
print('输入的数字在 11-20 之间')
elif 21 <= num <= 30:
print('输入的数字在 21-30 之间')
elif 31 <= num <= 40:
print('输入的数字在 31-40 之间')
else:
print('输入的数字不在有效范围内')练习四:循环语句
题目
- 使用
for语句输出 1-100 之间的所有偶数 - 使用
while语句输出 1-100 之间能够被 3 整除的数字
参考答案
python
# 1. 使用 for 语句输出 1-100 之间的所有偶数
for i in range(1, 101):
if i % 2 == 0:
print(i)
# 2. 使用 while 语句输出 1-100 之间能够被 3 整除的数字
i = 1
while i <= 100:
if i % 3 == 0:
print(i)
i += 1练习五:字典与集合
题目
- 定义一个字典,分别使用 a、b、c、d 作为字典的关键字,值为任意内容
- 为该字典增加一个元素
'c': 'cake'后,将字典输出到屏幕 - 取出字典中关键字为 d 的值
- 将字符串
hello中每个字符赋值给一个集合,将这个集合输出到屏幕
参考答案
python
# 1. 定义字典
dict1 = {'a': 'aa', 'b': 'xyz', 'c': 'Helo', 'd': 123}
# 2. 增加元素(字典的 key 不能重复,否则会覆盖掉相同 key 的值)
dict1['c'] = 'cake'
print(dict1)
# 3. 取出关键字为 d 的值
print(dict1['d'])
# 4. 集合的使用
str1 = 'hello'
print(set(str1)) # 集合里的元素不能重复练习六:文件操作
题目
- 创建一个文件,并写入当前日期
- 再次打开这个文件,读取文件的前 4 个字符后退出
参考答案
python
import datetime
# 1. 创建一个文件,并写入当前日期
now = datetime.datetime.now()
with open('c.txt', 'w') as f:
# 注意 write() 方法写入的内容是字符串类型
f.write(str(now))
# 2. 再次打开这个文件,读取文件的前 4 个字符后退出
with open('c.txt', 'r') as f:
text_4 = f.read(4)
print(text_4)练习七:异常处理
题目
- 在 Python 程序中,分别使用未定义变量、访问列表不存在的索引、访问字典不存在的关键字,观察系统提示的错误信息
- 通过 Python 程序产生
IndexError,并用try捕获异常处理
参考答案
python
# 1. 观察各种错误
# 使用未定义变量
# a + 1 # NameError
# 访问列表不存在的索引
# b = ['a', 'b', 'c']
# b[3] # IndexError
# 访问字典不存在的 key
# c = {'x': 1}
# c['y'] # KeyError
# 2. 用 try 捕获 IndexError
try:
b = ['a', 'b', 'c']
b[3]
except IndexError:
print('访问列表不存在的索引')练习八:函数
题目
- 创建一个函数,用于接收用户输入的数字,并计算用户输入数字的和
- 创建一个函数,传入 n 个整数,返回其中最大的数和最小的数
- 创建一个函数,传入一个参数 n,返回 n 的阶乘
参考答案
python
# 1. 计算用户输入数字的和
def func1():
two_num = input('请输入两个数字,用空格做分隔:')
num1, *_, num2 = list(two_num)
print(int(num1) + int(num2))
func1()
# 2. 返回最大值和最小值
def func3(*nums):
print(max(list(nums)))
print(min(list(nums)))
func3(1, 5, 8, 32, 654, 765, 4, 6, 7)
# 3. 计算 n 的阶乘(递归实现)
def fact(num3):
if num3 == 0 or num3 == 1:
return 1
else:
return num3 * fact(num3 - 1)
print(fact(10))
# 使用高阶函数实现
from functools import reduce
num4 = 10
print(reduce(lambda x, y: x * y, range(1, num4 + 1)))练习九:模块
题目
- 导入
os模块,并使用help(os)查看os模块的帮助文档
练习十:装饰器
题目
练习 A:定义装饰器,用于打印函数执行的时间
- 统计函数开始执行和结束执行的时间
- 扩展练习:为装饰器传入超时时间,函数执行超过指定时间后退出
练习 B:定义装饰器,实现不同颜色显示执行结果的功能
- 向装饰器传递参数,通过传递的参数获取到输出的颜色
- 被装饰函数的
print()输出根据装饰器得到的颜色进行输出
参考答案(练习 A 扩展:超时装饰器)
python
# 为装饰器传入超时时间,函数执行超过指定时间后退出
# 注意:Windows 下 signal.SIGALRM 不可用
import time
import signal
def timeout(seconds=10, error_message="Timer expired"):
def decorator(func):
def handler(signum, frame):
raise TimeoutError(error_message)
def wrapper(*args, **kwargs):
signal.signal(signal.SIGALRM, handler)
signal.alarm(seconds)
try:
result = func(*args, **kwargs)
finally:
signal.alarm(0)
return result
return wrapper
return decorator
@timeout(seconds=3)
def long_running_task():
time.sleep(5)
print("任务完成")
try:
long_running_task()
except TimeoutError as e:
print(f"任务超时:{e}")练习十一:多线程
题目
练习 A:多线程文件名称查找
- 对某一文件夹启动 10 个线程查找文件包含
abc三个字符的文件名,并显示该文件所在的路径 - 尽量使用面向对象编程方式实现
练习 B(扩展):使用多线程编写一个简单的聊天室
- 接收用户的网络连接可以使用
socketserver库 - 用户首次登录输入自己的名字和当前在线的用户,支持多人同时登录
- 用户默认发的消息全部人可以收到,用户使用
@某一用户可以进行私聊
实战项目:学员管理系统
需求
进入系统显示系统功能界面,功能如下:
- 添加学员
- 删除学员
- 修改学员信息
- 查询学员信息
- 显示所有学员信息
- 退出系统
参考实现
python
# 定义功能界面函数
def info_print():
print('请选择功能--------------')
print('1、添加学员')
print('2、删除学员')
print('3、修改学员')
print('4、查询学员')
print('5、显示所有学员')
print('6、退出系统')
print('-' * 20)
# 等待存储所有学员的信息
info = []
# 添加学员信息的函数
def add_info():
"""添加学员函数"""
new_id = input('请输入学号:')
new_name = input('请输入姓名:')
new_tel = input('请输入手机号:')
global info
# 不允许姓名重复
for i in info:
if new_name == i['name']:
print('此用户已经存在')
return
info_dict = {}
info_dict['id'] = new_id
info_dict['name'] = new_name
info_dict['tel'] = new_tel
info.append(info_dict)
print(info)
# 删除学员
def del_info():
del_name = input('请输入要删除的学员的姓名:')
global info
for i in info:
if del_name == i['name']:
info.remove(i)
break
else:
print('该学员不存在')
print(info)
# 修改函数
def modify_info():
modify_name = input('请输入要修改的学员的姓名:')
global info
for i in info:
if modify_name == i['name']:
i['tel'] = input('请输入新的手机号:')
break
else:
print('该学员不存在')
print(info)
# 查询学员信息函数
def search_info():
search_name = input('请输入要查询的学员的姓名:')
global info
for i in info:
if search_name == i['name']:
print('查询到的学员信息如下---------------')
print(f"学员的学号是{i['id']}, 姓名是{i['name']}, 手机号是{i['tel']}")
break
else:
print('查无此人...')
# 显示所有学员信息
def print_all():
print('学号\t姓名\t手机号')
for i in info:
print(f"{i['id']}\t{i['name']}\t{i['tel']}")
# 系统功能需要循环使用,直到用户输入 6,才退出系统
while True:
info_print()
user_num = int(input('请输入功能序号:'))
if user_num == 1:
add_info()
elif user_num == 2:
del_info()
elif user_num == 3:
modify_info()
elif user_num == 4:
search_info()
elif user_num == 5:
print_all()
elif user_num == 6:
exit_flag = input('确定要退出吗?yes or no')
if exit_flag == 'yes':
break
else:
print('输入的功能序号有误')企业面试题
print 调用 Python 中底层的什么方法?
print 方法默认调用 sys.stdout.write 方法,即往控制台打印字符串。
版本差异(Python 3.8-3.12 → 3.14)
| 特性 | 本文编写时 | Python 3.14 |
|---|---|---|
| 类型注解求值 | 运行时立即求值 | PEP 649/749 延迟求值:注解不再在定义时执行,解决前向引用,提升启动性能 |
| 字符串模板 | 普通 f-string / str.format | PEP 750 模板字符串 t"...":可插值且能被安全处理(3.14 新特性) |
| 标准库多解释器 | 无官方支持 | PEP 734:interpreter 模块支持在同一进程创建多个子解释器 |
| 调试 | 仅 Python 内建 pdb / IDE 调试 | PEP 768:安全的 CPython 外部调试器接口(custom debugger protocol) |
| 字节码与运行时 | 3.12 前无 JIT | 3.13 引入实验性 JIT(PEP 744);3.14 进一步改进 free-threaded(无 GIL)构建 |
datetime API | utcnow() 常用 | 3.12 起弃用,官方要求改用 datetime.now(tz=datetime.UTC)(aware 对象) |
| 压缩算法 | zlib / gzip / bz2 / lzma | 3.14 新增标准库 Zstandard 支持(PEP 784) |
本文讲解的语法与数据结构原理在 3.14 中依然成立;新项目建议基于 Python 3.13/3.14,并优先使用 aware datetime、PEP 649 注解与最新类型语法。