Mooreの小站

Moore的个人小站

Python 第一节

2025-03-23

课程安排

  • 核心基础:变量、数据类型、条件判断、循环、函数

  • OpenCV:机器视觉、图形图像处理、图片加密

  • 面向对象

  • 文件IO

  • 网络爬虫

  • numpy

  • PyQt:图像界面

一、安装软件和配置环境变量

(一)为什么要安装miniconda3?

  • 由于不同项目需要不同的版本的开发语言环境,为了让软件管理多个Python版本,然后可以同时启动多个和不同版本的项目。

(二)conda使用命令

  1. 创建环境

conda create --name envName python=3.9
  1. 查看目前已安装好的环境

conda env list

(三)解释器和编译器

  • 解释器→解释型语言:逐行解释逐行运行→性能会弱一些

  • 编译器→编译型语言:代码文件都需要进行编译→才能去运行

(四)运行程序

  • Python.exe 解释器

二、Python核心基础

(一)如何声明变量

  • 变量名 = 值 age = 2

(二)标识符

  • 程序员自己取的名字(为变量、函数、类取的名字)

命名规则

1、不能使用关键字

  • 如何查看系统自带的关键字有哪些?

import keyword
print(keyword.kwlist)

2、不能以数字开头

  • 只能下划线或者字母开头,后面跟任意字母、数字、下划线均可

  • 命名规范不遵守可以,但是推荐要遵守

username

驼峰式命名:UserName(大驼峰,类名),userName

蛇形命名:user_name(变量,方法名)

(三)数据类型

1、整数

  • 变量名 = 数字 example = 1

2、字符串

(1)声明

  • 可以使用单引号,也可以使用双引号 example = 'text' example = "text"

(2)使用(打印)

  • 字符串拼接→使用加号,只能拼接字符串

  • 使用模版字符f("xxxx{yyyy}xxx") {}里面除了可以写变量以外,也可以写一些表达式

  • 打印字符串中的某个字符→通过索引(下标),索引从0开始;可以从左边开始访问也可以从右边开始访问

(3)切片

  • string='abcdefgh'

  • string[x:y:z] → x 起始位置,y 结束位置,z 步长

(4)运算

  • +号代表拼接 *号代表复制多个(也是一种拼接)

(5)长度

  • len(example)

3、列表

  • 长度可变的序列(内容可变)

(1)声明

  • 通过中括号进行声明 example = [1, 2, 3, 4, 5]

(2)添加

  • append() 只能一个一个添加

(3)访问

  • 通过下标进行访问,但需注意不要越界

  • 列表中的元素是可以修改的,可以重新赋值

(4)删除

pop()
  • 可传递参数,这个参数指的是要删除哪个元素的下标

  • 不传参数,则删除的是列表的最后一个

  • 如果列表为空,则会报错

remove()
  • 根据值来删除元素,这个参数必填,否则报错

(5)查找

  • x in y → True、False

  • x.index(y) → y在x中的下标

(6)最大最小

  • max(example) min(example)

(7)排序

排序算法→冒泡排序、选择排序等

  • sort() 内置的

    • 不带参sort()默认升序排列

    • 带参数sort(reverse=True)降序排列

列表,元组,切片?

4、集合

  1. 通过至少带一个元素值的大括号进行声明 example = { "test" }

  2. 但在声明时只有一个空的大括号会默认为你声明一个字典

  3. 如果要声明一个空集合需使用set()方法进行声明

  4. 元素是一个无序的容器,里面的元素不会重复

  5. 添加元素add(),一个一个添加

  6. 删除元素pop()默认删除第一个,remove(element)删除指定元素

  7. 清空集合clear()

  8. 获取长度len()

  9. 不能访问集合里的某个元素,可以遍历集合

  10. 扩展:取交集,连接集合

5、元组

  • 通过小括号进行声明 example = (1,)

  • 注意:

    • 如果你的元组只有一个元素,元素后必须加逗号声明这是一个元组,否则忽略括号

    • 元组内部元素不允许修改

6、字典

  1. 通过大括号进行声明 example = { test1: "test1", test2: 2, test3: True }

  2. 是以key: value键值对的形式进行储存的

  3. 字典里面的数据的访问是通过键名进行访问的xxx['yyy']

  4. 可以修改字典里面某个键名对应的值

  5. 可以往字典里面添加新的键值对

  6. 如果键名存在则为修改,不存在则为添加 xxx['yyy'] = zzzz

  7. 字典在声明时键名可以重复,但值会被靠后的覆盖

  8. 字典中可以先取出所有的keyxxx.keys(),然后遍历key,通过每个key去取出对应的值

  9. 删除字典中的某个键值对pop(yyy)

  10. 清空字典中的所有键值对clear()

7、布尔

  • True False

查看数据类型:type(example)

注意Python中的变量不能先声明后赋值,因为Python的变量的变量类型需要由赋给他的值决定

(四)数据类型转换

1、隐式转换

2、显示转换

  • 转 数字:int()

  • 转 字符串: str()

  • 转 小数:float()

(五)条件判断

if需注意语法格式

(六)运算符

  • 逻辑运算符:与and,或or,非not

  • 算符运算符:+,-,*,/,//(整除),%(取余)

  • 比较运算符:>,<,>=,<=

  • 赋值运算符:=,+=,-=,*=,/=

  • 位运算符:(二进制)

    • 按位与(相同为1,不同为0)

    • 按位或(有1的就是1,否则就是0)

    • 按位异或(相同为0,不同为0)

  • 成员运算符 in,not in

(七)循环

for while

(八)函数

  • 为了简化代码,减少代码冗余,优化代码层次结构

  • 函数的定义:def

  • 函数名

  • 参数

    • 形参:函数声明的时候传递的参数,不知道具体值;实参:函数调用的时候传递的参数,可以知道具体值

    • 可以有默认值,在声明的时候用“=”赋值,但如果第一个参数赋了默认值,后续参数均需赋默认值

    • 函数调用时不想传递所有参数,要指定某个参数进行赋值,那就带上参数名=值

  • 返回值:可为多个

三、OpenCV

  • 图形图像处理库

(一)安装

pip install opencv-python opencv-contrib-python

(二)功能

1、打开某张图片

  • cv2.imread(filename, flags)

    • filename 图片路径(相对路径)

    • flags 以什么方式打开图片(0→灰度,1→BGR,-1→?)

2、对图片做一下处理

  • 颜色空间转换,调整尺寸

  • 颜色空间:GRAY RGB BGR CMYK HSV HSB ......

  • 颜色空间转换:cv2.cvtColor(src, code)

    • src 要转换的图片

    • code 要转换的颜色空间代码

3、保存图片

  • cv2.imwrite(filename, img)

    • filename 保存的路径

    • img 要保存的图片

4、在图片上绘制矩形框

  • cv2.rectangle(img, pt1, pt2, color, thickness)

    • img 目标图片

    • pt1 矩形左上角坐标

    • pt2 矩形又小脚坐标

    • color 矩形颜色

    • thickness 矩形粗细程度

5、图片加密解密

(1)解决方案一:异或

  1. 原图→元组数据→总共有多少条数据→有几行几列

  2. 加密的密钥:key

  3. 原图和key进行异或→加密后的数据

    1. 读取原图

    2. 创建随机的key

    3. 获取原图的尺寸(几行几列)→填充这个尺寸

    4. 设置随机key的范围是0,255

    5. 原图与key进行异或

(2)解决方案二:AES

  • 扩展......

四、课后复习

(一)学生管理系统

  • 可以新建、显示、查询学员信息以及退出系统

  • 提示:输入input()

students = []

def show_menu():
    """显示菜单"""
    print("\n" + "*" * 40)
    print("欢迎使用[学生管理系统]V1.0\n")
    print("1. 新建学员信息")
    print("2. 显示学员信息")
    print("3. 查询学员信息")
    print("0. 退出系统")
    print("\n" + "*" * 40)

def add_student():
    """新建学员信息"""
    print("\n您选择的功能是: 1")
    print("功能: 新建学员信息")

    name = input("请输入姓名: ").strip()
    phone = input("请输入电话: ").strip()
    email = input("请输入邮箱: ").strip()

    student = {
        "name": name,
        "phone": phone,
        "email": email
    }

    students.append(student)
    print(f"\n学员 {name} 信息添加成功!")

def show_students():
    """显示所有学员信息"""
    print("\n您选择的功能是: 2")
    print("功能提示: 显示所有学员信息\n")
    print("-" * 40)

    if not students:
        print("当前没有学员信息")
        return

    for student in students:
        print(f"姓名:{student['name']}--电话:{student['phone']}--邮箱:{student['email']}")

def search_student():
    """模糊查询学员信息"""
    print("\n您选择的功能是: 3")
    keyword = input("请输入要查询的姓名关键字: ").strip().lower()

    found = []
    for student in students:
        if keyword in student["name"].lower():
            found.append(student)

    print("\n" + "-" * 40)
    if not found:
        print(f"未找到包含 '{keyword}' 的学员")
    else:
        print(f"找到 {len(found)} 条匹配结果:")
        for student in found:
            print(f"姓名:{student['name']}--电话:{student['phone']}--邮箱:{student['email']}")

def main():
    while True:
        show_menu()
        try:
            choice = input("\n请输入执行的操作: ").strip()

            if choice == "1":
                add_student()
            elif choice == "2":
                show_students()
            elif choice == "3":
                search_student()
            elif choice == "0":
                print("\n感谢使用学生管理系统,再见!")
                break
            else:
                print("\n输入错误,请重新输入0-3之间的数字!")

        except Exception as e:
            print(f"\n操作出现错误: {str(e)}")

if __name__ == "__main__":
    main()

(二)对图片进行部分加密

  • 提示:区域截取、切片、替换

import cv2
import numpy

# 读取原始图像
original_img = cv2.imread('images/face.png')
# 创建一个与原始图像大小相同的黑色掩码
mask = numpy.zeros_like(original_img)
# 定义矩形的坐标
top_left = (150, 150)
bottom_right = (300, 250)
# 在掩码上绘制白色矩形
cv2.rectangle(mask, top_left, bottom_right, (255, 255, 255), -1)  # -1 表示填充矩形
# 生成随机密钥
r, c, channels = original_img.shape
key = numpy.random.randint(0, 256, size=(r, c, channels), dtype=numpy.uint8)
# 对原始图像进行加密
encryption_img = cv2.bitwise_xor(original_img, key)
# 将加密后的图像与掩码结合,只保留矩形区域
encrypted_region = cv2.bitwise_and(encryption_img, mask)
# 将原始图像与掩码的反结合,保留矩形区域以外的部分
original_region = cv2.bitwise_and(original_img, cv2.bitwise_not(mask))
# 将加密后的矩形区域与原始图像的其余部分合并
final_img = cv2.add(original_region, encrypted_region)
# 显示结果
cv2.imshow('Encrypted Rectangle', final_img)
cv2.waitKey(0)
cv2.destroyAllWindows()