简述
理解 Python 程序设计思维,掌握扩展 Python 编程的基本方法,掌握 os 库,能够安装 Python 第三方库。
课件
导学
前课复习
.mp4%22%2C%22size%22%3A72953226%2C%22taskId%22%3A%22u8d90076d-7a32-489e-a429-98b76e9b061%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483280159-a4cf8c16-cff3-42f8-b722-847e791b3876.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22khq56%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#khq56)
本课概要
.mp4%22%2C%22size%22%3A19059147%2C%22taskId%22%3A%22u30ca86ad-c82a-4dd9-b69b-516135e46f9%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483280168-84f5252e-8026-4c3c-8476-72d76e6e531f.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22vjI2I%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#vjI2I)
实例 13: 体育竞技分析
问题分析
.mp4%22%2C%22size%22%3A63153753%2C%22taskId%22%3A%22u5cbec5b2-09f1-4ed2-9cba-94f5da4d79d%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483287944-75314817-5d81-4b6b-b333-5ab1cd51d944.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22hzevU%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#hzevU)
自顶向下和自底向上
.mp4%22%2C%22size%22%3A56289572%2C%22taskId%22%3A%22u973ce64e-d3d9-4eeb-9a43-12461a5627f%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483287945-eef2baed-415a-4b52-80e6-34940923ee51.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22laWml%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#laWml) 自顶向下(设计)
- 将一个总问题表达为若干个小问题组成的形式
- 使用同样方法进一步分解小问题
- 直至,小问题可以用计算机简单明了的解决
自底向上(执行)
- 分单元测试,逐步组装
- 按照自顶向下相反的路径操作
- 直至,系统各部分以组装的思路都经过测试和验证
实例讲解
.mp4%22%2C%22size%22%3A247105647%2C%22taskId%22%3A%22u5ec85642-2dea-4e9a-a64a-e8a50e6b115%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483287946-89a16c79-f6f1-4fe2-a07f-7c71478bba42.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22nTKdj%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#nTKdj) 程序总体框架及步骤
- 步骤1:打印程序的介绍性信息
printInfo()
- 步骤2:获得程序运行参数:proA, proB, n
getInputs()
- 步骤3:利用球员 A 和 B 的能力值,模拟n局比赛
simNGames()
- 步骤4:输出球员 A 和 B 获胜比赛的场次及概率
printSummary()
def main():
printIntro()
probA, probB, n = getInputs()
winsA, winsB = simNGames(n, probA, probB)
printSummary(winsA, winsB)
def printIntro():
print("这个程序模拟两个选手A和B的某种竞技比赛")
print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
def getInputs():
a = eval(input("请输入选手A的能力值(0-1): "))
b = eval(input("请输入选手B的能力值(0-1): "))
n = eval(input("模拟比赛的场次: "))
return a, b, n
def printSummary(winsA, winsB):
n = winsA + winsB
print("竞技分析开始,共模拟{}场比赛".format(n))
print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA / n))
print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB / n))
def simNGames(n, probA, probB):
winsA, winsB = 0, 0
for i in range(n):
scoreA, scoreB = simOneGame(probA, probB)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA, winsB
def simOneGame(probA, probB):
scoreA, scoreB = 0, 0
serving = "A"
while not gameOver(scoreA, scoreB):
if serving == "A":
if random() < probA:
scoreA += 1
else:
serving = "B"
else:
if random() < probB:
scoreB += 1
else:
serving = "A"
return scoreA, scoreB
def gameOver(a, b):
return a == 15 or b == 15
from random import random
def printIntro():
print("这个程序模拟两个选手A和B的某种竞技比赛")
print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
def getInputs():
a = eval(input("请输入选手A的能力值(0-1): "))
b = eval(input("请输入选手B的能力值(0-1): "))
n = eval(input("模拟比赛的场次: "))
return a, b, n
def simNGames(n, probA, probB):
winsA, winsB = 0, 0
for i in range(n):
scoreA, scoreB = simOneGame(probA, probB)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA, winsB
def gameOver(a, b):
return a == 15 or b == 15
def simOneGame(probA, probB):
scoreA, scoreB = 0, 0
serving = "A"
while not gameOver(scoreA, scoreB):
if serving == "A":
if random() < probA:
scoreA += 1
else:
serving = "B"
else:
if random() < probB:
scoreB += 1
else:
serving = "A"
return scoreA, scoreB
def printSummary(winsA, winsB):
n = winsA + winsB
print("竞技分析开始,共模拟{}场比赛".format(n))
print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA / n))
print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB / n))
def main():
printIntro()
probA, probB, n = getInputs()
winsA, winsB = simNGames(n, probA, probB)
printSummary(winsA, winsB)
main()
"""
这个程序模拟两个选手A和B的某种竞技比赛
程序运行需要A和B的能力值(以0到1之间的小数表示)
请输入选手A的能力值(0-1): 0.45
请输入选手B的能力值(0-1): 0.50
模拟比赛的场次: 1000
竞技分析开始,共模拟1000场比赛
选手A获胜361场比赛,占比36.1%
选手B获胜639场比赛,占比63.9%
"""
举一反三
.mp4%22%2C%22size%22%3A37865810%2C%22taskId%22%3A%22ud984935f-df94-40ff-9d6c-70cad28637b%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483287973-684b142e-3a45-4495-8de1-bbd5d4c3bde4.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22ISiV9%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#ISiV9) 理解自顶向下和自底向上
- 理解自顶向下的设计思维:分而治之
- 理解自底向上的执行思维:模块化集成
- 自顶向下是“系统”思维的简化
应用问题的扩展
- 扩展比赛参数,增加对更多能力对比情况的判断
- 扩展比赛设计,增加对真实比赛结果的预测
- 扩展分析逻辑,反向推理,用胜率推算能力?
Python 程序设计思维
单元开篇
.mp4%22%2C%22size%22%3A9890401%2C%22taskId%22%3A%22u633f81a8-ac22-46d3-bf4b-ebb151fb770%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483294542-b31107d3-39d6-486b-8333-43687614e53c.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22CaXhx%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#CaXhx)
计算思维与程序设计
.mp4%22%2C%22size%22%3A183727095%2C%22taskId%22%3A%22u67bd82e4-4287-486d-9a6b-f289f6e0db9%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483304566-6ad46cee-fcf8-4a01-9499-c4b84a1a7f1d.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22qYbT4%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#qYbT4) 计算思维:第 3 种人类思维特征之一
- 逻辑思维:推理和演绎,数学为代表,
A -> B
B -> C
A -> C
- 实证思维:实验和验证,物理为代表,
引力波 <- 实验
- 计算思维:设计和构造,计算机为代表,汉诺塔递归
计算思维:
- 抽象问题的计算过程,利用计算机自动化求解
- 计算思维基于计算机强大的算力及海量数据
- 抽象计算过程,关注设计和构造,而非因果
- 以计算机程序设计为实现的主要手段
- 编程是将计算思维变成现实的手段
抽象和自动化
- 计算思维:Computational Thinking
- 抽象问题的计算过程,利用计算机自动化求解
- 计算思维是基于计算机的思维方式
计数求和:计算 1-100
的计数和
逻辑思维:数学家高斯的玩儿法
s = 0
for i in range(1, 101):
s += i
圆周率的计算
逻辑思维:
计算思维:
汉诺塔问题
逻辑思维:
计算思维:
计算生态与 Python 语言
.mp4%22%2C%22size%22%3A224643983%2C%22taskId%22%3A%22u387a8353-082c-41b6-93d3-fb9376de37a%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483307078-b1883fe2-4302-4b33-bcce-7be29a03677c.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22Qp55T%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#Qp55T) 计算生态
- 从开源运动说起……(见视频)
- 开源思想深入演化和发展,形成了计算生态
- 计算生态以开源项目为组织形式,充分利 用“共识原则”和“社会利他”组织人员,在竞争发展、相互依存和迅速更迭中完成信息技术的更新换代,形成了技术的自我演化路径。
- 没有顶层设计、以功能为单位、具备三个特点
- 竞争发展
- 相互依存
- 迅速更迭
Python 语言的计算生态
- 以开源项目为代表的大量第三方库:
- Python 语言提供 > 15 万个第三方库
- https://pypi.org/ 一个集中存储和分发 Python 软件包的仓库,根据目前 23 年 截图来看,数量约 47w:
- 库的建设经过野蛮生长和自然选择,同一个功能,Python 语言存在 2 个以上第三方库
- 库之间相互关联使用,依存发展,Python 库间广泛联系,逐级封装
- 社区庞大,新技术更迭迅速,AlphaGo 深度学习算法采用 Python 语言开源
计算生态的价值:创新
跟随创新、集成创新、原始创新
- 加速科技类应用创新的重要支撑
- 发展科技产品商业价值的重要模式
- 国家科技体系安全和稳固的基础
计算生态的运用:刀耕火种 -> 站在巨人的肩膀上
- 编程的起点不是算法而是系统
- 编程如同搭积木,利用计算生态为主要模式
- 编程的目标是快速解决问题
优质计算生态:https://python123.io/index/py_env
用户体验与软件产品
.mp4%22%2C%22size%22%3A54416737%2C%22taskId%22%3A%22u29e4c4c9-6ce4-4562-9895-40852f44d0a%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483312279-d2438a52-2e7d-4276-86d1-bd3f50122b00.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22lC9Or%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#lC9Or) 用户体验 是从“软件程序”到“软件产品”的关键环节
实现功能 -> 关注体验
- 用户体验指用户对产品建立的主观感受和认识
- 关心功能实现,更要关心用户体验,才能做出好产品
- 编程只是手段,不是目的,程序最终为人类服务
方法1:进度展示
- 如果程序需要计算时间,可能产生等待,请增加进度展示
- 如果程序有若干步骤,需要提示用户,请增加进度展示
- 如果程序可能存在大量次数的循环,请增加进度展示
方法2:异常处理
- 当获得用户输入,对合规性需要检查,需要异常处理
- 当读写文件时,对结果进行判断,需要异常处理
- 当进行输入输出时,对运算结果进行判断,需要异常处理
其他类方法
- 打印输出:特定位置,输出程序运行的过程信息
- 日志文件:对程序异常及用户使用进行定期记录
- 帮助信息:给用户多种方式提供帮助信息
基本的程序设计模式
.mp4%22%2C%22size%22%3A103228788%2C%22taskId%22%3A%22u5cee4236-bc49-4bdf-b8d7-f46153b4da7%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483314896-140b2f00-195a-4b86-860c-871e1b26c378.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22KCGXW%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#KCGXW) IPO
- 确定 IPO:明确计算部分及功能边界
- I:Input 输入,程序的输入
- P:Process 处理,程序的主要逻辑
- O:Output 输出,程序的输出
- 编写程序:将计算求解的设计变成现实
- 调试程序:确保程序按照正确逻辑能够正确运行
自顶向下设计
模块化设计
- 通过函数或对象封装将程序划分为模块及模块间的表达
- 具体包括:主程序、子程序和子程序间关系
- 分而治之:一种分而治之、分层抽象、体系化的设计思想
- 紧耦合:两个部分之间交流很多,无法独立存在
- 松耦合:两个部分之间交流较少,可以独立存在
- 模块内部紧耦合、模块之间松耦合
配置化设计
- 引擎 + 配置:程序执行和配置分离,将可选参数配置化
- 将程序开发变成配置文件编写,扩展功能而不修改程序
- 关键在于接口设计,清晰明了、灵活可扩展
从应用需求到软件产品,应用开发的四个步骤:
- 产品定义:对应用需求充分理解和明确定义产品定义,而不仅是功能定义,要考虑商业模式
- 系统架构:以系统方式思考产品的技术实现系统架构,关注数据流、模块化、体系架构
- 设计与实现:结合架构完成关键设计及系统实现结合可扩展性、灵活性等进行设计优化
- 用户体验:从用户角度思考应用效果用户至上,体验优先,以用户为中心
单元小结
.mp4%22%2C%22size%22%3A24552197%2C%22taskId%22%3A%22u0d85165c-a200-4062-8979-b4529a86980%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483340308-1352ff00-d39c-46e2-9092-4cca6fc7a363.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22mE9l2%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#mE9l2)
- 计算思维:抽象计算过程和自动化执行
- 计算生态:竞争发展、相互依存、快速更迭
- 用户体验:进度展示、异常处理等
- IPO、自顶向下、模块化、配置化、应用开发的四个步骤
Python 第三方库安装
单元开篇
.mp4%22%2C%22size%22%3A11086048%2C%22taskId%22%3A%22u51907b3e-cb83-4456-9c29-20ac3759368%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483356610-8ba5bc75-b941-4f04-8c09-f8a7149429f4.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22zOj9N%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#zOj9N)
看见更大的 Python 世界
.mp4%22%2C%22size%22%3A36467123%2C%22taskId%22%3A%22u39a575b6-e3bc-47ba-ab3a-ad63bd0f72c%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483363504-5e2f91e9-bfde-4574-8dee-b72cac882738.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22wGTOD%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#wGTOD)
实例:开发与区块链相关的程序
- 第1步:在 pypi.org 搜索 blockchain
- 第2步:挑选适合开发目标的第三方库作为基础
- 第3步:完成自己需要的功能
三种方法
- 方法1(主要方法): 使用pip命令
- 方法2: 集成安装方法
- 方法3: 文件安装方法
第三方库的 pip 安装方法
.mp4%22%2C%22size%22%3A65276778%2C%22taskId%22%3A%22u082da95d-a8ef-4369-bfc2-213b5db5cae%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483367393-ac476f1a-ad03-43bd-aa2b-1db6830aa35c.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22yOH8S%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#yOH8S) 使用pip安装工具(命令行下执行)
常用的 pip 命令(适合 99% 以上情况):
pip -h
查看帮助信息pip install <第三方库名>
安装指定第三方库pip install -U <第三方库名>
使用 -U 标签更新已安转的指定第三方库pip uninstall <第三方库名>
卸载指定的第三方库pip download <第三方库名>
下载但不安装指定的第三方库pip show <第三方库名>
列出某个指定第三方库的详细信息~~pip search <第三方库名>~~
~~ 根据关键词在名称和介绍中搜索第三方库~~pip list
列出当前系统已经安装的第三方库
以上常见命令:
- 适合Windows、Mac和Linux等操作系统
- 未来获取第三方库的方式,目前的主要方式
- 适合99%以上情况,需要联网安装
刚试着按照课件中的描述搜了一下 blockchain,发现报错了。根据错误提示,PyPI 不再支持 pip search 命令,并告诉我们可以通过浏览器访问 https://pypi.org/search 来搜索包。
第三方库的集成安装方法
.mp4%22%2C%22size%22%3A24401171%2C%22taskId%22%3A%22u547b7882-d51d-4b34-9cc5-e90ac2bc1d0%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483395424-aa84b481-07c0-4edb-9409-7bb2ed5c6183.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22Onej9%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#Onej9) 集成安装:结合特定Python开发工具的批量安装
Anaconda:https://www.anaconda.com/
- 支持近800个第三方库
- 包含多个主流工具
- 适合数据计算领域开发
第三方库的文件安装方法
.mp4%22%2C%22size%22%3A43100544%2C%22taskId%22%3A%22uc6d7b0ce-7cea-4b75-8a72-d50103b7254%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483396978-21b94169-e638-4b63-82c4-6c8d4e423148.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22HTgE9%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#HTgE9) 为什么有些第三方库用 pip 可以下载,但无法安装?
- 某些第三方库 pip下载后,需要编译再安装
- 第三方库提供的不是可执行文件,而是源代码,下载到本地后需要结合你的操作系统进行编译,再进行安装
- 如果操作系统没有编译环境,则能下载但不能安装
- 可以直接下载编译后的版本用于安装吗?
UCI 页面
https://www.lfd.uci.edu/~gohlke/pythonlibs/
实例:安装 wordcloud 库
- 步骤1:在 UCI 页面上搜索 wordcloud
- 步骤2:下载对应版本的文件
- 步骤3:使用
pip install <文件名>
安装
单元小结
.mp4%22%2C%22size%22%3A18275246%2C%22taskId%22%3A%22u1972e0b4-05ba-456f-b491-980c9ccdfe6%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483405552-f0902c3c-4a86-41a0-9ff0-f5bc1deedb96.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22FSxTt%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#FSxTt)
- PyPI:Python Package Index
- pip 命令的各种用法
- Anaconda 集成开发工具及安装方法
- UCI 页面的“补丁”安装方法
模块 7: os 库的使用
os 库基本介绍
.mp4%22%2C%22size%22%3A20755125%2C%22taskId%22%3A%22u4cdd2eca-a7fb-4072-b48a-4079aba1ac8%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483423291-d1344de0-5c50-4455-95bb-8c90ebedde4f.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22kGlTR%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#kGlTR) os 库提供通用的、基本的操作系统交互功能
- os 库是 Python 标准库,包含几百个函数
- 常用路径操作、进程管理、环境参数等几类
- 路径操作:os.path 子库,处理文件路径及信息
- 进程管理:启动系统中其他程序
- 环境参数:获得系统软硬件信息等环境参数
os 库之路径操作
.mp4%22%2C%22size%22%3A115755319%2C%22taskId%22%3A%22u83651cbc-f88a-4308-93d8-3b8f072aaf7%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483423828-a120b31c-6255-4cf5-abbd-6164afd30b53.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22gZQgH%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#gZQgH) os.path 子库以 path 为入口,用于操作和处理文件路径
引入 os.path
:
import os.path
import os.path as op
常用函数:os.path.xxx
abspath(path)
获取 path 的绝对路径normpath(path)
对路径进行归一化relpath(path)
获取路径的相对位置dirname(path)
获取路径中的目录部分basename(path)
获取路径中的文件名称部分join(path)
拼接路径exists(path)
判断路径所对应的文件或目录是否存在isfile(path)
判断路径是否是一个文件isdir(path)
判断路径是否是一个目录getatime(path)
获取路径的访问时间getmtime(path)
获取路径对应的上次修改时间getctime(path)
获取路径对应的创建时间getsize(path)
获取路径对应的文件的大小(字节)
os 库之进程管理
.mp4%22%2C%22size%22%3A28498571%2C%22taskId%22%3A%22u19337240-c97d-4114-8e12-aa9e16b3f10%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483425572-cf43676b-0be8-474e-83b6-5a8179a9d8c7.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22hCelM%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#hCelM)
os.system(command)
- 执行程序或命令 command
- 在 Windows 系统中,返回值为 cmd 的调用返回信息
打开计算器:
使用绘图程序打开一个图片文件:
os 库之环境参数
.mp4%22%2C%22size%22%3A29589438%2C%22taskId%22%3A%22u0e4e55c5-3f20-46b4-b807-0938227e9d2%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483425869-80588c9c-d047-43ec-9dd9-44e58c375720.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22nfuXh%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#nfuXh) 获取或改变系统环境信息
实例 14: 第三方库安装脚本
问题分析
.mp4%22%2C%22size%22%3A40067360%2C%22taskId%22%3A%22u231b8111-790e-4e34-8d87-a87998e0092%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483433058-dd9d3281-e24b-48de-85e5-8babb43e5060.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22C8Rsn%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#C8Rsn) 第三方库自动安装脚本
- 需求:批量安装第三方库需要人工干预,能否自动安装?
- 自动执行 pip 逐一根据安装需求安装
如何自动执行一个程序?例如:pip?
实例讲解
.mp4%22%2C%22size%22%3A36780735%2C%22taskId%22%3A%22u30df591d-d09f-4da5-8c71-2abf5b1de16%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483441870-05af90de-d970-4c95-9778-0dfa104f2dfb.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22yXWWX%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#yXWWX)
import os
libs = {
"numpy",
"matplotlib",
"pillow",
"sklearn",
"requests",
"jieba",
"beautifulsoup4",
"wheel",
"networkx",
"sympy",
"pyinstaller",
"django",
"flask",
"werobot",
"pyqt5",
"pandas",
"pyopengl",
"pypdf2",
"docopt",
"pygame",
}
try:
for lib in libs:
os.system("pip3 install " + lib)
print("Successful")
except:
print("Failed Somehow")
举一反三
.mp4%22%2C%22size%22%3A34987266%2C%22taskId%22%3A%22uc653bf71-b729-4ec0-86a0-247c008604c%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483451549-8dd17857-c680-4157-87dc-7c5d89b7e3b3.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22hN8Ho%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#hN8Ho)
- 编写各类自动化运行程序的脚本,调用已有程序
- 扩展应用:安装更多第三方库,增加配置文件
- 扩展异常检测:捕获更多异常类型,程序更稳定友好
作业与练习
.mp4%22%2C%22size%22%3A4383089%2C%22taskId%22%3A%22uaf93cd9a-d9dd-40c1-985c-ae3497ee118%22%2C%22taskType%22%3A%22upload%22%2C%22url%22%3Anull%2C%22cover%22%3Anull%2C%22videoId%22%3A%22inputs%2Fprod%2Fyuque%2F2023%2F2331396%2Fmp4%2F1688483453385-6dbe4529-bb8d-4d70-9a7d-c40a065faec3.mp4%22%2C%22download%22%3Afalse%2C%22__spacing%22%3A%22both%22%2C%22id%22%3A%22tKhXh%22%2C%22margin%22%3A%7B%22top%22%3Atrue%2C%22bottom%22%3Atrue%7D%2C%22card%22%3A%22video%22%7D#tKhXh)
补充
Python 官方文档(中文版)
自顶向下、自底向上
自顶向下和自底向上是两种不同的程序设计方法,用于解决问题和构建算法的过程。
自顶向下 (Top-Down Approach)
自顶向下是一种自上而下的设计方法,即从整体开始,逐步将问题分解为更小的子问题,直到达到可以直接解决的简单问题为止。在这个过程中,你将主要关注整体结构和功能,并逐步添加细节。这种方法类似于将问题拆分为多个递归的子问题,直到每个子问题都变得简单明了。自顶向下的设计通常涉及使用函数或模块来表示不同的层次,然后分别实现这些函数或模块,以解决问题。
自底向上 (Bottom-Up Approach)
自底向上是一种自下而上的设计方法,即从最小的部分开始,逐步组合这些部分以构建更大的结构,直到达到解决整体问题的目标。在这个过程中,你将首先关注最基本的元素和操作,然后将它们组合成更复杂的部分,最终形成完整的解决方案。自底向上的设计通常涉及从小到大构建问题的解决方案,直到构建出整体的算法或程序。
对于问题解决和程序设计,自顶向下和自底向上都是重要的方法。自顶向下可以帮助你从整体上理解问题的结构和逻辑,然后再逐步细化和实现每个部分。自底向上则侧重于从基本部分开始构建,逐步组合和扩展,以形成完整的解决方案。在实践中,通常会将两种方法结合使用,根据具体问题的复杂程度和特点选择最合适的方法来设计和开发程序。
计算思维和逻辑思维
计算思维和逻辑思维是两种不同的思维方式,用于解决问题、推理和理解世界的过程。虽然它们有一些共通之处,但也存在一些区别。
计算思维 (Computational Thinking)
计算思维是一种问题解决和分析的方法,它强调将问题分解为更小的、可处理的部分,并利用计算机科学中的概念和技术来解决问题。这种思维方式通常包含以下关键要素:
- 分解问题:将复杂的问题分解为更小、更简单的子问题,以便更容易理解和解决。
- 模式识别:寻找问题中的模式、规律和趋势,帮助快速识别问题的本质。
- 抽象化:将问题简化为一系列抽象概念和步骤,忽略不必要的细节。
- 算法设计:构思和设计解决问题的步骤和方法,以达到预期的结果。
- 自动化:利用计算机编程语言和工具,实现自动化的解决方案。
计算思维不仅仅局限于计算机编程领域,而是一种更普遍的解决问题的方法,可应用于各种领域和日常生活中。
逻辑思维 (Logical Thinking)
逻辑思维是一种基于逻辑推理的思考方式,用于分析和推断事实之间的关系,以及构建合理的论证。这种思维方式通常包含以下关键要素:
- 前提与结论:识别和理解前提(已知条件)和结论(推理得出的结论)之间的关系。
- 推理与推断:运用逻辑规则和推理方式来得出新的结论,基于已知事实进行推断。
- 有效论证:确保论证的合理性,避免逻辑谬误和不恰当的推理。
- 组织思维:以清晰、连贯的方式组织思想,使推理过程更易于理解和跟随。
逻辑思维在哲学、科学、数学、法律等领域都扮演着重要的角色。它帮助人们评估和分析信息的可信度,有效地解决问题,并提供合理的论证来支持观点或结论。
综上所述,计算思维和逻辑思维都是重要的思考方式,它们在问题解决和理解事物时起着不可替代的作用。
《三体》 —— 三体问题 —— 计算思维
《三体》一书中提及的三体问题被描述为无解,主要指的是无法通过传统的数学逻辑思维来求解该问题,并且无法得到确切的公式或解析解。这是因为三体问题涉及到三个质点之间的相互引力作用,其运动状态非常复杂,无法用简洁的数学公式来描述和求解。因此,在小说中,人类只能利用计算机进行大规模的数值计算,以近似的方式来模拟和预测三体系统的行为。这也强调了计算思维在处理复杂问题时的重要性。
“API != 生态”、“生态 > API”
应用程序接口(API)和生态系统是两个不同的概念。
API(Application Programming Interface,应用程序接口):API 是一组定义了软件组件之间交互方式的规范。
它提供了一种方式,使得不同的软件模块或服务可以相互通信、交换数据和使用功能。API 可以被看作是软件开发中的构建块,它们定义了如何与特定的软件或服务进行交互。
生态系统(Ecology):生态系统指的是一个由各种不同组成部分相互作用而形成的整体。
在技术领域,生态系统通常指的是一个由多个相关的产品、工具、服务等组成的综合体,这些组成部分相互依赖、互补,形成了一个完整的生态系统。
“API != 生态”意味着仅有 API 还不足以构建一个完整的生态系统。API 只是生态系统的一部分,它提供了交互的接口,但还需要其他组成部分的支持和参与,如开发者社区、工具链、文档、示例代码等等。一个健康的生态系统应该具备丰富的资源和支持,能够满足开发者的需求,并促进整个生态系统的繁荣发展。
PyPI
PyPI 是 Python Package Index 的缩写,全称为 Python 软件包索引。它是 Python 编程语言的一个官方软件包仓库和分发平台。PyPI 允许开发者将他们编写的 Python 库、工具和应用程序上传到该平台上,供其他开发者使用和共享。
在 PyPI 上,开发者可以发布自己编写的 Python 包,并提供相关的文档、示例代码和版本信息。其他开发者可以通过 PyPI 来搜索、下载和安装这些包,以便在自己的项目中使用。PyPI 不仅提供了大量的第三方 Python 库,也是许多流行的 Python 库(如 numpy、pandas、requests 等)的官方源。
通过 PyPI,开发者可以轻松地管理和共享自己的 Python 代码,同时也能够方便地获取和使用其他开发者贡献的 Python 包。这使得 PyPI 成为 Python 社区中重要的资源之一,促进了 Python 生态系统的繁荣发展。
PSF
PSF 代表 Python 软件基金会(Python Software Foundation)。
Python软件基金会是一个非营利组织,致力于支持和促进Python编程语言的发展和使用。它成立于2001年,是一个由志愿者组成的组织,旨在维护和促进Python社区、项目和生态系统的繁荣。
PSF的主要目标包括:
- 维护Python编程语言的开发和改进,管理Python的版本和发行。
- 促进Python社区的成长和发展,提供支持和资源,鼓励合作和知识共享。
- 推广Python的使用,包括教育和培训,吸引更多的开发者和用户使用Python。
- 维护和管理PyPI(Python Package Index),这是Python的包管理器和第三方库仓库。
- 组织和赞助Python相关的活动和会议,如PyCon等。
Python软件基金会是一个非常重要的组织,它在Python社区的发展和推广中起着关键作用。通过其持续的努力和支持,Python已经成为一种非常流行和广泛使用的编程语言,在各种领域和行业都得到了广泛应用。
Anaconda
Anaconda 是一个用于数据科学和机器学习的 Python 发行版。它包含了许多常用的数据科学库、工具和环境,使得安装和管理这些库变得更加简单。
Anaconda 中包含了 Python 解释器以及一系列常用的科学计算库,如 NumPy、Pandas、Matplotlib 等。此外,Anaconda 还提供了一个名为 Conda 的包管理系统,可以方便地创建、管理和切换不同的 Python 环境。
使用 Anaconda 可以快速搭建适用于数据分析、机器学习和科学计算的开发环境,无需手动安装各个库和解决依赖问题。同时,Anaconda 还提供了集成开发环境(IDE)Anaconda Navigator 和 Jupyter Notebook,使得编写、运行和分享代码更加方便。
总之,Anaconda 是一个强大的 Python 发行版,特别适合数据科学和机器学习领域的开发者使用。
Python 发行版
“Python发行版”是指将Python编程语言和相关工具、库、文档以及其他附加组件打包在一起的软件包。这些打包后的软件包使得用户可以轻松地安装和配置Python环境,以及开始进行编程工作。
Python本身是一种编程语言,它有一个官方的解释器(CPython),可以用于运行Python代码。除了官方解释器,还有其他的Python解释器和实现,如Jython、IronPython等。但在Python发行版中,通常包含的都是官方的CPython解释器。
除了Python解释器,Python发行版还包含了一系列常用的Python标准库,这些标准库提供了各种功能和工具,如文件操作、网络编程、字符串处理等,是Python编程的基本工具集。
此外,Python发行版通常还会预装一些常用的第三方库,这些库扩展了Python的功能,提供了更多的特性和功能,例如NumPy、Pandas、scikit-learn等用于数据科学和机器学习的库。
Python发行版的目的是简化Python的安装和配置过程,为用户提供一个更加便捷和完整的开发环境。用户可以通过下载并安装Python发行版,即可拥有一个包含Python解释器、标准库和常用第三方库的完整开发环境,方便快速地开始Python编程和开发。Anaconda就是一个专注于数据科学和机器学习的Python发行版,它预装了大量与数据科学相关的库和工具,方便数据科学家和机器学习工程师进行工作。
有些第三方库用pip可以下载,但无法安装
有些第三方库可能会出现能够通过 pip 下载,但在安装时出现问题的情况。这可能是由于以下几个原因:
- 编译依赖:某些第三方库在安装过程中需要编译依赖,这些依赖可能是 C 语言扩展,需要在系统上进行编译。如果缺少编译所需的工具和库,安装过程就会失败。这种情况下,你可能需要先安装所需的编译工具和库,然后再尝试安装该第三方库。
- 操作系统兼容性:某些第三方库可能对不同操作系统的支持不同,特定的库可能只在特定的操作系统上有效。因此,在一些操作系统上可以下载但无法安装。在这种情况下,你可能需要查找该库是否支持你所使用的操作系统,或者寻找与之兼容的替代库。
- 版本兼容性:有时,一些第三方库可能不支持你当前安装的Python版本,或者与其他已安装的库产生版本冲突。这可能导致安装失败。在这种情况下,你可以尝试更新Python版本或者寻找适用于你当前Python版本的库。
- 网络问题:有时,安装过程可能会受到网络连接问题的影响,导致下载或安装失败。在这种情况下,你可以尝试重新运行pip命令,或者检查网络连接是否正常。
- 包维护问题:偶尔可能会出现一些第三方库的包维护问题,例如服务器暂时不可用、包版本更新滞后等。这可能导致pip能够下载包,但安装过程失败。在这种情况下,你可以稍后再次尝试安装,或者考虑使用其他替代库。
总之,第三方库安装失败的原因可能有很多,常见的问题包括编译依赖、操作系统兼容性、版本兼容性、网络问题以及包维护等。在遇到安装问题时,你可以根据错误信息进行排查,或者搜索相关解决方案,以解决问题。
UCI 页面
UCI 页面指的是加州大学尔湾分校(University of California, Irvine)的网页。在这个特定的网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/ 上,您可以找到由 Gohlke 教授维护的 Python 库的链接。这些库提供了对于 Python 编程语言的扩展和功能增强。
路径归一化 os.path.normpath()
对路径进行归一化是为了将输入的路径规范化,使其符合特定操作系统的规范,并去除冗余的表示形式。这样可以确保路径在不同操作系统上都能正确地解析,避免路径表示上的混淆和错误。
在不同操作系统中,文件路径的表示形式可能会有所不同。例如,在Windows系统上,文件路径通常使用反斜杠(\)作为路径分隔符,而在Unix/Linux系统上,文件路径使用正斜杠(/)作为路径分隔符。此外,还可能涉及大小写敏感性等问题。
路径归一化可以解决以下问题:
- 路径分隔符:归一化操作可以确保路径中使用正确的路径分隔符,避免在跨操作系统时出现路径表示错误。
- 删除冗余符号:有时,路径中可能包含冗余的表示符号,例如连续的路径分隔符、当前目录(.)或上级目录(..)等。路径归一化可以将这些冗余符号去除,简化路径表示。
- 规范化大小写:在某些操作系统中,路径大小写可能是敏感的,而在其他操作系统中则不敏感。路径归一化可以将路径统一为特定的大小写规范。
需要对路径进行归一化处理的情况包括但不限于以下情况:
- 当用户提供了路径输入时,为了保证路径的正确性和一致性,需要对其进行归一化处理。
- 在编写程序时,为了确保跨平台的兼容性,对于处理文件路径的操作,通常会在使用前对路径进行归一化。
- 在处理用户输入或读取文件路径时,可以通过归一化操作来处理可能出现的冗余或不一致的路径表示形式。
在Python中,os.path.normpath()
函数是用来实现路径归一化操作的。它会根据操作系统的规范对路径进行规范化处理,并返回一个标准化的路径表示。