Python基础(最详细,适合复习)

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

一、Python基础语法应用

(1)在Python中,不需要事先声明变量名及其类型,直接赋值即可创建各种类型的对象变量。
不仅变量的值可以变化,变量的类型也可以随时改变,Python解释器会根据赋值或运算来自动推断变量类型。
(2)在Python中,不需要事先声明变量名及其类型,直接赋值即可创建各种类型的对象变量。在Python中,不仅变量的值可以变化,变量的类型也可以随时改变,Python解释器会根据赋值或运算来自动推断变量类型。
(3)python的数字类型转换相关的函数:
int()、float()、complex()、bool(),括号内的变量是需要转换的数据,函数名称是转换后的数字类型。
(4)其他的内置转换函数:
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'>
(5)数学函数math
(6)运算符
幂:使两个操作数进行幂运算,获取a的b次幂,例如a=2,b=8,a**b,结果为256
位运算符:

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)

如果是把dates写成date,会导致句法错误。

三、函数

(1)高阶函数。

简单来说,是指把函数作为参数的一种函数。

在 Python 中,高阶函数(Higher-order Function) 是指满足以下任一条件的函数:

  1. 接受一个或多个函数作为参数
  2. 返回一个函数

这种设计模式让函数可以像普通数据(如整数、字符串)一样被传递和操作,是函数式编程的核心特性。

#一.接受函数作为参数的高阶函数

#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)进行计算。

闭包的主要特点有:

  1. 捕获外部变量:闭包能够记住外部函数中的变量,即便外部函数已经执行完毕。
  2. 保持状态:闭包可以保留其创建时的状态,多次调用闭包时,会使用相同的外部变量。
  3. 延迟执行:闭包在被调用时才会执行,执行时使用的是捕获的变量值。

闭包在实际中有很多用途,比如实现装饰器、创建函数工厂、实现私有数据等。下面再看一个使用闭包实现计数器的例子:

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()

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值