一、Python基础语法应用
不仅变量的值可以变化,变量的类型也可以随时改变,Python解释器会根据赋值或运算来自动推断变量类型。
str(x):转换对象x为字符串表示形式。
eval(str):计算一个表达式字符串,并返回一个对象。
chr(x):返回Unicode编码x对应的字符
ord(x):返回字符x的Unicode编码
tuple(s):把s(序列)转换为一个元组。
list(s):把s(序列)转换为一个列表。
set(s):把s(序列)转换为一个set集合。
dict(d):转成字典,d必须是(键,值)元组序列。
type(x):返回x的数据类型,type(3)#<class 'int'>





1.学生宿舍信息输入。
模拟学生宿舍信息输入,需要输入学生个人信息、性别、年龄、宿舍号、学院、专业、电话信息,并输出显示。
import os
class Student:
def __init__(self, id, name, gender, age, department, dormitory):
self.id = id
self.name = name
self.gender = gender
self.age = age
self.department = department
self.dormitory = dormitory
def addStudent():
students_file = "students.txt"
print("输入学生ID: ")
id = int(input())
print("输入学生姓名: ")
name = input()
print("输入性别: ")
gender = input()
print("输入年龄: ")
age = int(input())
print("输入院系: ")
department = input()
print("输入宿舍号: ")
dormitory = input()
with open(students_file, "a") as file:
file.write(f"{id} {name} {gender} {age} {department} {dormitory}\n")
print("学生信息已添加。")
def deleteStudent():
students_file = "students.txt"
temp_file = "temp.txt"
print("输入要删除的学生ID: ")
id = int(input())
found = False
with open(students_file, "r") as file, open(temp_file, "w") as temp:
for line in file:
s_id, *_ = line.split()
if int(s_id) != id:
temp.write(line)
else:
found = True
os.remove(students_file)
os.rename(temp_file, students_file)
if found:
print("学生信息已删除。")
else:
print("未找到该学生信息。")
def modifyStudent():
students_file = "students.txt"
temp_file = "temp.txt"
print("输入要修改的学生ID: ")
id = int(input())
found = False
with open(students_file, "r") as file, open(temp_file, "w") as temp:
for line in file:
s_id, s_name, s_gender, s_age, s_department, s_dormitory = line.split()
if int(s_id) == id:
print("输入新的学生姓名: ")
s_name = input()
print("输入新的性别: ")
s_gender = input()
print("输入新的年龄: ")
s_age = int(input())
print("输入新的院系: ")
s_department = input()
print("输入新的宿舍号: ")
s_dormitory = input()
found = True
temp.write(f"{s_id} {s_name} {s_gender} {s_age} {s_department} {s_dormitory}\n")
os.remove(students_file)
os.rename(temp_file, students_file)
if found:
print("学生信息已修改。")
else:
print("未找到该学生信息。")
def queryStudent():
students_file = "students.txt"
print("输入要查询的学生ID: ")
id = int(input())
found = False
with open(students_file, "r") as file:
for line in file:
s_id, s_name, s_gender, s_age, s_department, s_dormitory = line.split()
if int(s_id) == id:
print(f"学生ID: {s_id}\n姓名: {s_name}\n性别: {s_gender}\n年龄: {s_age}\n院系: {s_department}\n宿舍号: {s_dormitory}\n")
found = True
break
if not found:
print("未找到该学生信息。")
def displayMenu():
print("\n====== 学生宿舍信息管理系统 ======")
print("1. 添加学生信息")
print("2. 删除学生信息")
print("3. 修改学生信息")
print("4. 查询学生信息")
print("0. 退出")
print("===================================")
def main():
while True:
displayMenu()
print("请输入您的选择:")
choice = int(input())
if choice == 1:
addStudent()
elif choice == 2:
deleteStudent()
elif choice == 3:
modifyStudent()
elif choice == 4:
queryStudent()
elif choice == 0:
print("感谢使用,再见!")
break
else:
print("无效的选择,请重新输入。")
if __name__ == "__main__":
main()
运行结果:

2.超市抹零。
逛超市购物结账的时候,商家都会给顾客回馈一张清单小票,票面上的金额往往会精确到角或分。大部分商家通常会采用四舍五入的原则进行结算,不过有些商家为了让利顾客,会将小数点后面的数字金额全部抹零。下面使用数字类型转换实现收银抹零行为。
# 超市收银抹零
# 尝试对金额四舍五入输出
# 根据提示语键盘输入数字
money = float(input('请输入收银金额(元):'))
# 类型转换,并打印
print('抹零后金额为(元):' + str(int(money)))

3.个人用户登录。
当用户登录时给3次机会。如果成功,显示欢迎xxx。如果登录失败,显示录入错误你还有x次机会。如果3次机会使用完毕,则显示登录超限,请明天再登录。
for i in range(3):
name = input('请输入用户名:')
pwd = input('请输入密码:')
if name == '暗面的大吉岭' and pwd == '123456darjeeling':
print('欢迎:'+name)
break
elif i < 2:
n = int(2-i)
print('输入错误,你还有%d次机会' % n)
continue
else:
print('登录超限,请明天再登录')
break

4.模拟斐波那契数列输出。
用户输入指定的数列范围,正确输出结果。
def Fibon(n):
if (n==1 or n==2):
return 1
else:
return Fibon(n-1) + Fibon(n - 2)
if __name__ == '__main__':
list = []
n = int(input('请输入数列的范围:'))
for i in range(n):
c = Fibon(i+1)
list.append(c)
print(list)

5.银行金额大写汉字转换。
银行电子支票业务在金额部分需要使用大写的汉字,因此需要将用户录入的数字信息转变为汉字。目前只需完成1~5位整数转换即可。
number_dict = {"1": "一", "2": "二", "3": "三", "4": "四", "5": "五", "6": "六", "7": "七", "8": "八", "9": "九",
"0": "零"}
unit_dict = {1: '', 2: '十', 3: '百', 4: '千', 5: '万'}
zero_list = ['零万', '零千', '零百', '零十', '零零']
def main(number):
num_str = str(number)
print(num_str, end=':')
int_str = deal_int(num_str)
if num_str.__contains__("."):
int_str = int_str + deal_decimal(num_str)
print(int_str)
def deal_int(number: str):
# 处理整数
number = int(number.split('.')[0])
if number == 0:
return ''
return_str = ''
if number >= 100000000:
current = deal_single_int((number - (number % 100000000)) // 100000000)
return_str = return_str + current + '亿'
number = number % 100000000
if number >= 10000:
current = deal_single_int((number - (number % 10000)) // 10000)
return_str = return_str + current + '万'
number = number % 10000
if number >= 0:
return_str = return_str + deal_single_int(number) + '元'
if ('零' in return_str):
return_str = deal_zero(return_str)
return return_str
def deal_single_int(number: int):
number_str = str(number)
lenth = len(number_str)
return_str = ''
for i in range(0, lenth):
upper_num = number_dict[number_str[i]]
unit = unit_dict.get(lenth - i)
return_str = return_str + upper_num + unit
if return_str.endswith("零"):
return_str = return_str[:-1]
return return_str
def deal_zero(number: str):
# 处理返回值中的零
for item in zero_list:
if item in number:
number = number.replace(item, '零')
number = deal_multiple_zero(number)
if number.endswith("零"):
number = number[:-1]
return number
def deal_multiple_zero(number: str):
if '零零' in number:
number = number.replace('零零', '零')
return deal_multiple_zero(number)
else:
return number
def deal_decimal(number: str):
# 处理小数
number = number.split('.')[1]
return_str = number_dict[number[0]] + '角'
if len(number) > 1:
return_str = return_str + number_dict[number[1]] + '分'
return return_str
if __name__ == '__main__':
main(34009.6)
main(5009.6)
main(334009.6)
main(3331009.6)
main(33023009.7)
main(433303009.7)
main(5203323009.7)
main(0.73)

6.编程求出2-1000内的所有回文素数。
能被1 和本身整除的整数叫素数;如一个素数从左向右和从右向左是相同的数,则该素数为回文素数。
for i in range(2, 1001):
for j in range(2, i):
if i % j == 0:
break
else:
n = str(i)
m = n[::-1]
if m == n:
print(i, end=' ')

7.求完全平方数。
一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
import math
for n in range(-100,27956):
x = int(math.sqrt(100+n))
y = int(math.sqrt(100+168 + n))
if 100+n ==x*x and 268+n == y*y :
print(n)

8. 水仙花数是3位整数(100-199),它的各位数字立方和等于该数本身。请编写程序。
for i in range(100,1000):
sum = 0
temp = i
while temp:
sum += (temp % 10) ** 3
temp //= 10
if sum == i:
print(i,"是水仙数")

9.计算BMI 。
写一个计算可以计算一个人BMI(身体质量指数)指数程序体质指数(BMI)=体重(kg)÷身高的平方(m)
成人的BMI数值:
过轻:低于18.5
正常:18.5-23.9
过重:24-27
肥胖:27-32
非常肥胖, 高于32
name = str(input("请输入你的姓名:"))
height = eval(input("请输入你的身高(m):"))
weight = eval(input("请输入你的体重(kg):"))
BMI = weight / pow(height, 2)
print("BMI值为:{:.2f}".format(BMI)) # {:.2f} 调用方法保留小数点后两位
if BMI < 18.5:
print("偏瘦")
else:
if 18.5 < BMI < 25:
print("正常")
else:
if 25 < BMI < 28:
print("偏胖")
else:
if 28 < BMI < 32:
print("肥胖")
else:
if BMI > 32:
print("严重肥胖!")

10.阶乘。
n = int(input("请输入一个非负整数:"))
if n < 0:
print("负数没有阶乘!")
else:
result = 1
for i in range(1, n + 1):
result *= i
print(f"{n} 的阶乘是 {result}")

二、字符串操作
1.敏感词过滤。
敏感词过滤,将敏感词替换为“*”。
在当今的互联网时代,信息传播的速度之快、范围之广前所未有,但同时也伴随着一些不良信息的传播,其中就包括敏感词汇的使用。敏感词,通常指的是那些具有争议性、攻击性、侮辱性或者涉及个人隐私、政治敏感等内容的词汇。这些词汇的使用,往往会对他人造成伤害,引发社会争议,甚至触犯法律法规。因此,对敏感词进行过滤,是维护网络健康、文明交流的重要措施。通过技术手段对敏感词进行识别和过滤,可以有效净化网络环境,保护用户免受不良信息的侵扰。同时,我们也应该自觉遵守网络道德规范,不使用敏感词汇,共同营造一个和谐、健康的网络空间。在这个过程中,技术的进步和公众意识的提升将共同推动网络环境的持续改善。
敏感词:争议、侮辱
class SensitiveWordFilter:
def __init__(self, sensitive_words):
"""初始化敏感词过滤器,传入敏感词列表"""
self.sensitive_words = sensitive_words
def filter(self, text):
"""过滤输入文本中的敏感词"""
for word in self.sensitive_words:
# 替换敏感词为星号
text = text.replace(word, '*' * len(word))
return text
if __name__ == "__main__":
# 定义敏感词列表
sensitive_words = ["争议", "侮辱"]
# 创建过滤器实例
filter = SensitiveWordFilter(sensitive_words)
# 输入文本
text = ("在当今的互联网时代,信息传播的速度之快、范围之广前所未有,"
"但同时也伴随着一些不良信息的传播,其中就包括敏感词汇的使用。"
"敏感词,通常指的是那些具有争议性、攻击性、侮辱性或者涉及个人隐私、政治敏感等内容的词汇。"
"这些词汇的使用,往往会对他人造成伤害,引发社会争议,甚至触犯法律法规。"
"因此,对敏感词进行过滤,是维护网络健康、文明交流的重要措施。"
"通过技术手段对敏感词进行识别和过滤,可以有效净化网络环境,保护用户免受不良信息的侵扰。"
"同时,我们也应该自觉遵守网络道德规范,不使用敏感词汇,"
"共同营造一个和谐、健康的网络空间。在这个过程中,"
"技术的进步和公众意识的提升将共同推动网络环境的持续改善。。")
# 进行敏感词过滤
filtered_text = filter.filter(text)
# 输出过滤后的文本
print("过滤前的文本:", text)
print("过滤后的文本:", filtered_text)

2.获取字符串中的第一个唯一字符。
要求:给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
输入: "leetcode"
输出: 0
def first_unique_character(s):
# 创建一个字典来记录字符的出现次数
char_count = {}
# 遍历字符串,统计每个字符的出现次数
for char in s:
if char in char_count:
char_count[char] += 1
else:
char_count[char] = 1
# 再次遍历字符串,找到第一个出现次数为 1 的字符
for index, char in enumerate(s):
if char_count[char] == 1:
return index # 返回第一个唯一字符的索引
return -1 # 如果不存在,返回 -1
# 示例
input_string = "leetcode"
output_index = first_unique_character(input_string)
print(f"输入: \"{input_string}\"")
print(f"输出: {output_index}")

3.正则表达式。
正则表达式(Regular Expression)是一种由字符和特殊符号组成的模式,用于匹配、查找和替换文本中的字符串模式。它在文本处理、数据验证、网页爬虫等领域应用广泛。以下是 Python 中使用正则表达式的常见场景和示例:
import re
# 1. 简单匹配:验证邮箱格式
email = "example@domain.com"
pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
if re.match(pattern, email):
print(f"{email} 是有效的邮箱地址")
# 2. 查找所有匹配项:提取字符串中的数字
text = "苹果10元,香蕉5元,橙子8元"
prices = re.findall(r'\d+', text)
print("提取的价格:", prices) # 输出: ['10', '5', '8']
# 3. 替换操作:敏感信息脱敏
phone = "13812345678"
masked_phone = re.sub(r'(\d{3})\d{4}(\d{4})', r'\1****\2', phone)
print("脱敏后的手机号:", masked_phone) # 输出: 138****5678
# 4. 分割字符串:按特定符号分割
log = "2023-01-01 12:00:00|INFO|操作成功"
parts = re.split(r'\|', log)
print("分割后的日志:", parts) # 输出: ['2023-01-01 12:00:00', 'INFO', '操作成功']
# 5. 复杂匹配:提取HTML标签中的内容
html = "<h1>欢迎访问我的网站</h1><p>这是一个示例</p>"
titles = re.findall(r'<h1>(.*?)</h1>', html)
print("提取的标题:", titles) # 输出: ['欢迎访问我的网站']
题目:用正则表达式,提取出下文中所有的日期,并输出。
原文:
回顾过去的一年,有几个重要的日期深深地烙印在我的记忆中。首先是2023-01-01,那是新年的第一天,我满怀希望地制定了全年的计划和目标。接着是2023-03-15,那天我参加了一场重要的面试,它不仅是我职业生涯的一个转折点,也让我更加明确了自己的职业方向。然后是2023-05-15,那是一个难忘的日子,我和家人一起庆祝了我的生日,感受到了亲情的温暖和幸福。最后是2023-12-31,那是年末的最后一天,我回顾了这一年的点点滴滴,感慨万分。在未来的日子里,我将继续前行,迎接更多的挑战和机遇。
import re
# 原文
text = """
回顾过去的一年,有几个重要的日期深深地烙印在我的记忆中。首先是2023-01-01,那是新年的第一天,我满怀希望地制定了全年的计划和目标。接着是2023-03-15,那天我参加了一场重要的面试,它不仅是我职业生涯的一个转折点,也让我更加明确了自己的职业方向。然后是2023-05-15,那是一个难忘的日子,我和家人一起庆祝了我的生日,感受到了亲情的温暖和幸福。最后是2023-12-31,那是年末的最后一天,我回顾了这一年的点点滴滴,感慨万分。在未来的日子里,我将继续前行,迎接更多的挑战和机遇。
"""
# 使用正则表达式提取日期
date_pattern = r'\d{4}-\d{2}-\d{2}'
dates = re.findall(date_pattern, text)
print(dates)


三、函数
(1)高阶函数。
简单来说,是指把函数作为参数的一种函数。
在 Python 中,高阶函数(Higher-order Function) 是指满足以下任一条件的函数:
- 接受一个或多个函数作为参数
- 返回一个函数
这种设计模式让函数可以像普通数据(如整数、字符串)一样被传递和操作,是函数式编程的核心特性。
#一.接受函数作为参数的高阶函数
#1.map()函数
def square(x):
return x ** 2
numbers = [1, 2, 3, 4]
squared = map(square, numbers) # 将 square 函数应用到每个元素
print(list(squared)) # 输出: [1, 4, 9, 16]
#2. filter() 函数:使用指定函数过滤可迭代对象中的元素。
def is_even(x):
return x % 2 == 0
numbers = [1, 2, 3, 4]
evens = filter(is_even, numbers) # 过滤出偶数
print(list(evens)) # 输出: [2, 4]
#3.自定义高阶函数
def apply_twice(func, x):
"""对 x 应用 func 两次"""
return func(func(x))
def add_five(x):
return x + 5
result = apply_twice(add_five, 10) # 等价于 10 + 5 + 5
print(result) # 输出: 20
#二、返回函数的高阶函数
#1. 闭包(Closure):内部函数可以访问外部函数的变量。
def multiplier(n):
def multiply(x):
return x * n # 闭包捕获了外部变量 n
return multiply # 返回内部函数
double = multiplier(2) # 创建一个乘以 2 的函数
triple = multiplier(3) # 创建一个乘以 3 的函数
print(double(5)) # 输出: 10
print(triple(5)) # 输出: 15
#2. 装饰器(Decorator):装饰器是一种特殊的高阶函数,用于增强其他函数的功能。
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"调用函数: {func.__name__}")
result = func(*args, **kwargs)
print(f"函数返回: {result}")
return result
return wrapper
@log_decorator # 等价于 add = log_decorator(add)
def add(a, b):
return a + b
add(3, 4) # 输出:
# 调用函数: add
# 函数返回: 7
#高阶函数的好处:
#1.代码复用:减少重复代码,提高灵活性。
#2.抽象行为:将通用逻辑封装在高阶函数中。
#3.简洁表达:例如使用 map、filter 替代显式循环。
(2)lambda函数。
在 Python 中,lambda 函数(也称为匿名函数)是一种小型、一次性使用的函数,它没有显式的函数名。lambda 函数通常用于编写简单的、单行的函数逻辑,尤其适合作为高阶函数(如 map()、filter())的参数。基本语法:
lambda 参数列表: 表达式
#1.简单的 lambda 函数
# 普通函数写法
def add(a, b):
return a + b
# lambda 函数等价写法
add_lambda = lambda a, b: a + b
print(add(3, 4)) # 输出: 7
print(add_lambda(3, 4)) # 输出: 7
#2.作为参数传递给高阶函数
# 结合 map() 使用 lambda
numbers = [1, 2, 3, 4]
squared = map(lambda x: x**2, numbers)
print(list(squared)) # 输出: [1, 4, 9, 16]
# 结合 filter() 使用 lambda
evens = filter(lambda x: x % 2 == 0, numbers)
print(list(evens)) # 输出: [2, 4]
#3.在 sorted () 中自定义排序规则
students = [
{"name": "Alice", "age": 20},
{"name": "Bob", "age": 18},
{"name": "Charlie", "age": 22}
]
# 按年龄排序
sorted_students = sorted(students, key=lambda s: s["age"])
print(sorted_students)
# 输出: [{'name': 'Bob', 'age': 18}, {'name': 'Alice', 'age': 20}, {'name': 'Charlie', 'age': 22}]
#4.闭包中的 lambda
def multiplier(n):
return lambda x: x * n # 返回一个 lambda 函数
double = multiplier(2)
triple = multiplier(3)
print(double(5)) # 输出: 10
print(triple(5)) # 输出: 15
| 特性 | 普通函数 | lambda 函数 |
|---|---|---|
| 定义方式 | 使用 def 关键字 | 使用 lambda 关键字 |
| 函数名 | 必须有显式的函数名 | 匿名(通常赋值给变量) |
| 函数体 | 可以包含多条语句和复杂逻辑 | 只能是单个表达式 |
| 返回值 | 使用 return 语句返回 | 表达式的值即为返回值 |
(3)闭包。
在 Python 里,闭包是一种特殊的函数,它能记住并使用其创建时所在环境中的变量,即便该环境已经不存在。闭包由两部分构成:内部函数和该内部函数所捕获的外部变量。
def outer_function(x):
def inner_function(y):
return x + y # 内部函数使用了外部函数的变量 x
return inner_function # 返回内部函数
closure = outer_function(10) # 创建闭包,此时 x 的值被固定为 10
print(closure(5)) # 输出 15,调用闭包时传入 y 的值
在这个例子中,outer_function 是外部函数,它返回了内部函数 inner_function。当调用 outer_function(10) 时,x 的值被固定为 10,并且被闭包捕获。之后调用 closure(5) 时,闭包会使用之前捕获的 x 值(也就是 10)和新传入的 y 值(也就是 5)进行计算。
闭包的主要特点有:
- 捕获外部变量:闭包能够记住外部函数中的变量,即便外部函数已经执行完毕。
- 保持状态:闭包可以保留其创建时的状态,多次调用闭包时,会使用相同的外部变量。
- 延迟执行:闭包在被调用时才会执行,执行时使用的是捕获的变量值。
闭包在实际中有很多用途,比如实现装饰器、创建函数工厂、实现私有数据等。下面再看一个使用闭包实现计数器的例子:
def counter():
count = 0 # 外部变量
def increment():
nonlocal count # 声明使用外部变量
count += 1
return count
return increment
c = counter()
print(c()) # 输出 1
print(c()) # 输出 2
在这个计数器例子中,闭包 increment 捕获并更新外部变量 count,从而实现计数功能。
(4)装饰器。
在 Python 中,装饰器是一种特殊的函数,它可以用来修改或扩展其他函数的功能,而无需直接修改被装饰函数的源代码。装饰器本质上是一个高阶函数,它接受一个函数作为参数,并返回一个新的函数。
基本语法和原理
装饰器的基本语法使用 @ 符号,放置在被装饰函数的定义之前:
def decorator_function(func):
def wrapper(*args, **kwargs):
# 在原函数执行前的操作
print(f"Before function execution: {func.__name__}")
result = func(*args, **kwargs) # 执行原函数
# 在原函数执行后的操作
print(f"After function execution: {func.__name__}")
return result
return wrapper
@decorator_function
def add(a, b):
return a + b
# 等价于 add = decorator_function(add)
print(add(3, 5)) # 输出: 8

(5)函数式编程。
Python 是多范式语言,并非纯函数式语言。
过度使用函数式编程可能导致代码可读性下降。
列表推导式和生成器表达式(Python 特色)常被用于替代 map/filter,使代码更简洁。
实验题目:函数式编程
(1)编写函数,检查获取传入列表或者元组对象的所有奇数位索引对应的元素。
(2)编写函数,判断用户传入的对象(字符串、元组、列表)长度是否大于6。
(3)编写函数,检查传入列表的长度,如果大于2,将列表的前两项内容返回给调用者。
(4)编写函数,计算传入函数的字符串中,数字、字母、空格以及其他内容的个数,并返回
(5)编写函数,返回两个数字参数中较大的那个数字
(6)编写函数,接收多个数字,求和并返回。
(7)编写函数,参数为一个字符串,返回这个字符串所有子串里面构成回文串的最大子串。
(8)编写函数,输入不定长参数,将其中是整型的全部相加,忽略非整型的参数。(提示:判断是否是整型可以使用isinstance函数)
(9)编写函数,传入函数中多个实参(均为可迭代对象,如字符串、元组、列表、集合等),将每个实参的每个元素依次加入到函数的动态参数args里面,例如传入两个参数[1, 2, 3] (10, 20)最终args为(1,2,3,10,20)
(10)编写函数,传入函数中多个实参(均为字典),将每个实参的每个元素依次加入到函数的动态参数kwargs里面,例如传入两个参数{'one':1} {'two':2}, 最终kwargs为{'one': 1, 'two': 2}。
(11)解一元二次方程。func(a, b, c)求x1, x2
参考代码:
#1.1
def get_odd_index_elements(data):
# 检查输入是否为列表或元组
if not isinstance(data, (list, tuple)):
raise ValueError("Input must be a list or a tuple.")
# 使用列表推导式获取奇数索引的元素
odd_index_elements = [data[i] for i in range(len(data)) if i % 2 != 0]
return odd_index_elements
# 示例用法
example_list = [10, 20, 30, 40, 50]
example_tuple = (1, 2, 3, 4, 5)
print(get_odd_index_elements(example_list)) # 输出: [20, 40]
print(get_odd_index_elements(example_tuple)) # 输出: [2, 4]
#1.2
def is_length_greater_than_six(data):
# 检查输入类型
if not isinstance(data, (str, list, tuple)):
raise ValueError("Input must be a string, list, or tuple.")
# 判断长度是否大于6
return len(data) > 6
# 示例用法
print(is_length_greater_than_six("Hello!")) # 输出: False
print(is_length_greater_than_six("Hello, World!")) # 输出: True
print(is_length_greater_than_six([1, 2, 3, 4, 5, 6, 7])) # 输出: True
print(is_length_greater_than_six((1, 2, 3))) # 输出: False
#1.3
def get_first_two_items(data):
# 检查输入是否为列表
if not isinstance(data, list):
raise ValueError("Input must be a list.")
# 检查列表长度
if len(data) > 2:
return data[:2] # 返回前两项
else:
return None # 列表长度不大于2时返回None
# 示例用法
print(get_first_two_items([1, 2, 3, 4])) # 输出: [1, 2]
print(get_first_two_items([10])) # 输出: None
print(get_first_two_items(["a", "b", "c"])) # 输出: ['a', 'b']
#1.4
def count_string_elements(s):
# 检查输入是否为字符串
if not isinstance(s, str):
raise ValueError("Input must be a string.")
# 初始化计数器
counts = {
'letters': 0,
'digits': 0,
'spaces': 0,
'others': 0
}
# 遍历字符串中的每个字符
for char in s:
if char.isalpha():
counts['letters'] += 1
elif char.isdigit():
counts['digits'] += 1
elif char.isspace():
counts['spaces'] += 1
else:
counts['others'] += 1
return counts
# 示例用法
result = count_string_elements("Hello World 123!")
print(result) # 输出: {'letters': 10, 'digits': 3, 'spaces': 2, 'others': 1}
#1.5
def get_larger_number(num1, num2):
# 检查输入是否为数字
if not (isinstance(num1, (int, float)) and isinstance(num2, (int, float))):
raise ValueError("Both inputs must be numbers.")
# 返回较大的数字
return max(num1, num2)
# 示例用法
print(get_larger_number(10, 20)) # 输出: 20
print(get_larger_number(15.5, 10.3)) # 输出: 15.5
print(get_larger_number(-5, -3)) # 输出: -3
#1.6
def sum_numbers(*args):
# 检查所有输入是否为数字
for num in args:
if not isinstance(num, (int, float)):
raise ValueError("All inputs must be numbers.")
# 计算和并返回
return sum(args)
# 示例用法
print(sum_numbers(1, 2, 3)) # 输出: 6
print(sum_numbers(10.5, 5.5, -2)) # 输出: 14.0
print(sum_numbers(1, 2, 3, 4, 5)) # 输出: 15
#1.7
def is_palindrome(s):
return s == s[::-1]
def longest_palindromic_substring(s):
max_length = 0
longest_palindrome = ""
# 获取所有子串
for i in range(len(s)):
for j in range(i + 1, len(s) + 1):
substring = s[i:j]
if is_palindrome(substring) and len(substring) > max_length:
max_length = len(substring)
longest_palindrome = substring
return longest_palindrome
# 示例用法
print(longest_palindromic_substring("babad")) # 输出: "bab" 或 "aba"
print(longest_palindromic_substring("cbbd")) # 输出: "bb"
print(longest_palindromic_substring("a")) # 输出: "a"
print(longest_palindromic_substring("ac")) # 输出: "a" 或 "c"
#1.8
def is_palindrome(s):
return s == s[::-1]
def longest_palindromic_substring(s):
max_length = 0
longest_palindrome = ""
# 获取所有子串
for i in range(len(s)):
for j in range(i + 1, len(s) + 1):
substring = s[i:j]
if is_palindrome(substring) and len(substring) > max_length:
max_length = len(substring)
longest_palindrome = substring
return longest_palindrome
# 示例用法
print(longest_palindromic_substring("babad")) # 输出: "bab" 或 "aba"
print(longest_palindromic_substring("cbbd")) # 输出: "bb"
print(longest_palindromic_substring("a")) # 输出: "a"
print(longest_palindromic_substring("ac")) # 输出: "a" 或 "c"
#1.9
def collect_elements(*iterables):
args = [] # 用于存储所有元素
# 遍历所有可迭代对象
for iterable in iterables:
# 将每个可迭代对象的元素添加到args中
args.extend(iterable)
return tuple(args) # 返回一个元组
# 示例用法
result = collect_elements([1, 2, 3], (10, 20), "hello")
print(result) # 输出: (1, 2, 3, 10, 20, 'h', 'e', 'l', 'l', 'o')
result = collect_elements((1, 2), [3, 4], {5, 6})
print(result) # 输出: (1, 2, 3, 4, 5, 6)
#1.10
def collect_dicts(**kwargs):
merged_dict = {} # 创建一个空字典用于合并
# 遍历所有传入的字典参数
for d in kwargs.values():
# 检查d是否是字典
if isinstance(d, dict):
# 合并每个字典的键值对到最终的字典中
merged_dict.update(d)
return merged_dict
# 示例用法
result = collect_dicts(dict1={'one': 1}, dict2={'two': 2})
print(result) # 输出: {'one': 1, 'two': 2}
result = collect_dicts(a={'x': 10}, b={'y': 20, 'z': 30})
print(result) # 输出: {'x': 10, 'y': 20, 'z': 30}
#1.11
from math import sqrt
def gcd(a, b): # 求最大正公因数
if a == b:
return a
elif a < b:
return gcd(b, a)
else:
while b != 0:
a, b = b, a % b
return abs(a)
def func(a, b, c): # 求三个数的最大公因数
list = []
list += [gcd(a, b), gcd(a, c), gcd(b, c)]
return (min(list))
def num_type(num1, num2): # 约分
if num1 == num2:
return (1)
elif gcd(num1, num2) == 1:
return (f" {num1}\n -------\n {int(num2)}")
elif gcd(num1, num2) == num1:
return (f" 1\n -------\n {int(num2 / num1)}")
elif gcd(num1, num2) == num2:
return (f"{int(num1 / num2)}")
def func2(num): # 判断数字是否为1
if num == 1:
return ("")
else:
return (int(num))
def solve(num, b, a0):
num_sqr = [i for i in range(2, int(sqrt(num)) + 1)]
list = []
for j in num_sqr:
if num % j ** 2 == 0:
list.append(j)
if len(list) != 0:
Max = max(list)
if func(Max, b, a0) == 1:
print(f" {-b} + {func2(Max)} √ {int(num / Max ** 2)}\nX1 =-------\n {a0}\n")
print(f" {-b} - {func2(Max)} √ {int(num / Max ** 2)}\nX2 =-------\n {a0}\n")
elif func(Max, b, a0) == a0:
print(f" {int(-b / func(Max, b, a0))} + {func2(Max / func(Max, b, a0))} √ {int(num / Max ** 2)}")
print(f" {int(-b / func(Max, b, a0))} - {func2(Max / func(Max, b, a0))} √ {int(num / Max ** 2)}")
elif func(Max, b, a0) == b or Max:
m = min(b, Max)
print(f" {int(-b / m)} + {func2(Max / m)} √ {int(num / Max ** 2)}\nX1 =-------\n {int(a0 / m)}\n")
print(f" {int(-b / m)} - {func2(Max / m)} √ {int(num / Max ** 2)}\nX2 =-------\n {int(a0 / m)}\n")
else:
print(f" {-b} + √{num}\nX1 =-------\n {a0}\n")
print(f" {-b} - √{num}\nX2 =-------\n {a0}\n")
# 主函数
print("解方程 aX^2 + bX +c = 0")
while True:
try:
a = int(input("请输入 a 的值(自行转化为整数) : "))
b = int(input("请输入 b 的值(自行转化为整数) : "))
c = int(input("请输入 c 的值(自行转化为整数) : "))
break
except ValueError:
print("您输入的不是数字,请再次尝试输入!")
d = b ** 2 - a * c * 4 # 判断δ情况
a0 = 2 * a
if a == 0:
input("你好好看看这是不是一元二次方程!")
elif b == 0:
input("这你都不会算你还上什么学?")
elif d < 0:
print("此方程无实数根")
elif d == 0:
print(f"此方程有两个相同的实数根,为{num_type(-b, a0)}")
elif d > 0:
print("此方程有两个实数根")
if sqrt(d) == int(sqrt(d)): # 当δ为能开尽时
s1 = -b + sqrt(d)
s2 = -b - sqrt(d)
print(f"X1 = {num_type(s1, a0)}\n") # 方程的根1
print(f"X2 = {num_type(s2, a0)}\n") # 方程的根2
elif sqrt(d) != int(sqrt(d)): # 当δ开不尽时
solve(d, b, a0)


四、python面向对象
Python 面向对象编程(OOP)是一种以对象为核心的程序设计思想,核心优势是代码复用、降低耦合度,适用于复杂业务场景,例如校园管理系统、各类资源管理平台。
核心概念:
| 概念 | 定义 |
|---|---|
| 类(Class) | 描述具有相同属性和方法的对象集合,是对象的抽象模板(如Person类、Student类) |
| 对象(Object) | 类的实例化结果,包含类定义的属性和方法(如stu = Student()创建的stu) |
| 实例化 | 创建类对象的过程(对象名 = 类名(参数)) |
| 继承 | 子类(派生类)继承父类(基类)的属性和方法,实现代码复用(如Student(Person)) |
| 方法重写 | 子类对父类的方法重新定义,适配子类需求 |
| 封装 | 将属性和方法封装在类内部,通过访问控制(公有 / 私有)保护数据 |
1.类的创建与基础使用
#1. 类的定义与构造方法(__init__)
#构造方法在实例化时自动调用,用于初始化对象属性。
class Person:
# 构造方法:初始化属性(self为必选参数,指代当前对象)
def __init__(self, name, age):
self.name = name # 实例属性(对象独有)
self.age = age
self.__birthyear = 2024 - age # 私有属性(双下划线开头)
# 实例方法:操作对象属性
def say_hello(self):
print(f"{self.name}说:您好!")
# 公有方法:访问私有属性(提供接口)
def get_birthyear(self):
print(f"出生年份:{self.__birthyear}")
# 实例化对象
p = Person("牛老师", 40)
p.say_hello() # 调用实例方法 → 牛老师说:您好!
p.get_birthyear() # 访问私有属性 → 出生年份:1984
#2. 析构方法(__del__)
#对象销毁时自动调用,用于资源清理(如释放文件、网络连接)。
class Student:
def __init__(self, name):
self.name = name
print(f"姓名为{self.name}的对象被创建!")
def __del__(self):
print(f"姓名为{self.name}的对象被销毁!")
# 测试析构方法
stu1 = Student("李晓明") # 姓名为李晓明的对象被创建!
del stu1 # 主动删除对象 → 姓名为李晓明的对象被销毁!
stu2 = Student("马红") # 姓名为马红的对象被创建!
# 程序结束时自动销毁stu2 → 姓名为马红的对象被销毁!

2.类的成员(属性与方法)
#1.实例属性:对象独有,通过self定义;类属性:类共享,所有对象共用一个值。
class Person:
info = "这是人类" # 类属性(所有对象共享)
def __init__(self, name):
self.name = name # 实例属性(对象独有)
# 访问类属性
print(Person.info) # 直接通过类访问 → 这是人类
p1 = Person("小吴")
p2 = Person("小邹")
print(p1.info, p2.info) # 对象也可访问 → 这是人类 这是人类
# 修改类属性(影响所有对象)
Person.info = "这是智慧人类"
print(p1.info, p2.info) # → 这是智慧人类 这是智慧人类
# 修改实例属性(仅影响当前对象)
p1.name = "小吴同学"
print(p1.name, p2.name) # → 小吴同学 小邹
#2.@property装饰器(属性封装):用于将方法伪装为属性,方便访问和赋值时添加逻辑。
class Person:
def __init__(self, name, age):
self.name = name
self._age = None # 受保护属性
# getter方法:获取属性值
@property
def age(self):
print("获取年龄")
return self._age
# setter方法:设置属性值(仅在需要修改时定义)
@age.setter
def age(self, value):
if value < 0 or value > 120:
print("年龄无效!")
return
print("设置年龄")
self._age = value
# 使用@property
p = Person("小李", 16)
p.age = 18 # 调用setter → 设置年龄
print(p.age) # 调用getter → 获取年龄 → 18
p.age = 200 # → 年龄无效!
#3.方法
#3.1实例方法:第一个参数为self,绑定当前对象;只能通过对象调用,可访问实例属性和类属性。
class Person:
def __init__(self, name):
self.name = name
def show_name(self): # 实例方法
print(f"姓名:{self.name}")
p = Person("张三")
p.show_name() # → 姓名:张三
# Person.show_name() # 错误:类不能直接调用实例方法(需手动传self)
#3.2类方法:用@classmethod装饰,第一个参数为cls(指代当前类);可通过类或对象调用,仅能访问类属性。
class Person:
info = "人类"
@classmethod
def show_info(cls): # 类方法
print(f"类信息:{cls.info}")
Person.show_info() # 类调用 → 类信息:人类
p = Person()
p.show_info() # 对象调用 → 类信息:人类
#3.3静态方法:用@staticmethod装饰,无默认参数;与类和对象无关,仅托管在类的命名空间中。
class Person:
@staticmethod
def static_info(): # 静态方法
print("这是一个人类相关的静态方法")
Person.static_info() # 类调用 → 这是一个人类相关的静态方法
p = Person()
p.static_info() # 对象调用 → 这是一个人类相关的静态方法

3.继承与方法重写
#1. 单继承基础:子类继承父类的属性和方法,可新增或重写方法。
# 父类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print(f"{self.name}说:您好!")
# 子类(继承Person)
class Student(Person):
# 重写构造方法(需调用父类构造方法初始化属性)
def __init__(self, name, age, sno):
super().__init__(name, age) # 调用父类构造方法(推荐)
# Person.__init__(self, name, age) # 另一种调用方式
self.sno = sno # 子类新增属性
# 重写父类方法
def say_hello(self):
print(f"学生{self.name}(学号:{self.sno})说:您好!")
# 子类新增方法
def show_stu_info(self):
print(f"学号:{self.sno},姓名:{self.name},年龄:{self.age}")
# 测试子类
stu = Student("小吴", 20, "230606")
stu.say_hello() # 调用重写的方法 → 学生小吴(学号:230606)说:您好!
stu.show_stu_info() # 调用新增方法 → 学号:230606,姓名:小吴,年龄:20
#2. 多重继承(Python 特有):一个类可继承多个父类,按广度优先查找方法(Python 3 默认)。
class Father:
def func(self):
print("Father的方法")
class Mother:
def func(self):
print("Mother的方法")
class Child(Father, Mother): # 继承Father和Mother
pass
child = Child()
child.func() # 按继承顺序查找 → Father的方法
#3. 方法重写与多态:子类重写父类方法后,不同对象调用同一方法呈现不同行为。
class Person:
def info(self):
print("这是人类")
class Student(Person):
def info(self):
print("这是学生")
class Teacher(Person):
def info(self):
print("这是老师")
# 多态:同一方法对不同对象有不同实现
def show_info(obj):
obj.info()
p = Person()
stu = Student()
tea = Teacher()
show_info(p) # → 这是人类
show_info(stu) # → 这是学生
show_info(tea) # → 这是老师

4.面向对象高级应用
# 1. 动态扩展类与实例:Python 支持动态为类或对象添加属性和方法。
from types import MethodType
class Student:
pass
# 动态为对象添加方法
def set_name(self, name):
self.name = name
stu1 = Student()
stu1.set_name = MethodType(set_name, stu1) # 绑定实例方法
stu1.set_name("张三")
print(stu1.name) # → 张三
# 动态为类添加方法
@classmethod # 加上这个装饰器,让它成为类方法
def set_sno(cls, sno):
cls.sno = sno
Student.set_sno = set_sno # 绑定类方法
Student.set_sno("2023001")
print(Student.sno) # → 2023001
# 2. __slots__限制属性限制类实例:只能添加指定属性,提升性能并防止属性滥用。
class Person:
__slots__ = ("name", "age") # 仅允许添加name和age属性
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("tom", 18)
p.name = "jerry" # 允许修改
# p.sex = "male" # 错误:AttributeError(不允许新增sex属性)
# 3. 单例模式:保证类只有一个实例(适用于日志、数据库连接池等场景)。
class Singleton:
__instance = None # 私有类属性:存储唯一实例
def __new__(cls, *args, **kwargs): # 控制实例创建(比__init__早执行)
if cls.__instance is None:
cls.__instance = super().__new__(cls) # 创建实例
return cls.__instance # 返回唯一实例
# 测试:所有对象指向同一实例
s1 = Singleton()
s2 = Singleton()
print(s1 == s2) # → True(内存地址相同)
print(id(s1), id(s2)) # 输出相同的内存地址
# 4.鸭子类型:关注对象的 “行为” 而非 “类型”,只要对象有对应方法即可使用。
class Duck:
def walk(self):
print("像鸭子一样走路")
def swim(self):
print("像鸭子一样游泳")
class Person:
def walk(self):
print("像鸭子一样走路")
def swim(self):
print("像鸭子一样游泳")
# 不关心对象类型,只关心是否有walk和swim方法
def watch_duck(animal):
animal.walk()
animal.swim()
duck = Duck()
person = Person()
watch_duck(duck) # 像鸭子一样走路 → 像鸭子一样游泳
watch_duck(person) # 像鸭子一样走路 → 像鸭子一样游泳

5.实战:校园管理系统核心类设计
class Person:
def __init__(self, name, gender, age):
self.name = name
self.gender = gender
self.age = age
def show_basic_info(self):
print(f"姓名:{self.name},性别:{self.gender},年龄:{self.age}")
# 学生类
class Student(Person):
def __init__(self, name, gender, age, sno, college, major):
super().__init__(name, gender, age)
self.sno = sno # 学号
self.college = college # 学院
self.major = major # 专业
def show_stu_info(self):
print("=== 学生信息 ===")
self.show_basic_info()
print(f"学号:{self.sno},学院:{self.college},专业:{self.major}")
# 教师类
class Teacher(Person):
def __init__(self, name, gender, age, tid, teach_age, title, course):
super().__init__(name, gender, age)
self.tid = tid # 工号
self.teach_age = teach_age # 教龄
self.title = title # 职称
self.course = course # 教授课程
def show_tea_info(self):
print("=== 教师信息 ===")
self.show_basic_info()
print(f"工号:{self.tid},教龄:{self.teach_age}年,职称:{self.title},教授课程:{self.course}")
# 课程类
class Course:
def __init__(self, cid, name, exam_type):
self.cid = cid # 课程编号
self.name = name # 课程名称
self.exam_type = exam_type # 考核方式
def show_course_info(self):
print(f"课程编号:{self.cid},课程名称:{self.name},考核方式:{self.exam_type}")
# 测试
stu = Student("小吴", "男", 20, "230606", "软件学院", "计算机科学与技术")
stu.show_stu_info()
tea = Teacher("牛老师", "女", 40, "T2024001", 15, "教授", "Python开发与应用")
tea.show_tea_info()
course = Course("C2024001", "Python面向对象", "闭卷考试")
course.show_course_info()

五、组合数据类型、文件操作、异常处理和数据库操作
1.组合数据类型(列表、元组、集合、字典)
组合数据类型用于存储批量数据,按特性分为序列类型(列表、元组)、集合类型、映射类型(字典),核心优势是简化数据管理与操作。
1.1列表(List)- 有序可变
定义:用[]包裹,元素可重复、类型不限,支持增删改查;
核心特性:有序、可变,支持嵌套和切片;
常用场景:存储有序数据(如学生列表、成绩列表)。
# 1. 列表创建
list1 = ['张轩', '李岚', 92] # 混合类型
list2 = list(('a', 'b', 'c')) # 从元组转换
list3 = [i for i in range(10) if i % 2 == 0] # 列表推导式(0-9的偶数)
# 2. 增删改查
list1.append('王晨') # 末尾添加 → ['张轩', '李岚', 92, '王晨']
list1.insert(1, '刘峰') # 指定位置插入 → ['张轩', '刘峰', '李岚', 92, '王晨']
list1.remove('李岚') # 删除指定元素 → ['张轩', '刘峰', 92, '王晨']
del list1[2] # 按索引删除 → ['张轩', '刘峰', '王晨']
list1[0] = '张飞' # 修改元素 → ['张飞', '刘峰', '王晨']
# 3. 切片操作
print(list1[1:3]) # 截取索引1-2 → ['刘峰', '王晨']
print(list1[:-1]) # 截取到倒数第二个 → ['张飞', '刘峰']
# 4. 排序与嵌套
stu_list = [['张轩', 92], ['李岚', 87], ['王晨', 95]]
stu_list.sort(key=lambda x: x[1], reverse=True) # 按成绩降序 → [['王晨',95], ['张轩',92], ['李岚',87]]
# 5. 深浅拷贝
import copy
list4 = [1, 2, [3, 4]]
shallow_copy = list4.copy() # 浅拷贝(嵌套元素共享内存)
deep_copy = copy.deepcopy(list4) # 深拷贝(完全独立)
list4[2][0] = 5
print(shallow_copy) # [1,2,[5,4]](嵌套元素受影响)
print(deep_copy) # [1,2,[3,4]](不受影响)
1.2 元组(Tuple)- 有序不可变
定义:用()包裹,元素可重复、类型不限,创建后不可修改;
核心特性:有序、不可变,占用内存少,支持切片;
常用场景:存储固定数据(如坐标、配置参数)。
# 1. 元组创建
tup1 = ('a', 'b', 123)
tup2 = 1, 2, 3 # 省略括号(非空元组需保留逗号)
tup3 = tuple([4, 5, 6]) # 从列表转换
tup4 = (7,) # 单元素元组(必须加逗号)
# 2. 访问与切片
print(tup1[0]) # 按索引访问 → 'a'
print(tup1[1:3]) # 切片 → ('b', 123)
# 3. 不可修改特性(以下代码会报错)
# tup1[0] = 'c' # TypeError: 'tuple' object does not support item assignment
# 4. 常用操作
print(len(tup1)) # 长度 → 3
print(tup1 + tup2) # 连接 → ('a','b',123,1,2,3)
print(tup2 * 2) # 重复 → (1,2,3,1,2,3)
print(1 in tup2) # 成员判断 → True
1.3集合(Set)- 无序去重
定义:用{}或set()创建,元素唯一、无序,不可存可变类型;
核心特性:自动去重、支持集合运算(交集、并集、差集);
常用场景:数据去重、关系判断(如共同好友、数据筛选)。
# 1. 集合创建
set1 = {'张轩', '李岚', '王晨'}
set2 = set([1, 2, 2, 3]) # 自动去重 → {1,2,3}
set3 = set() # 空集合(不可用{},{}是空字典)
# 2. 增删操作
set1.add('刘峰') # 添加元素 → {'张轩','李岚','王晨','刘峰'}
set1.remove('李岚') # 删除元素(不存在报错)
set1.discard('赵钢') # 删除元素(不存在不报错)
set1.pop() # 随机删除一个元素
# 3. 集合运算
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a & b) # 交集 → {3,4}
print(a | b) # 并集 → {1,2,3,4,5,6}
print(a - b) # 差集(a有b无)→ {1,2}
print(a ^ b) # 对称差集(互不包含)→ {1,2,5,6}
# 4. 实战:数据去重与排序
import random
nums = set()
for _ in range(10):
nums.add(random.randint(1, 100)) # 生成10个1-100的随机数(自动去重)
print(sorted(nums, reverse=True)) # 降序排序 → [98, 76, ...]
1.4字典(Dict)- 键值对映射
定义:用{key:value}创建,键唯一且不可变(如字符串、数字、元组),值可任意;
核心特性:无序(Python3.7 + 有序)、查询效率高,支持键值对增删改查;
常用场景:存储关联数据(如学生信息、配置参数)。
# 1. 字典创建
stu = {'id': 1001, 'name': '张轩', 'score': 92}
stu2 = dict(id=1002, name='李岚', score=87) # 用dict()创建
stu3 = {i: i*2 for i in range(3)} # 字典推导式 → {0:0,1:2,2:4}
# 2. 增删改查
stu['age'] = 19 # 添加键值对 → {'id':1001,...,'age':19}
stu['score'] = 95 # 修改值 → score=95
print(stu.get('address', '未知')) # 安全获取(不存在返回默认值)→ '未知'
stu.pop('age') # 删除键值对 → 返回19
del stu2['id'] # 删除键值对
# 3. 遍历操作
for key in stu.keys():
print(key) # 遍历键 → id, name, score
for value in stu.values():
print(value) # 遍历值 → 1001, 张轩, 95
for k, v in stu.items():
print(f'{k}:{v}') # 遍历键值对 → id:1001, ...
# 4. 字典拼接(Python3.9+支持|运算符)
d1 = {'a':1, 'b':2}
d2 = {'c':3, 'd':4}
d3 = d1 | d2 # → {'a':1,'b':2,'c':3,'d':4}
1.5迭代器与生成器
迭代器:实现__iter__()和__next__()的对象,支持next()遍历,耗尽抛StopIteration;
生成器:用()或yield创建,延迟生成数据,节省内存;
常用场景:大批量数据处理、循环遍历优化。
# 1. 迭代器
list_iter = iter([1, 2, 3])
print(next(list_iter)) # → 1
print(next(list_iter)) # → 2
print(next(list_iter)) # → 3
# print(next(list_iter)) # StopIteration
# 2. 生成器表达式
gen1 = (x*x for x in range(5)) # 括号替换列表推导式的中括号
for num in gen1:
print(num) # → 0,1,4,9,16
# 3. 生成器函数(含yield)
def fibonacci(n):
a, b = 0, 1
count = 0
while count < n:
yield a # 暂停并返回值
a, b = b, a + b
count += 1
fib = fibonacci(5)
for num in fib:
print(num) # → 0,1,1,2,3

2.文件操作
文件操作是数据持久化的核心,支持文本文件、二进制文件及 CSV 格式文件的读写。
2.1普通文件操作
打开模式:r(只读)、w(覆盖写)、a(追加写)、r+(读写)、b(二进制模式);
核心流程:打开文件 → 读写操作 → 关闭文件(推荐用with语句自动关闭);
常用方法:read()(读全部)、readline()(读一行)、readlines()(读所有行)、write()(写内容)。
2.2 CSV 文件操作
CSV:逗号分隔的文本文件,用于存储表格数据(如学生成绩、统计数据);
核心模块:csv,支持reader(按行读)、writer(按行写)、DictReader/DictWriter(按字典读写);
常用场景:数据导入导出、表格数据处理。
#普通文件操作
# 1. 基本读写(with语句自动关闭文件)
with open('test.txt', 'w', encoding='utf-8') as f:
f.write('河南大学\nPython开发与应用') # 写内容(需手动加换行符)
with open('test.txt', 'r', encoding='utf-8') as f:
print(f.read()) # 读全部内容
# print(f.readline()) # 读一行
# print(f.readlines()) # 读所有行(返回列表)
# 2. 二进制文件操作(如图片、视频)
with open('image.jpg', 'rb') as f:
data = f.read() # 读二进制数据
with open('image_copy.jpg', 'wb') as f:
f.write(data) # 写二进制数据
# 3. 文件定位
with open('test.txt', 'r', encoding='utf-8') as f:
f.read(5) # 读5个字节
print(f.tell()) # 获取当前指针位置 → 5
f.seek(0) # 指针回到文件开头
print(f.readline()) # 重新读第一行 → '河南大学'
# 4. 实战:文件内容替换
with open('test1.txt', 'r', encoding='utf-8') as f1, open('test2.txt', 'w', encoding='utf-8') as f2:
for line in f1:
f2.write(line.replace('Python', 'Python编程')) # 替换内容并写入新文件
#CSV 文件操作
import csv
# 1. 写入CSV文件
data = [
['学号', '姓名', '平时成绩', '期末成绩'],
['1445204009', '王召', 100, 90],
['1445204013', '林锦', 95, 67]
]
with open('StudentInfo.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(data[0]) # 写表头
writer.writerows(data[1:]) # 写多行数据
# 2. 读取CSV文件(按行读)
with open('StudentInfo.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row) # → ['学号','姓名','平时成绩','期末成绩'], ...
# 3. 按字典读写CSV(更直观)
with open('StudentInfo.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f) # 以表头为键
for row in reader:
print(row['姓名'], row['期末成绩']) # → 王召 90, 林锦 67
# 4. 追加数据到CSV
new_row = ['1445204017', '杜静静', 93, 94]
with open('StudentInfo.csv', 'a', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(new_row)
3.异常处理
异常:程序运行时的错误(如文件不存在、除零错误),未处理会导致程序终止;
处理语句:try-except(捕获异常)、else(无异常执行)、finally(无论是否异常都执行);
自定义异常:继承Exception类,用raise抛出。
# 1. 基本异常处理
try:
num = int(input('请输入数字:'))
result = 10 / num
except ValueError:
print('输入不是有效数字!')
except ZeroDivisionError:
print('除数不能为0!')
except Exception as e:
print(f'未知异常:{e}')
else:
print(f'结果:{result}') # 无异常时执行
finally:
print('程序执行完毕!') # 必执行
# 2. 自定义异常
class IDError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
try:
sid = input('请输入学号:')
if len(sid) != 10:
raise IDError('学号长度必须为10位!') # 抛出自定义异常
except IDError as e:
print(e) # → 学号长度必须为10位!
# 3. 文件操作异常处理(实战)
try:
with open('nonexistent.txt', 'r', encoding='utf-8') as f:
content = f.read()
except FileNotFoundError as e:
print(f'文件不存在:{e}')
except IOError as e:
print(f'文件读写错误:{e}')

4.数据库操作(MySQL)
核心库:pymysql(Python3 连接 MySQL 的库);
操作流程:连接数据库 → 创建游标 → 执行 SQL → 提交事务 / 回滚 → 关闭连接;
常用操作:创建表、增删改查、CSV 数据导入导出。
import pymysql
import csv
# 1. 连接数据库(需先安装pymysql:pip install pymysql)
config = {
'host': 'localhost',
'port': 3306,
'user': 'root',
'password': '123456',
'db': 'student',
'charset': 'utf8mb4'
}
db = pymysql.connect(**config)
cursor = db.cursor() # 创建游标
# 2. 创建表
create_sql = """
CREATE TABLE IF NOT EXISTS stuTest (
学号 VARCHAR(10) PRIMARY KEY,
姓名 VARCHAR(20) NOT NULL,
平时成绩 INT,
期末成绩 INT
) DEFAULT CHARSET=utf8;
"""
cursor.execute(create_sql)
db.commit() # 提交事务
# 3. 插入数据
insert_sql = """
INSERT INTO stuTest (学号, 姓名, 平时成绩, 期末成绩)
VALUES ('1445204009', '王召', 100, 90),
('1445204013', '林锦', 95, 67);
"""
try:
cursor.execute(insert_sql)
db.commit()
print('插入成功!')
except Exception as e:
db.rollback() # 出错回滚
print(f'插入失败:{e}')
# 4. 查询数据
select_sql = "SELECT * FROM stuTest;"
cursor.execute(select_sql)
results = cursor.fetchall() # 获取所有结果
for row in results:
print(f'学号:{row[0]}, 姓名:{row[1]}, 总分:{row[2]+row[3]}')
# 5. 更新与删除数据
update_sql = "UPDATE stuTest SET 平时成绩=99 WHERE 学号='1445204009';"
cursor.execute(update_sql)
db.commit()
delete_sql = "DELETE FROM stuTest WHERE 学号='1445204013';"
cursor.execute(delete_sql)
db.commit()
# 6. CSV数据导入数据库
with open('StudentInfo.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
insert_sql = f"""
INSERT INTO stuTest (学号, 姓名, 平时成绩, 期末成绩)
VALUES ('{row['学号']}', '{row['姓名']}', {row['平时成绩']}, {row['期末成绩']});
"""
try:
cursor.execute(insert_sql)
db.commit()
except Exception as e:
db.rollback()
print(f'导入失败:{e}')
# 7. 关闭连接
cursor.close()
db.close()
&spm=1001.2101.3001.5002&articleId=149120677&d=1&t=3&u=63b7686f667f4544b7bb03c420ff7436)
2万+

被折叠的 条评论
为什么被折叠?



