Python入门:Python3基础练习题详解,从入门到熟练的25个实例(四)
前言
本系列文章旨在通过25个精选实例,帮助Python初学者从基础语法过渡到熟练应用。本篇为第四部分,聚焦字符串处理、循环控制、函数设计等核心知识点,每个实例均包含问题描述、代码实现与详细解析。
实例16:字符串反转与大小写转换
问题描述:输入一个字符串,输出其反转后的结果,并将所有字母转换为大写。
def reverse_and_upper(s):reversed_str = s[::-1] # 切片反转字符串upper_str = reversed_str.upper() # 转换为大写return upper_str# 测试input_str = "Hello World"print(reverse_and_upper(input_str)) # 输出: DLROW OLLEH
解析:
- 字符串切片
[::-1]是Python中反转字符串的高效方法。 upper()方法将所有字母转为大写,非字母字符不受影响。- 此类操作常见于数据清洗与预处理场景。
实例17:统计字符串中元音字母数量
问题描述:统计输入字符串中元音字母(a,e,i,o,u)的数量,不区分大小写。
def count_vowels(s):vowels = "aeiou"count = 0for char in s.lower(): # 转换为小写统一处理if char in vowels:count += 1return count# 测试test_str = "Python Programming"print(count_vowels(test_str)) # 输出: 4
解析:
- 使用
lower()方法统一大小写,避免重复判断。 in操作符检查字符是否属于元音集合。- 此类统计操作在文本分析中极为常见。
实例18:生成斐波那契数列前N项
问题描述:输入正整数N,输出斐波那契数列前N项。
def fibonacci(n):fib_seq = [0, 1] # 初始化前两项while len(fib_seq) < n:next_num = fib_seq[-1] + fib_seq[-2] # 计算下一项fib_seq.append(next_num)return fib_seq[:n] # 返回前N项# 测试print(fibonacci(10)) # 输出: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
解析:
- 列表存储数列,通过索引访问最后两项。
while循环动态扩展列表,直至达到指定长度。- 斐波那契数列是算法入门经典案例,体现递推思想。
实例19:判断素数(优化版)
问题描述:输入正整数N,判断其是否为素数(优化算法)。
def is_prime(n):if n <= 1:return Falseif n == 2:return Trueif n % 2 == 0: # 排除偶数return Falsefor i in range(3, int(n**0.5) + 1, 2): # 仅检查奇数因子if n % i == 0:return Falsereturn True# 测试print(is_prime(29)) # 输出: Trueprint(is_prime(30)) # 输出: False
解析:
- 排除小于2的数、2以外的偶数。
- 仅检查
√n范围内的奇数因子,大幅减少计算量。 - 素数判断是密码学、哈希算法的基础。
实例20:列表去重并排序
问题描述:输入一个列表,去除重复元素后按升序排序。
def deduplicate_and_sort(lst):unique_lst = list(set(lst)) # 去重unique_lst.sort() # 排序return unique_lst# 测试input_list = [3, 1, 2, 2, 4, 3]print(deduplicate_and_sort(input_list)) # 输出: [1, 2, 3, 4]
解析:
set()自动去重,转换为列表后调用sort()。- 也可使用
sorted(set(lst))一步完成。 - 数据去重是数据预处理的关键步骤。
实例21:计算列表元素平均值
问题描述:输入一个数值列表,计算其元素的平均值。
def calculate_average(lst):if not lst: # 处理空列表return 0return sum(lst) / len(lst)# 测试numbers = [10, 20, 30, 40]print(calculate_average(numbers)) # 输出: 25.0
解析:
sum()求和,len()获取长度。- 空列表判断避免除零错误。
- 平均值计算是统计分析的基础。
实例22:查找列表中最大值及其索引
问题描述:输入一个列表,返回最大值及其首次出现的索引。
def find_max_and_index(lst):max_val = max(lst)max_index = lst.index(max_val)return max_val, max_index# 测试data = [5, 8, 2, 8, 3]print(find_max_and_index(data)) # 输出: (8, 1)
解析:
max()获取最大值,index()查找首次出现位置。- 若需所有最大值索引,可用列表推导式:
max_val = max(lst)indices = [i for i, x in enumerate(lst) if x == max_val]
实例23:字典键值对交换
问题描述:输入一个字典,交换其键值对(假设值可哈希)。
def swap_dict_keys_values(d):return {v: k for k, v in d.items()} # 字典推导式# 测试original_dict = {"a": 1, "b": 2}swapped_dict = swap_dict_keys_values(original_dict)print(swapped_dict) # 输出: {1: 'a', 2: 'b'}
解析:
- 字典推导式简洁高效。
- 注意值必须可哈希(如不可用列表作为值)。
实例24:递归计算阶乘
问题描述:输入正整数N,递归计算其阶乘。
def factorial_recursive(n):if n == 0 or n == 1: # 基线条件return 1else:return n * factorial_recursive(n - 1) # 递归调用# 测试print(factorial_recursive(5)) # 输出: 120
解析:
- 递归需明确基线条件与递归关系。
- 阶乘是递归入门经典案例,但N较大时易栈溢出。
实例25:文件读写与行数统计
问题描述:统计指定文本文件的行数。
def count_file_lines(filename):try:with open(filename, "r", encoding="utf-8") as file:lines = file.readlines()return len(lines)except FileNotFoundError:print(f"错误:文件 {filename} 不存在")return -1# 测试(需准备test.txt文件)# print(count_file_lines("test.txt"))
解析:
with语句自动管理文件资源。readlines()读取所有行,len()统计数量。- 异常处理增强程序健壮性。
总结与建议
- 实践优先:完成每个实例后,尝试修改参数或扩展功能(如实例24改为尾递归优化)。
- 调试技巧:使用
print()或调试器(如VS Code的Python调试)跟踪变量变化。 - 文档参考:遇到不懂的函数时,通过
help(function)或官方文档深入学习。 - 项目整合:将多个实例组合为小型项目(如用实例17+20实现单词统计工具)。
本系列后续将覆盖面向对象编程、异常处理、文件操作等进阶主题,助力读者从基础到熟练的跨越。