{T}

综合练习集

本章节收录了 Python 基础各主题的综合练习,每道题均附有参考答案。建议在尝试独立完成后,再对照答案进行复盘。

来源:极客时间 Python 基础课程练习 + 课程实战项目


练习一:变量

题目

  1. 定义两个变量分别为美元和汇率
  2. 通过搜索引擎找到美元兑人民币汇率
  3. 使用 Python 计算 100 美元兑换的人民币数量并用 print() 进行输出

参考答案

python
# 定义美元
dollar = 100
# 定义汇率
exchange = 6.4696

# 输出结果
print('{dol}美元兑换的人民币数量为{yuan}'.format(dol=dollar, yuan=dollar * exchange))

练习二:序列(字符串)

题目

  1. 定义一个字符串 Hello Python 并使用 print() 输出
  2. 定义第二个字符串 Let's go 并使用 print() 输出
  3. 定义第三个字符串 "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)

练习三:条件语句

题目

  1. 使用 if 语句判断字符串的长度是否等于 10,根据判断结果进行不同的输出
  2. 提示用户输入一个 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('输入的数字不在有效范围内')

练习四:循环语句

题目

  1. 使用 for 语句输出 1-100 之间的所有偶数
  2. 使用 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

练习五:字典与集合

题目

  1. 定义一个字典,分别使用 a、b、c、d 作为字典的关键字,值为任意内容
  2. 为该字典增加一个元素 'c': 'cake' 后,将字典输出到屏幕
  3. 取出字典中关键字为 d 的值
  4. 将字符串 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))  # 集合里的元素不能重复

练习六:文件操作

题目

  1. 创建一个文件,并写入当前日期
  2. 再次打开这个文件,读取文件的前 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)

练习七:异常处理

题目

  1. 在 Python 程序中,分别使用未定义变量、访问列表不存在的索引、访问字典不存在的关键字,观察系统提示的错误信息
  2. 通过 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('访问列表不存在的索引')

练习八:函数

题目

  1. 创建一个函数,用于接收用户输入的数字,并计算用户输入数字的和
  2. 创建一个函数,传入 n 个整数,返回其中最大的数和最小的数
  3. 创建一个函数,传入一个参数 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)))

练习九:模块

题目

  1. 导入 os 模块,并使用 help(os) 查看 os 模块的帮助文档

练习十:装饰器

题目

练习 A:定义装饰器,用于打印函数执行的时间

  1. 统计函数开始执行和结束执行的时间
  2. 扩展练习:为装饰器传入超时时间,函数执行超过指定时间后退出

练习 B:定义装饰器,实现不同颜色显示执行结果的功能

  1. 向装饰器传递参数,通过传递的参数获取到输出的颜色
  2. 被装饰函数的 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:多线程文件名称查找

  1. 对某一文件夹启动 10 个线程查找文件包含 abc 三个字符的文件名,并显示该文件所在的路径
  2. 尽量使用面向对象编程方式实现

练习 B(扩展):使用多线程编写一个简单的聊天室

  1. 接收用户的网络连接可以使用 socketserver
  2. 用户首次登录输入自己的名字和当前在线的用户,支持多人同时登录
  3. 用户默认发的消息全部人可以收到,用户使用 @某一用户 可以进行私聊

实战项目:学员管理系统

需求

进入系统显示系统功能界面,功能如下:

  1. 添加学员
  2. 删除学员
  3. 修改学员信息
  4. 查询学员信息
  5. 显示所有学员信息
  6. 退出系统

参考实现

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 方法默认调用 sys.stdout.write 方法,即往控制台打印字符串。

版本差异(Python 3.8-3.12 → 3.14)

特性本文编写时Python 3.14
类型注解求值运行时立即求值PEP 649/749 延迟求值:注解不再在定义时执行,解决前向引用,提升启动性能
字符串模板普通 f-string / str.formatPEP 750 模板字符串 t"...":可插值且能被安全处理(3.14 新特性)
标准库多解释器无官方支持PEP 734:interpreter 模块支持在同一进程创建多个子解释器
调试仅 Python 内建 pdb / IDE 调试PEP 768:安全的 CPython 外部调试器接口(custom debugger protocol)
字节码与运行时3.12 前无 JIT3.13 引入实验性 JIT(PEP 744);3.14 进一步改进 free-threaded(无 GIL)构建
datetime APIutcnow() 常用3.12 起弃用,官方要求改用 datetime.now(tz=datetime.UTC)(aware 对象)
压缩算法zlib / gzip / bz2 / lzma3.14 新增标准库 Zstandard 支持(PEP 784)

本文讲解的语法与数据结构原理在 3.14 中依然成立;新项目建议基于 Python 3.13/3.14,并优先使用 aware datetime、PEP 649 注解与最新类型语法。