深度学习笔记 Day4 python基础知识系列(仅本人自用)

本文深入探讨Python中字典和集合的创建、操作及核心原理。解析字典的键值对管理,包括访问、添加、修改和删除,以及字典的底层散列表结构。同时,介绍了集合的特性和相关操作,如并集、交集和差集。

字典

字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含:“键对象”和“值对象”。可以通过“键对象”实现快速获取、删除、更新对应的“值对象”。
列表中我们通过“下标数字”找到对应的对象。字典中通过“键对象”找到对应的“值对象”。“键”是任意的不可变数据,比如:整数、浮点数、字符串、元组。但是:列表、字典、集合这些可变对象,不能作为“键”。并且“键”不可重复。
“值”可以是任意的数据,并且可重复。
一个典型的字典的定义方式:
a={‘name’:xiaoxin’,‘age’:‘18}
字典的创建
1.我们可以通过{}、dict()来创建字典对象。
a={‘name’:xiaoxin’,‘age’:‘18’}
a=dict(name=‘xiaoxin’,age=18)
a=dict([(“name”,“xiaoxin”),(“age”,“5”)])
2.通过zip()创建字典对象
k=[‘name’,‘age’]
v=[‘xiaoxin’,‘5’]
d=dict(zip(k,v))
3.通过fromkeys创建值为空的字典
a=dict.fromkeys(‘mane’,‘age’)

1.字典元素的访问

1.通过[键]获得“值”。若键不存在,则抛出异常。
在这里插入图片描述
运行结果
在这里插入图片描述

2.通过get()方法获得“值”,推荐使用
优点是:指定键不存在,返回None;也可以设定指定键不存在时默认返回的对象。
在这里插入图片描述
运行结果
在这里插入图片描述

3.列出所有的键值对
items()
在这里插入图片描述
运行结果
在这里插入图片描述

4.列出所有的键,列出所有的值
列出键:key()
列出值:values()

5.len()键值对的个数

6.检测一个“键”是否在字典中(不是值)
in操作符
“name” in a

2.字典元素添加、修改、删除

1.给字典新增“键值对”。如果“键”已经存在,则覆盖旧的键值对;如果“键”不存在,则新增“键值对”。
在这里插入图片描述
运行结果
在这里插入图片描述

2.使用update()将新字典中所有键值对全部添加到旧字典对象上。如果key有重复,则直接覆盖。
a.update(b) 用b覆盖a

3.字典中元素的删除
1).del()
2).clear()删除所有键值对;
3).pop()删除指定键值对,并返回对应的“值对象”;
在这里插入图片描述
运行结果
在这里插入图片描述

4.popitem():随机删除和返回该键值对。字典是“无序可变序列”,因此没有第一个元素、最后一个元素的概念;
popitem弹出随机的项,因为字典并没有“最后的元素“或者其他有关顺序的概念。若想一个接一个地移除并处理项,这个方法就非常有效(因为不用首先获取键的列表)。
在这里插入图片描述
运行结果
在这里插入图片描述

序列解包

序列解包可以用于元组、列表、字典。
序列解包可以让我们方便的对多个变量赋值
序列解包用于字典时,默认是对“键”进行操作;
如果需要对键值对操作,则需要使用items();
如果需要对“值”进行操作,则需要使用values();
在这里插入图片描述
运行结果
在这里插入图片描述

字典核心底层原理(重要)

字典对象的核心是散列表。散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做bucket。每个bucket 有两部分:一个是键对象的引用,一个是值对象的引用。
由于,所有bucket结构和大小一致,我们可以通过偏移量来读取指定bucket。在这里插入图片描述
(详情见文档)

集合

是无序可变,元素不能重复,
集合底层是字典实现,集合的所有元素都是字典中的“键对象",因此是不能重复的且唯一的。

集合创建和删除

1.使用{}创建集合对象,并使用add()方法添加元素.
a={3,5,7}
print(a)
{3,5,7}
a.add(9)
{9,3,5,7}
2.set()
将列表、元组等可迭代对象转成集合。如果原来数据存在重复数据,则只保一个。
a=(1,2,3,4)
b=set(a)
{1,2,3,4}
3.remove()删除指定元素;clear() 清空整个集合.

集合相关操作

Python对集合也提供了并集、交集、差集等运算。
a|b 或者 a.union(b) 并集
a&b 或者a.intersection(b) 交集
a-b 或者a.difference(b) 差集

控制语句

选择结构

选择结构通过判断条件是否成立,来决定执行哪个分支。
选择结构有多种形式,分为:单分双分支多分。
流程图如下:
在这里插入图片描述
在这里插入图片描述

单分支选择结构

if语句单分支结构的语法形式如下:
if 条件表达式:
(4个空格缩进)语句/语句块
其中:
①.条件表达式:可以是逻辑表达式、关系表达式、算术表达式等等。
②.语句/语句块:可以是一条语句,也可以是多条语句。多条语句,缩进必须对齐一致。
条件表达式详解
在选择和循环结构中,条件表达式的值为False的情况如下:
False、0、0.0、空值None、空序列对象(空列表、空元祖、空集合、空字典、空字符串)、空range对象、空迭代对象。
其他情况,均为True。这么看来,Python所有的合法表达式都可以看做条件表达式,甚至包括函数调用的表达式。
在这里插入图片描述
运行结果
在这里插入图片描述
条件表达式中,不能有赋值操作符“="
在Python中,条件表达式不能出现赋值操作符“=”,避免了其他语言中经常误将关系运算符“==”写作赋值运算符“=”带来的困扰。
如下代码将会报语法错误:
if 3<c and(c=20):
print(“赋值符不能出现在条件表达式中")

双分支选择结构

双分支结构的语法格式如下:
if 条件表送式:
语句1/语句块1
else:
语句2/语句块2

三元条件运算符
Python 提供了三元运算符,用来在某些简单双分支赋值情况。
三元条件运算符语法格式如下:
条件为真时的值if(条件表达式)else 条件为假时的值
两种方法比较
在这里插入图片描述
运行结果
在这里插入图片描述

多分支选择结构

多分支选择结构的语法格式如下:
if 条件表达式1:
语句1/ 语句块1
elif 条件表达式2
语句2/语句块2
elif 条件表达式n:
语句n/语句块n
[else:
语句n+1/语句块n+1
]
多分支结构,几个分支之间是有逻辑关系的,不能随意颠倒顺序。

选择结构嵌套

选择结构可以嵌套,使用时一定要注意控制好不同级别代码块的缩进量,因为缩进量决定了代码的从属关系。

循环结构

循环结构用来重复执行一条或多条语句。表达这样的逻辑:如果符合条件,则反复执行循环体里的语句。在每次执行完后都会判断一次条件是否为True,如果为True则重复执行循环体里的语句。
图示如下:
在这里插入图片描述
循环体里面的语句至少应该包含改变条件表达式的语句,以使循环趋于结束;否则,就会变成一个死循环。

while 循环

while循环的语法格式如下:
while条件表达式:
循环体语句

<think>嗯,用户决定使用Web方案来部署一个自用的视频处理工具在自己的笔记本上。首先,我需要确认用户的需求。用户之前已经得到了关于使用Qt或Web的方案建议,现在他们选择了Web,并且是个人自用,部署在本地。这意味着用户可能更倾向于一个轻量级的解决方案,不需要复杂的服务器配置,但需要确保本地运行的稳定性和便捷性。 接下来,我需要考虑用户可能的技术背景。他们可能有一定的Python基础,但对Web开发可能不太熟悉。因此,在步骤分解时需要详细说明每个部分,尤其是前后端的交互和FFmpeg的集成。同时,用户是自用,所以安全性和多用户支持可能不是重点,但需要确保界面友好和操作简便。 用户的需求是实现视频的截取和合并,使用Web界面。因此,项目需要分为前端和后端。前端负责用户界面,上传文件,设置参数;后端处理视频处理任务,调用FFmpeg。需要确保文件上传的路径处理正确,避免文件覆盖或存储混乱。同时,由于是本地部署,需要考虑文件系统的权限和路径问题。 接下来是技术选型。用户已经选择Web方案,所以需要确定前端和后端的具体技术。前端可以选择Vue或React,但考虑到用户可能希望简单快捷,或许使用基本的HTML/CSS/JavaScript加上一些轻量级框架如Bootstrap会更合适。后端使用Flask,因为Python集成方便,且Flask轻量适合小型项目。 然后,环境准备方面,用户需要安装FFmpeg并添加到系统路径,确保Python环境正确,安装必要的依赖如Flask、moviepy等。需要注意的是,虽然用户可能已经安装了FFmpeg,但可能需要确认版本兼容性和路径是否正确,避免运行时出现找不到FFmpeg的错误。 项目结构方面,需要分模块组织代码,例如核心处理模块、前端静态文件、模板、上传目录等。上传目录需要处理临时文件和结果文件,定期清理以避免占用过多磁盘间。同时,错误处理是关键,特别是在调用子进程运行FFmpeg时,需要捕获异常并反馈给前端,避免界面卡死或无响应。 在前后端交互部分,文件上传需要使用表单或者AJAX,后端接收文件并保存到指定目录。处理视频时可能需要异步任务,避免阻塞前端请求。由于是个人使用,可能不需要复杂的任务队列,但需要考虑长时间任务的处理,比如使用线程或Flask的异步支持。 安全方面,虽然是个自用项目,但仍需注意文件上传的安全,限制文件类型,防止恶意文件上传。另外,临时文件的清理机制也很重要,避免积累大量无用文件。 部署方面,用户需要在本地运行Flask应用,可能希望开机自启或方便地启动。可以考虑使用批处理脚本或Docker容器化,但考虑到用户可能希望简单,提供基本的运行指令即可,如flask run命令。 最后,测试和优化。用户需要确保各功能正常,特别是大文件处理和错误情况下的表现。进度反馈可能通过简单的日志或前端提示,不需要复杂的进度条,但需要用户知道处理状态。性能方面,可以考虑多线程处理,但需注意资源竞争和稳定性。 总结来说,用户需要一个结构清晰、步骤详细、易于本地部署的Web方案,重点在于前后端的交互、FFmpeg的调用、错误处理和文件管理。需要避免复杂的配置,确保用户能够顺利运行,并在出现问题时能快速定位和解决。</think>我将为您详细说明基于Web方案的本地部署准备和实现步骤,并提供完整的实现路线图: --- ### **一、准备工作清单** ```mermaid graph LR A[环境准备] --> B[安装FFmpeg] A --> C[Python环境] A --> D[代码编辑器] B --> |验证安装| E[终端执行 ffmpeg -version] C --> |推荐版本| F[Python 3.8+] C --> |安装库| G["pip install flask moviepy python-dotenv"] ``` 1. **必需软件** - FFmpeg:到官网下载编译版并配置环境变量 - Python 3.8+:建议使用虚拟环境(推荐`venv`) - 现代浏览器:Chrome/Firefox最新版 2. **项目依赖** ```bash pip install flask moviepy python-dotenv watchdog ``` --- ### **二、项目实现步骤** #### **步骤1:创建基础项目结构** ``` video-tool/ ├── app.py # Flask主程序 ├── uploads/ # 文件存储目录 │ ├── temp/ # 临时文件 │ └── results/ # 处理结果 ├── static/ # 前端资源 │ ├── css/ │ ├── js/ │ └── lib/ # 第三方库(如jQuery) ├── templates/ # HTML模板 │ ├── index.html │ └── progress.html └── .env # 环境配置 ``` #### **步骤2:编写核心后端(Flask示例)** ```python # app.py from flask import Flask, request, render_template import os from datetime import datetime import subprocess app = Flask(__name__) app.config['UPLOAD_FOLDER'] = 'uploads/temp' app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 * 1024 # 限制1GB @app.route('/') def index(): return render_template('index.html') @app.route('/process', methods=['POST']) def process_video(): # 接收参数 file = request.files['video'] start = request.form['start_time'] duration = request.form['duration'] # 生成唯一文件名 timestamp = datetime.now().strftime("%Y%m%d%H%M%S") input_path = os.path.join(app.config['UPLOAD_FOLDER'], f"input_{timestamp}.mp4") output_path = os.path.join('uploads/results', f"output_{timestamp}.mp4") # 保存上传文件 file.save(input_path) # 调用FFmpeg cmd = [ 'ffmpeg', '-y', # 覆盖已有文件 '-ss', str(start), # 开始时间 '-i', input_path, '-t', str(duration), # 持续时间 '-c:v', 'libx264', # 编码格式 '-preset', 'fast', # 编码速度 output_path ] try: subprocess.run(cmd, check=True, stderr=subprocess.PIPE) return {'status': 'success', 'output': output_path} except subprocess.CalledProcessError as e: return {'status': 'error', 'message': e.stderr.decode()}, 500 ``` #### **步骤3:开发前端界面(HTML示例)** ```html <!-- templates/index.html --> <!DOCTYPE html> <html> <head> <title>视频处理工具</title> <link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.min.css') }}"> </head> <body> <div class="container mt-5"> <h2>视频处理工具</h2> <!-- 文件上传表单 --> <form id="uploadForm" enctype="multipart/form-data"> <div class="mb-3"> <input type="file" class="form-control" name="video" accept="video/*"> </div> <div class="row"> <div class="col"> <input type="number" class="form-control" name="start_time" placeholder="开始时间(秒)"> </div> <div class="col"> <input type="number" class="form-control" name="duration" placeholder="持续时间(秒)"> </div> </div> <button type="submit" class="btn btn-primary mt-3">开始处理</button> </form> <!-- 进度显示区域 --> <div id="progress" class="mt-3" style="display:none;"> <div class="progress"> <div class="progress-bar" style="width: 0%"></div> </div> <p class="text-muted mt-2">处理中...</p> </div> </div> <script src="{{ url_for('static', filename='js/jquery.min.js') }}"></script> <script> // AJAX提交处理请求 $('#uploadForm').submit(function(e) { e.preventDefault(); $('#progress').show(); let formData = new FormData(this); $.ajax({ url: '/process', type: 'POST', data: formData, contentType: false, processData: false, success: function(response) { alert('处理完成!文件路径:' + response.output); }, error: function(xhr) { alert('处理失败:' + xhr.responseJSON.message); }, complete: function() { $('#progress').hide(); } }); }); </script> </body> </html> ``` --- ### **三、关键配置项** 1. **环境变量配置(.env)** ```ini FLASK_ENV=development SECRET_KEY=your_random_string FFMPEG_PATH=/usr/local/bin/ffmpeg # 修改为实际路径 ``` 2. **启动脚本(run.sh)** ```bash #!/bin/bash export FLASK_APP=app.py flask run --host=0.0.0.0 --port=5000 ``` --- ### **四、运行与测试** 1. **启动服务** ```bash chmod +x run.sh ./run.sh ``` 2. **访问地址** - 本地访问:`http://localhost:5000` - 局域网访问:`http://[你的IP地址]:5000` 3. **测试场景** - 上传MP4/MOV格式视频 - 测试分段截取(建议先用小文件测试) - 检查输出文件完整性 --- ### **五、进阶优化建议** 1. **功能增强** - 添加视频预览功能(用`ffmpeg -i input.mp4 -vframes 1 thumbnail.jpg`生成缩略图) - 支持批量操作(使用`concurrent.futures.ThreadPoolExecutor`实现并发) 2. **稳定性提升** ```python # 添加文件清理任务 import schedule import time def clean_temp_files(): # 删除超过24小时的临时文件 pass schedule.every().day.at("03:00").do(clean_temp_files) # 在单独线程运行定时任务 import threading threading.Thread(target=lambda: schedule.run_continuously()).start() ``` 3. **部署便捷化** - 使用`pyinstaller`打包成可执行文件 - 编写Windows服务脚本(实现开机自启) --- ### **六、常见问题解决方案** 1. **FFmpeg路径问题** - Windows:检查环境变量是否包含`ffmpeg/bin`目录 - Mac/Linux:使用`which ffmpeg`验证安装位置 2. **大文件上传失败** - 修改Flask配置:`app.config['MAX_CONTENT_LENGTH'] = 3 * 1024 * 1024 * 1024`(3GB) 3. **浏览器兼容性问题** - 使用Fetch API替代jQuery AJAX - 添加Polyfill支持旧版浏览器 --- 选择Web方案的优势在于可以随时通过手机/平板访问服务(需在同一局域网),后续扩展远程访问功能也更为方便。建议先从基础版本开始实现,逐步添加功能模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值