导图社区 最强Python
根据慕课上的课程进行整理,同时根据平时刷力扣整理了一些代码技巧,易错点,常用库,常用代码段等子标签。
编辑于2021-03-20 14:33:45整理了力扣上面的算法题目的主要思路和代码, 此思维导图会持续更新中, 购买的朋友可通过我个人介绍中的博客加我好友, 我会持续提供更新, 也可和我一起探讨算法问题。
整理了东南大学的英语学术写作的考试重点内容, 旨在培养学生的英语学术写作能力,帮助学生在初步掌握写作技巧的基础上把学术论文写得更加规范,为毕业论文的写作及今后学术研究打下坚实基础。
根据B站莫烦的视频教程整理而来, Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。
社区模板帮助中心,点此进入>>
整理了力扣上面的算法题目的主要思路和代码, 此思维导图会持续更新中, 购买的朋友可通过我个人介绍中的博客加我好友, 我会持续提供更新, 也可和我一起探讨算法问题。
整理了东南大学的英语学术写作的考试重点内容, 旨在培养学生的英语学术写作能力,帮助学生在初步掌握写作技巧的基础上把学术论文写得更加规范,为毕业论文的写作及今后学术研究打下坚实基础。
根据B站莫烦的视频教程整理而来, Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。
Python
1.基本语法元素
1.程序设计基本方法
1.计算机与程序设计
1.计算机的概念
0.计算机是根据指令操作数据的设备
1.功能性
对数据的操作,表现为数据计算、输入输出处理和结果存储等
2.可编程性
根据一系列指令自动地、可预测地、准确地完成操作者的意图
2.计算机的发展
1.计算机的发展参照摩尔定律 表现为指数方式
1.计算机硬件所依赖的集成电路规模参照摩尔定律发展
2.计算机运行速度因此也接近几何级数快速增长
3.计算机高效支撑的各类运算功能不断丰富发展
2.摩尔定律
1.计算机发展历史上最重要的预测法则
2.Intel公司创始人之一戈登·摩尔在1965年提出
3.单位面积集成电路上可容纳晶体管的数量约每两年翻一番
4.CPU/GPU、内存、硬盘、电子产品价格等都遵循摩尔定律
5.当今世界,唯一长达50年有效且按照指数发展的技术领域
3.程序设计
1.程序设计是计算机可编程性的体现
2.程序设计,亦称编程,深度应用计算机的主要手段
3.程序设计已经成为当今社会需求量最大的职业技能之一
4.很多岗位都将被计算机程序接管,程序设计将是生存技能
4.程序设计语言
1.程序设计语言是一种用于交互(交流)的人造语言
2.程序设计语言,亦称编程语言,程序设计的具体实现方式 - 编程语言相比自然语言更简单、更严谨、更精确 - 编程语言主要用于人类和计算机之间的交互
3.编程语言种类很多,但生命力强劲的却不多
4.编程语言有超过600种,绝大部分都不再被使用 - C语言诞生于1972年,它是第一个被广泛使用的编程语言 - Python语言诞生于1990年,它是最流行最好用的编程语言
2.编译和解释
1.编程语言的执行方式
0.计算机执行源程序的 两种方式:编译和解释
1.源代码:采用某种编程语言编写的计算机程序,人类可读,例如:result = 2 + 3
2.目标代码:计算机可直接执行,人类不可读 (专家除外),例如:11010010 00111011
1.编译
1.将源代码一次性转换成目标代码的过程,执行编译过程的程序叫作编译器
2.一次性翻译,之后不再需要源代码(类似英文翻译)
2.解释
1.将源代码逐条转换成目标代码同时逐条运行的过程,执行解释过程的程序叫作解释器
2.每次程序运行时随翻译随执行(类似实时的同声传译)
3.静态语言
1.使用编译执行的编程语言: C/C++语言、Java语言
2.编译器一次性生成目标代码,优化更充分,程序运行速度更快
4.脚本语言
1.使用解释执行的编程语言: Python语言、JavaScript语言、PHP语言
2.执行程序时需要源代码,维护更灵活,源代码在维护灵活、跨多个操作系统平台
3.程序的基本编写方法
1.IPO
1.I:Input 输入,程序的输入
2.P:Process 处理,程序的主要逻辑
3.O:Output 输出,程序的输出
2.理解IPO
1.输入
1.程序的输入: 文件输入、网络输入、控制台输入、交互界面输入、内部参数输入等
2.输入是一个程序的开始
2.输出
1.程序的输出: 控制台输出、图形输出、文件输出、网络输出、操作系统内部变量输出等
2.输出是程序展示运算结果的方式
3.处理
1.处理是程序对输入数据进行计算产生输出结果的过程 - 处理方法统称为算法,它是程序最重要的部分 - 算法是一个程序的灵魂
3.编程解决问题的步骤
1.分析问题:分析问题的计算部分,想清楚 - 划分边界:划分问题的功能边界,规划IPO - 设计算法:设计问题的求解算法,关注算法 - 编写程序:编写问题的计算程序,编程序 - 调试测试:调试程序使正确运行,运行调试 - 升级维护:适应问题的升级维护,更新完善
4.求解计算问题的精简步骤
1.确定IPO:明确计算部分及功能边界 - 编写程序:将计算求解的设计变成现实 - 调试程序:确保程序按照正确逻辑能够正确运行
4.计算机编程
1.编程能够训练思维
- 编程体现了一种抽象交互关系、自动化执行的思维模式 - 计算思维:区别逻辑思维和实证思维的第三种思维模式 - 能够促进人类思考,增进观察力和深化对交互关系的理解
2.编程能够增进认识
- 编程不单纯是求解计算问题 - 不仅要思考解决方法,还要思考用户体验、执行效率等 - 能够帮助程序员加深用户行为以及社会和文化认识
3.编程能够带来乐趣
- 编程能够提供展示自身思想和能力的舞台 - 让世界增加新的颜色、让自己变得更酷、提升心理满足感 - 在信息空间里思考创新、将创新变为现实
4.编程能够提高效率
- 能够更好地利用计算机解决问题 - 显著提高工作、生活和学习效率 - 为个人理想实现提供一种借助计算机的高效手段
5.编程带来就业机会
- 程序员是信息时代最重要的工作岗位之一 - 国内外对程序员岗位的缺口都在百万以上规模 - 计算机已经渗透于各个行业, 就业前景非常广阔
2.开发环境配置
1.Python语言概述
1.Python [`paiθən],译为“蟒蛇” Python语言拥有者是Python Software Foundation(PSF) PSF是非盈利组织,致力于保护Python语言开放、开源和发展
2.Python语言是一个由编程牛人领导设计并开发的编程语言 Python语言是一个有开放、开源精神的编程语言 Python语言应用于火星探测、搜索引擎、引力波分析等众多领域
2.Python基本开发环境IDLE
1.Python官方提供 适用于小规模程序开发
2.Python官方环境:Python解释器 + IDLE开发环境 - 轻量级:只有几十MB大小,使用灵活 - 功能丰富:编辑器+交互环境+标准库+库安装工具
3.Python程序编写与运行
1.交互式:对每个输入语句即时运行结果,适合语法练习
2.文件式:批量执行一组语句并运行结果,编程的主要方式
4.Python高级开发环境VSCode
1.微软出品,与Visual Studio同质量的专业级开发工具 - 跨平台免费工具:支持Windows/Linux/MacOS - 编辑器模式:轻量级、功能丰富、可扩展性强
2.第一步:安装IDLE环境;第二步:安装VSCode
下载地址: https://code.visualstudio.com
3.实例1:温度转换
1.温度刻画的两种不同体系
1.摄氏度:中国等世界大多数国家使用 以1标准大气压下水的结冰点为0度,沸点为100度,将温度进行等分刻画 - 华氏度:美国、英国等国家使用 以1标准大气压下水的结冰点为32度,沸点为212度,将温度进行等分刻画
2.问题分析
1.该问题中计算部分的理解和确定
- 理解1:直接将温度值进行转换 - 理解2:将温度信息发布的声音或图像形式进行理解和转换 - 理解3:监控温度信息发布渠道,实时获取并转换温度值
2.分析问题
采用 理解1:直接将温度值进行转换 温度数值需要标明温度体系,即摄氏度或华氏度 转换后也需要给出温度体系
3.划分边界
- 输入:带华氏或摄氏标志的温度值 - 处理:根据温度标志选择适当的温度转换算法 - 输出:带摄氏或华氏标志的温度值
4.输入输出格式设计
标识放在温度最后,F表示华氏度,C表示摄氏度 82F表示华氏82度,28C表示摄氏28度
5.设计算法
根据华氏和摄氏温度定义,利用转换公式如下: C = ( F – 32 ) / 1.8 F = C * 1.8 + 32 其中, C表示摄氏温度, F表示华氏温度
6.代码
#TempConvert.py TempStr = input("请输入带有符号的温度值: ") if TempStr[-1] in ['F', 'f']: C = (eval(TempStr[0:-1]) - 32)/1.8 print("转换后的温度是{:.2f}C".format(C)) elif TempStr[-1] in ['C', 'c']: F = 1.8*eval(TempStr[0:-1]) + 32 print("转换后的温度是{:.2f}F".format(F)) else: print("输入格式错误")
4.程序语法元素分析
1.程序的格式框架
1.代码高亮:编程的色彩辅助体系,不是语法要求
2.缩进:一行代码开始前的空白区域,表达程序的格式框架
- 严格明确:缩进是语法的一部分,缩进不正确程序运行错误 - 所属关系:表达代码间包含和层次关系的唯一手段 - 长度一致:程序内一致即可,一般用4个空格或1个TAB
3.注释:用于提高代码可读性的辅助性文字,不被执行
- 单行注释:以#开头,其后内容为注释 - 多行注释:以'''开头和结尾
2.命名与保留字
1.变量:程序中用于保存和表示数据的占位符号
- 变量采用标识符(名字) 来表示,关联标识符的过程叫命名 - 可以使用等号(=)向变量赋值或修改值,=被称为赋值符号
2.命名: 关联标识符的过程
- 命名规则: 大小写字母、数字、下划线和中文等字符及组合 - 注意事项: 大小写敏感、首字符不能是数字、不与保留字相同
3.保留字: 被编程语言内部定义并保留使用的标识符
- Python语言有35个保留字(也叫关键字) - 保留字是编程语言的基本单词,大小写敏感
3.数据类型
1.字符串
1.表示
- 字符串由一对单引号或一对双引号表示 - 字符串是字符的有序序列,可以对其中的字符进行索引
2.序号
正向递增序号 和 反向递减序号
3.使用
0.使用[ ]获取字符串中一个或多个字符
1.索引:返回字符串中单个字符 <字符串>[M]
2.切片:返回字符串中一段字符子串 <字符串>[M: N],左闭右开
2.数字类型
整数和浮点数都是数字类型
3.列表类型
0.由0个或多个数据组成的有序序列
1.列表使用[ ]表示,采用逗号(,)分隔各元素: ['F','f']表示两个元素'F'和'f'
2.使用保留字 in 判断一个元素是否在列表中 TempStr[-1] in ['C','c']判断前者是否与列表中某个元素相同
4.语句与函数
1.赋值语句
1.赋值语句用来给变量赋予新的数据值
2.赋值语句右侧的数据类型同时作用于变量 TempStr=input("") #input()返回一个字符串,TempStr也是字符串
2.分支语句
1.使用保留字if elif else构成条件判断的分支结构 if TempStr[-1] in ['F','f']:#如果条件为True则执行冒号后语句
2.每个保留字所在行最后存在一个冒号(:),语法的一部分 冒号及后续缩进用来表示后续语句与条件的所属关系
3.函数
1.函数采用 <函数名>(<参数>) 方式使用
5.Python程序的输入输出
1.输入函数 input()
1.从控制台获得用户输入的函数
2.input()函数的使用格式: <变量> = input(<提示信息字符串>)
3.用户输入的信息以字符串类型保存在<变量>中
2.输出函数 print()
1.以字符形式向控制台输出结果的函数
2.print()函数的基本使用格式: print(<拟输出字符串或字符串变量>)
3.字符串类型的一对引号仅在程序内部使用,输出无引号
3.print()函数的格式化
1.print("转换后的温度是{:.2f}C".format(C))
2.{ }表示槽,后续变量填充到槽中
3.{ :.2f }表示将变量C填充到这个位置时取小数点后2位
4.评估函数 eval()
1.去掉参数最外侧引号并执行余下语句的函数
2.eval()函数的基本使用格式: eval(<字符串或字符串变量>)
3.将字符串转化为整数类型
eval(TempStr[0:-1]),如果TempStr[0:-1]值是"12.3",输出是:12.3
2.基本图形绘制
1.深入理解Python语言
1.计算机技术的演进
1.过程
1946-1981 计算机系统结构时代 计算能力问题 1981-2008 网络和视窗时代 交互问题 2008-2016 复杂信息系统时代 数据问题 2016- 人工智能时代 人类的问题
2.编程语言的多样初心
1.不同编程语言的初心和适用对象
3.Python语言的特点
1.Python语言是通用语言 - Python语言是脚本语言 - Python语言是开源语言 - Python语言是跨平台语言 - Python语言是多模型语言
2.如何看待Python语言
1.人生苦短,我学Python - C/C++:Python归Python,C归C - Java:针对特定开发和岗位需求 - HTML/CSS/JS:不可替代的前端技术,全栈能力 - 其他语言:R/Go/Matlab等,特定领域
2.Python是最高产的程序设计语言及…… - 掌握抽象并求解计算问题综合能力的语言 - 了解产业界解决复杂计算问题方法的语言 - 享受利用编程将创新变为实现乐趣的语言
3.工具决定思维:关注工具变革的力量
4."超级语言"的诞生
1.编程语言的种类
1.机器语言
- 一种二进制语言,直接使用二进制代码表达指令 - 计算机硬件(CPU)可以直接执行,与具体CPU型号有关 - 完成 2+3 功能的机器语言 11010010 00111011
2.汇编语言
- 一种将二进制代码直接对应助记符的编程语言 - 汇编语言与CPU型号有关,程序不通用,需要汇编器转换 - 完成 2+3 功能的汇编语言 add 2,3,result
3.高级语言
- 更接近自然语言,同时更容易描述计算问题 - 高级语言代码与具体CPU型号无关,编译后运行 - 完成 2+3 功能的高级语言 result = 2 + 3
4.超级语言
- 具有庞大计算生态,可以很容易利用已有代码功能 - 编程思维不再是刀耕火种,而是集成开发 - 完成 2+3 功能的超级语言 result = sum(2,3)
2.Python: 唯一的"超级语言"!
2.实例2:蟒蛇绘制
1.代码
#PythonDraw.py import turtle turtle.setup(650, 350, 200, 200) turtle.penup() turtle.fd(-250) turtle.pendown() turtle.pensize(25) turtle.pencolor("purple") turtle.seth(-40) for i in range(4): turtle.circle(40, 80) turtle.circle(-40, 80) turtle.circle(40, 80/2) turtle.fd(40) turtle.circle(16, 180) turtle.fd(40 * 2/3) turtle.done()
3.模块1:turtle库的使用
1.turtle库基本介绍
1.turtle库概述
1.turtle(海龟)库是turtle绘图体系的Python实现
2.turtle绘图体系:1969年诞生,主要用于程序设计入门 - Python语言的标准库之一 - 入门级的图形绘制函数库
2.标准库
1.Python计算生态 = 标准库 + 第三方库
2.标准库:随解释器直接安装到操作系统中的功能模块
3.第三方库:需要经过安装才能使用的功能模块
4.库Library、包Package、模块Module,统称模块
3.turtle的原理
turtle(海龟)是一种真实的存在 - 有一只海龟,其实在窗体正中心,在画布上游走 - 走过的轨迹形成了绘制的图形 - 海龟由程序控制,可以变换颜色、改变宽度等
2.turtle绘图窗体布局
1.turtle.setup(width, height, startx, starty)
2.setup()设置窗体大小及位置,4个参数中后两个可选,setup()不是必须的
3.turtle空间坐标体系
1.绝对坐标
1.turtle.goto(x, y)
2.海龟坐标
4.turtle角度坐标体系
1.绝对角度
1.turtle.seth(angle)
seth()改变海龟行进方向,angle为绝对度数,seth()只改变方向但不行进
2.海龟角度
5.RGB色彩体系
1.RGB色彩模式
由三种颜色构成的万物色 - RGB指红蓝绿三个通道的颜色组合 - 覆盖视力所能感知的所有颜色 - RGB每色取值范围0-255整数或0-1小数
2.常用RGB色彩
3.turtle的RGB色彩模式
默认采用小数值 可切换为整数值 turtle.colormode(mode) - 1.0:RGB小数值模式 - 255:RGB整数值模式
4.turtle程序语法元素分析
1.库引用与import
1.扩充Python程序功能的方式
2.使用import保留字完成,采用<a>.<b>()编码风格 import <库名> <库名>.<函数名>(<函数参数>)
3.使用from和import保留字共同完成 from <库名> import <函数名> from <库名> import * <函数名>(<函数参数>) 不需要库名
第一种方法不会出现函数重名问题,第二种方法则会出现
4.使用import和as保留字共同完成 import <库名> as <库别名> <库别名>.<函数名>(<函数参数>) 给调用的外部库关联一个更短、更适合自己的名字
2.turtle画笔控制函数
1.画笔操作后一直有效,一般成对出现
2.turtle.penup() 别名 turtle.pu() 抬起画笔,海龟在飞行,无痕迹
3.turtle.pendown() 别名 turtle.pd() 落下画笔,海龟在爬行,有痕迹
4.画笔设置后一直有效,直至下次重新设置
5.turtle.pensize(width) 别名 turtle.width(width) 画笔宽度,海龟的腰围
6.turtle.pencolor(color) color为颜色字符串或r,g,b值,画笔颜色,海龟在涂装
6.1 pencolor(color)的color可以有三种形式
- 颜色字符串 :turtle.pencolor("purple") - RGB的小数值:turtle.pencolor(0.63, 0.13, 0.94) - RGB的元组值:turtle.pencolor((0.63,0.13,0.94))
3.turtle运动控制函数
0.控制海龟行进:走直线 & 走曲线
1.turtle.forward(d) 别名 turtle.fd(d),向前行进,海龟走直线 - d: 行进距离,可以为负数
2.turtle.circle(r, extent=None),根据半径r绘制extent角度的弧形 - r: 默认圆心在海龟左侧r距离的位置 - extent: 绘制角度,默认是360度整圆
4.turtle方向控制函数
0.控制海龟面对方向: 绝对角度 & 海龟角度
1.turtle.setheading(angle) 别名 turtle.seth(angle),改变行进方向,海龟走角度 - angle: 行进方向的绝对角度
2.turtle.left(angle) 海龟向左转 - turtle.right(angle) 海龟向右转 - angle: 在海龟当前行进方向上旋转的角度
5.基本循环语句
1.for <变量> in range(<次数>): <被循环执行的语句> - <变量>表示每次循环的计数,0到<次数>-1
2.range()函数
0.产生循环计数序列
1.range(N) 产生 0 到 N-1的整数序列,共N个
2.range(M,N) 产生 M 到 N-1的整数序列,共N-M个
6.turtle其他常用函数
1.书写字符
turtle.write('年',font=("Arial", 18, "normal"))
write(arg,move=false,align='left',font=('arial',8,'normal')) 在当前乌龟位置写入文本。 arg--信息,将写入Turtle绘画屏幕。 move(可选)--真/假。 align(可选)--字符串“左(left)”、“中(center)”或“右(right)”之一。 font(可选)--三个字体(fontname、fontsize、fonttype) 写入文本 - arg的字符串表示形式 - 当前 根据“对齐”(“左”、“中”或“右”)定位乌龟以及给定的字体。 如果move为true,则笔将移动到右下角。 在默认情况下,move为false
2.海龟的可见性
1.不可见
turtle.hideturtle() turtle.ht()
2.可见
turtle.showturtle() turtle.st()
3.填充颜色
1.turtle.begin_fill()
在绘制要填充的形状之前调用
2.turtle.end_fill()
填充上次调用 begin_fill() 之后绘制的形状
3.基本数据类型
1.数字类型及操作
1.整数类型
1.概念
0.与数学中整数的概念一致
1.可正可负,没有取值范围限制
2.pow(x,y)函数:计算x^y,想算多大算多大
2.4种进制表示形式
十进制:1010, 99, -217
二进制,以0b或0B开头:0b010, -0B101
八进制,以0o或0O开头:0o123, -0O456
十六进制,以0x或0X开头:0x9a, -0X89
2.浮点数类型
1.概念
0.与数学中实数的概念一致
1.带有小数点及小数的数字
2.浮点数取值范围和小数精度都存在限制,但常规计算可忽略
3.取值范围数量级约-10^307至10^308,精度数量级10^-16
2.不确定尾数,不是bug
1.二进制表示小数,可以无限接近,但不完全相同
2.round(x, d):对x四舍五入,d是小数截取位数
3.浮点数间运算与比较用round()函数辅助
4.不确定尾数一般发生在10^-16左右,round()十分有效
3.科学计数法表示
1.使用字母e或E作为幂的符号,以10为基数,格式如下:<a>e<b> 表示 a*10b
3.复数类型
1.a+bj 被称为复数,其中,a是实部,b是虚部
2.z.real 获得实部,z.imag 获得虚部
4.数值运算操作符
1.符号体系
2.增强赋值操作符
3.数字类型的关系
1.类型间可进行混合运算,生成结果为"最宽"类型: 整数 -> 浮点数 -> 复数
5.数值运算函数
2.实例3: 天天向上的力量
3.字符串类型及操作
1.字符串类型的表示
1.两类四种
1.由一对单引号或双引号表示,仅表示单行字符串
2.由一对三单引号或三双引号表示,可表示多行字符串
3.原因
1.如果希望在字符串中包含双引号或单引号
'这里有个双引号(")' 或者 "这里有个单引号(')"
2.如果希望在字符串中既包括单引号又包括双引号
''' 这里既有单引号(')又有双引号 (") '''
2.序号
正向递增序号 和 反向递减序号
3.使用
0.使用[ ]获取字符串中一个或多个字符
1.索引:返回字符串中单个字符 <字符串>[M]
2.切片:返回字符串中一段字符子串 <字符串>[M: N]
4.高级用法
1.使用[M: N: K]根据步长对字符串切片
1.<字符串>[M: N],M缺失表示至开头,N缺失表示至结尾
2.<字符串>[M: N: K],根据步长K对字符串切片
3."〇一二三四五六七八九十"[::-1] 结果是 "十九八七六五四三二一〇"
5.特殊字符:转义符 \
1.转义符表达特定字符的本意
"这里有个双引号(\")" 结果为 这里有个双引号(")
2.转义符形成一些组合, 表达一些不可打印的含义
"\b"回退 "\n"换行(光标移动到下行首) "\r" 回车(光标移动到本行首)
2.字符串操作符
3.字符串处理函数
4.字符串处理方法
1.方法
1."方法"特指<a>.<b>()风格中的函数<b>() - 方法本身也是函数,但与<a>有关,<a>.<b>()风格使用 - 字符串或字符串变量是<a>,存在一些可用方法
5.字符串类型的格式化
1.格式化
1.字符串格式化使用.format()方法,用法如下:<模板字符串>.format(<逗号分隔的参数>)
2.format()方法的格式控制
1.槽内部对格式化的配置方式: { <参数序号> :<格式控制标记>}
4.模块2: time库的使用
1.time库基本介绍
0.import time time.<b>()
1.time库是Python中处理时间的标准库
1.计算机时间的表达
2.提供获取系统时间并格式化输出功能
3.提供系统级精确计时功能,用于程序性能分析
2.time库包括三类函数
- 时间获取:time() ctime() gmtime() - 时间格式化:strftime() strptime() - 程序计时:sleep(), perf_counter()
2.时间获取
3.时间格式化
1.strftime()方法
2.strptime()方法
4.程序计时应用
1.测量时间:perf_counter()
2.产生时间:sleep()
5.实例4: 文本进度条
1.问题分析
1.如何获得文本进度条的变化时间
采用sleep()模拟一个持续的进度
2.简单开始
3.单行动态刷新
1.刷新的关键是 \r
- 刷新的本质是:用之后打印的字符覆盖之前的字符 - 不能换行:print()需要被控制 - 要能回退:打印后光标退回到之前的位置 \r
2.IDLE屏蔽了\r功能
3.使用命令行执行
4.实例完整效果
4.程序控制结构
1.程序的分支结构
1.单分支结构
1.语法
if <条件> : <语句块>
2.二分支结构
1.语法
if <条件> : <语句块1> else :<语句块2>
2.紧凑形式:适用于简单表达式的二分支结构
<表达式1> if <条件> else <表达式2>
3.多分支结构
1.语法
if <条件1> : <语句块1> elif <条件2> : <语句块2> …… else :<语句块N>
4.条件判断及组合
1.条件判断
2.条件组合
5.程序的异常处理
1.语法
try :<语句块1> try :<语句块1> except : <语句块2> except <异常类型> : <语句块2>
标注异常类型后,仅响应此类异常,异常类型名字等同于变量名
2.高级使用
try :<语句块1> except : <语句块2> else :<语句块3> finally : <语句块4>
- finally对应语句块4一定执行 - else对应语句块3在不发生异常时执行
2.实例5: 身体质量指数BMI
1.公式
BMI = 体重 (kg) / 身高^2 (m^2)
2.标准
3.注意
- 多分支条件之间的覆盖是重要问题 - 程序可运行,但如果不正确,要注意多分支 - 分支结构是程序的重要框架,读程序先看分支
3.程序的循环结构
1.遍历循环
1.语法
for <循环变量> in <遍历结构> : <语句块>
从遍历结构中逐一提取元素,放在循环变量中
2.应用
1.计数循环(N次)
1.for i in range(N) : <语句块>
2.遍历由range()函数产生的数字序列,产生循环
2.计数循环(特定次)
1.for i in range(M,N,K) : <语句块>
2.遍历由range()函数产生的数字序列,产生循环
3.字符串遍历循环
1.for c in s : <语句块>
2.s是字符串,遍历字符串每个字符,产生循环
4.列表遍历循环
1.for item in ls : <语句块>
2.ls是一个列表,遍历其每个元素,产生循环
5.文件遍历循环
1.for line in fi : <语句块>
2.fi是一个文件标识符,遍历其每行,产生循环
2.无限循环
1.语法
while <条件> : <语句块>
无限循环时: (CTRL + C 退出执行)
3.循环控制保留字
1.break 和 continue
- break跳出并结束当前整个循环,执行循环后的语句 - continue结束当次循环,继续执行后续次数循环 - break和continue可以与for和while循环搭配使用 - break仅跳出当前最内层循环
4.循环的高级用法
1.循环与else
1.语法
for <变量> in <遍历结构> : <语句块1> else :<语句块2>
while <条件> : <语句块1> else :<语句块2>
2.说明
- 当循环没有被break语句退出时,执行else语句块 - else语句块作为"正常"完成循环的奖励 - 这里else的用法与异常处理中else用法相似
可以判断是否为正常退出循环
4.模块3: random库的使用
1.random库概述
1.random库是使用随机数的Python标准库
2.伪随机数: 采用梅森旋转算法生成的(伪)随机序列中元素 - random库主要用于生成随机数 - 使用random库: import random
3.基本随机数函数: seed(), random()
4.扩展随机数函数: randint(), getrandbits(), uniform(), randrange(), choice(), shuffle()
2.基本随机数函数
3.扩展随机数函数
4.使用
- 能够利用随机数种子产生"确定"伪随机数 - 能够产生随机整数 - 能够对序列类型进行随机操作
5.实例6: 圆周率的计算
1.近似计算公式
2.蒙特卡罗方法
3.蒙特卡罗方法代码
#CalPiV2.py from random import random from time import perf_counter DARTS = 1000*1000 hits = 0.0 start = perf_counter() for i in range(1, DARTS+1): x, y = random(), random() dist = pow(x ** 2 + y ** 2, 0.5) if dist <= 1.0: hits = hits + 1 pi = 4 * (hits/DARTS) print("圆周率值是: {}".format(pi)) print("运行时间是: {:.5f}s".format(perf_counter() - start))
5.函数和代码复用
1.函数的定义与使用
1.函数的理解与定义
1.定义
- 函数是一段具有特定功能的、可重用的语句组 - 函数是一种功能的抽象,一般函数表达特定功能 - 两个作用:降低编程难度 和 代码复用
- 函数定义时,所指定的参数是一种占位符 - 函数定义后,如果不经过调用,不会被执行 - 函数定义时,参数是输入、函数体是处理、结果是输出 (IPO)
2.格式
def <函数名>(<参数(0个或多个)>) : <函数体> return <返回值>
2.函数的使用及调用过程
- 调用时要给出实际参数 - 实际参数替换定义中的参数 - 函数调用后得到返回值
3.函数的参数传递
1.参数个数
函数可以有参数,也可以没有,但必须保留括号
2.可选参数传递
函数定义时可以为某些参数指定默认值,构成可选参数
3.可变参数传递
函数定义时可以设计可变数量参数,即不确定参数总数量
def <函数名>(<参数>, *b ) :
4.参数传递的两种方式
函数调用时,参数可以按照位置或名称方式传递
4.函数的返回值
1.return保留字用来传递返回值 - 函数可以有返回值,也可以没有,可以有return,也可以没有 - return可以传递0个返回值,也可以传递任意多个返回值
5.局部变量和全局变量
1.局部变量和全局变量是不同变量
- 局部变量是函数内部的占位符,与全局变量可能重名但不同 - 函数运算结束后,局部变量被释放 - 可以使用global保留字在函数内部使用全局变量
2.局部变量为组合数据类型且未创建,等同于全局变量,真实创建后,仍为局部变量
3.基本数据类型,无论是否重名,局部变量与全局变量不同
6.lambda函数
1.lambda函数返回函数名作为结果
- lambda函数是一种匿名函数,即没有名字的函数 - 使用lambda保留字定义,函数名是返回结果 - lambda函数用于定义简单的、能够在一行内表示的函数
2.格式
<函数名> = lambda <参数>: <表达式>
3.谨慎使用lambda函数
- lambda函数主要用作一些特定函数或方法的参数 - lambda函数有一些固定使用方式,建议逐步掌握 - 一般情况,建议使用def定义的普通函数
2.实例7: 七段数码管绘制
0.基本思路
1.绘制单个数字对应的数码管
2.获得一串数字,绘制对应的数码管
3.获得当前系统时间,绘制对应的数码管
1.绘制单个数码管
- 七段数码管由7个基本线条组成 - 七段数码管可以有固定顺序 - 不同数字显示不同的线条
2.理解方法思维
- 模块化思维:确定模块接口,封装功能 - 规则化思维:抽象过程为规则,计算机自动执行 - 化繁为简:将大功能变为小功能组合,分而治之
3.代码复用与函数递归
1.代码复用与模块化设计
1.代码复用
1.把代码当成资源进行抽象
- 代码资源化:程序代码是一种用来表达计算的"资源" - 代码抽象化:使用函数等方法对代码赋予更高级别的定义 - 代码复用:同一份代码在需要时可以被重复使用
2.函数和对象是代码复用 的两种主要形式
1.函数:将代码命名,在代码层面建立了初步抽象
2.对象:属性和方法,<a>.<b> 和 <a>.<b>(),在函数之上再次组织进行抽象
2.模块化设计
1.分而治之
- 通过函数或对象封装将程序划分为模块及模块间的表达 - 具体包括:主程序、子程序和子程序间关系 - 分而治之:一种分而治之、分层抽象、体系化的设计思想
2.紧耦合 松耦合
- 紧耦合:两个部分之间交流很多,无法独立存在 - 松耦合:两个部分之间交流较少,可以独立存在 - 模块内部紧耦合、模块之间松耦合
2.函数递归的理解
1.递归的定义
1.函数定义中调用函数自身的方式
2.两个关键特征
- 链条:计算过程存在递归链条 - 基例:存在一个或多个不需要再次递归的基例
3.类似数学归纳法
递归是数学归纳法思维的编程体现
3.函数递归的调用过程
1.递归的实现
1.函数+分支语句
- 递归本身是一个函数,需要函数定义方式描述 - 函数内部,采用分支语句对输入参数进行判断 - 基例和链条,分别编写对应代码
4.函数递归实例解析
1.字符串反转
s[::-1] def rvs(s): if s == "" : return s else : return rvs(s[1:])+s[0]
2.汉诺塔
count = 0 def hanoi(n, src, dst, mid): global count if n == 1 : print("{}:{}->{}".format(1,src,dst)) count += 1 else : hanoi(n-1, src, mid, dst) print("{}:{}->{}".format(n,src,dst)) count += 1 hanoi(n-1, mid, dst, src)
4.模块4: PyInstaller库的使用
1.概述
1.将.py源代码转换成无需源代码的可执行文件
2.PyInstaller库是第三方库,使用前需要额外安装,需要使用pip工具
2.安装
(cmd命令行) pip install pyinstaller
3.使用说明
(cmd命令行,文件所在目录下) pyinstaller -F <文件名.py>
4.常用参数
5.实例8: 科赫雪花小包裹
6.组合数据类型
1.集合类型及操作
1.集合类型定义
1.集合是多个元素的无序组合
2.集合类型与数学中的集合概念一致 - 集合元素之间无序,每个元素唯一,不存在相同元素 - 集合元素不可更改,不能是可变数据类型
3.集合用大括号 {} 表示,元素间用逗号分隔 - 建立集合类型用 {} 或 set() - 建立空集合类型,必须使用set()
2.集合操作符
1.6个操作符
2.4个增强操作符
3.集合处理方法
4.集合类型应用场景
1.包含关系比较
2.数据去重:集合类型所有元素无重复
2.序列类型及操作
1.序列类型定义
1.序列是具有先后关系的一组元素
- 序列是一维元素向量,元素类型可以不同 - 类似数学元素序列: s0, s1, … , sn-1 - 元素间由序号引导,通过下标访问序列的特定元素
2.序列是一个基类类型
字符串类型 元组类型 列表类型
3.序号的定义
正向递增序号 反向递减序号
2.序列处理函数及方法
1.通用操作符
2.通用函数和方法
3.元组类型及操作
1.元组是序列类型的一种扩展
- 元组是一种序列类型,一旦创建就不能被修改 - 使用小括号 () 或 tuple() 创建,元素间用逗号 , 分隔 - 可以使用或不使用小括号
2.元组继承序列类型的全部通用操作,因为创建后不能修改,因此没有特殊操作
4.列表类型及操作
1.列表是序列类型的一种扩展,十分常用
- 列表是一种序列类型,创建后可以随意被修改 - 使用方括号 [] 或list() 创建,元素间用逗号 , 分隔 - 列表中各元素类型可以不同,无长度限制
2.方括号 [] 真正创建一个列表,赋值仅传递引用
3.操作函数和方法
5.序列类型应用场景
1.数据表示:元组 和 列表
- 元组用于元素不改变的应用场景,更多用于固定搭配场景 - 列表更加灵活,它是最常用的序列类型 - 最主要作用:表示一组有序数据,进而操作它们
2.元素遍历
for item in ls/tp : <语句块>
3.数据保护
如果不希望数据被程序所改变,转换成元组类型: lt = tuple(ls)
3.实例9: 基本统计值计算
1.获取多数据输入
def getNum(): #获取用户不定长度的输入 nums = [] iNumStr = input("请输入数字(回车退出): ") while iNumStr != "": nums.append(eval(iNumStr)) iNumStr = input("请输入数字(回车退出): ") return nums
4.字典类型及操作
1.字典类型定义
1.映射是一种键(索引)和值(数据)的对应,字典类型是“映射”的体现
2.键值对:键是数据索引的扩展 - 字典是键值对的集合,键值对之间无序 - 采用大括号{}和dict()创建,键值对用冒号: 表示
3.在字典变量中,通过键获得值: <字典变量>[<键>] = <值>
<字典变量> = {<键1>:<值1>, … , <键n>:<值n>}
2.字典处理函数及方法
1.操作函数和方法
3.字典类型应用场景
1.映射的表达
- 例如:统计数据出现的次数,数据是键,次数是值 - 最主要作用:表达键值对数据,进而操作它们
2.元素遍历
for k in d : <语句块>
5.模块5: jieba库的使用
1.概述
1.jieba是优秀的中文分词第三方库
2.中文文本需要通过分词获得单个的词语 - jieba是优秀的中文分词第三方库,需要额外安装 - jieba库提供三种分词模式,最简单只需掌握一个函数
2.分词的原理
- 利用一个中文词库,确定中文字符之间的关联概率 - 中文字符间概率大的组成词组,形成分词结果 - 除了分词,用户还可以添加自定义的词组
3.三种模式
- 精确模式:把文本精确的切分开,不存在冗余单词 - 全模式:把文本中所有可能的词语都扫描出来,有冗余 - 搜索引擎模式:在精确模式基础上,对长词再次切分
4.常用函数
6.实例10: 文本词频统计
1.文本去噪及归一化
def getText(): txt = open("hamlet.txt", "r").read() txt = txt.lower() #全部转化为小写字母 for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~': txt = txt.replace(ch, " ") #将文本中特殊字符替换为空格 return txt
2.统计英文文本单词频率
hamletTxt = getText() words = hamletTxt.split() #以空格分隔文本,转为为列表 counts = {} #新建一个字典 for word in words: #统计每个单词出现的频率,默认值为0 counts[word] = counts.get(word,0) + 1 items = list(counts.items()) #将字典转化为列表 items.sort(key=lambda x:x[1], reverse=True)#对第二个元素进行倒序排序 for i in range(20): word, count = items[i] print ("{0:<10}{1:>5}".format(word, count))
7.文件和数据结构格式化
1.文件的使用
1.文件的类型
1.文件的理解
1.文件是数据的抽象和集合
- 文件是存储在辅助存储器上的数据序列 - 文件是数据存储的一种形式 - 文件展现形态:文本文件和二进制文件
2.文本文件 vs. 二进制文件
- 文件文件和二进制文件只是文件的展示方式 - 本质上,所有文件都是二进制形式存储 - 形式上,所有文件采用两种方式展示
3.文本文件
- 由单一特定编码组成的文件,如UTF-8编码 - 由于存在编码,也被看成是存储着的长字符串 - 适用于例如:.txt文件、.py文件等
4.二进制文件
- 直接由比特0和1组成,没有统一字符编码 - 一般存在二进制0和1的组织结构,即文件格式 - 适用于例如:.png文件、.avi文件等
2.文件的打开和关闭
1.文件的打开
1.格式
<变量名> = open(<文件名>, <打开模式>)
2.文件路径
源文件同目录可省路径,否则"D:/PYE/f.txt",因为\有特殊含义
3.打开模式
2.文件的关闭
<变量名>.close()
3.文件内容的读取
1.方法
2.全文本操作
1.遍历全文本
1.一次读入,统一处理
txt = fo.read()
2.按数量读入,逐步处理
txt = fo.read(2) while txt != "": #对txt进行处理 txt = fo.read(2)
2.逐行遍历文件
1.一次读入,分行处理
for line in fo.readlines():
2.分行读入,逐行处理
for line in fo:
4.数据的文件写入
fo.writelines(ls) fo.seek(0) for line in fo: print(line)
2.实例11: 自动轨迹绘制
1.理解方法思维
- 自动化思维:数据和功能分离,数据驱动的自动运行 - 接口化设计:格式化设计接口,清晰明了 - 二维数据应用:应用维度组织数据,二维数据最常用
3.一维数据的格式化和处理
1.数据组织的维度
1.一维数据
1.由对等关系的有序或无序数据构成,采用线性方式组织
2.对应列表、数组和集合等概念
2.二维数据
1.由多个一维数据构成,是一维数据的组合形式
2.表格是典型的二维数据,表头是二维数据的一部分
3.多维数据
1.由一维或二维数据在新维度上扩展形成: 时间维度
4.高维数据
1.仅利用最基本的二元关系展示数据间的复杂结构: 键值对
2.一维数据的表示
1.数据间有序:使用列表类型
2.数据间无序:使用集合类型
3.一维数据的存储
1.空格分隔
- 使用一个或多个空格分隔进行存储,不换行 - 缺点:数据中不能存在空格
2.逗号分隔
- 使用英文半角逗号分隔数据进行存储,不换行 - 缺点:数据中不能有英文逗号
3.其他方式
- 使用其他符号或符号组合分隔,建议采用特殊符号 - 缺点:需要根据数据特点定义,通用性较差
4.一维数据的处理
1.从空格分隔的文件中读入数据
txt = open(fname).read() ls = txt.split() f.close()
2.采用空格分隔方式将数据写入文件
ls = ['中国', '美国', '日本'] f = open(fname, 'w') f.write(' '.join(ls)) f.close()
4.二维数据的格式化和处理
1.二维数据的表示
1.列表类型
1.列表类型可以表达二维数据,使用二维列表
2.使用两层for循环遍历每个元素
3.外层列表中每个元素可以对应一行,也可以对应一列
2.CSV数据存储格式
1.简介
0.CSV: Comma-Separated Values逗号分隔值
1.国际通用的一二维数据存储格式,一般.csv扩展名
2.每行一个一维数据,采用逗号分隔,无空行
3.Excel和一般编辑软件都可以读入或另存为csv文件
2.使用
1.如果某个元素缺失,逗号仍要保留
2.二维数据的表头可以作为数据存储,也可以另行存储
3.逗号为英文半角逗号,逗号与数据之间无额外空格
3.二维数据的存储
- 按行存或者按列存都可以,具体由程序决定 - 一般索引习惯:ls[row][column],先行后列 - 根据一般习惯,外层列表每个元素是一行,按行存
4.二维数据的处理
1.读入处理
从CSV格式的文件中读入数据
fo = open(fname) ls = [] for line in fo: line = line.replace("\n","") ls.append(line.split(",")) fo.close()
2.写入处理
将数据写入CSV格式的文件
ls = [[], [], []] #二维列表 f = open(fname, 'w') for item in ls: f.write(','.join(item) + '\n') f.close()
3.逐一处理
采用二层循环
ls = [[1,2], [3,4], [5,6]] #二维列表 for row in ls: for column in row: print(column)
5.模块6: wordcloud库的使用
1.基本介绍
1.概述
1.wordcloud是优秀的词云展示第三方库
2.词云以词语为基本单位,更加直观和艺术地展示文本
2.安装
(cmd命令行) pip install wordcloud
2.使用说明
1.基本使用
- wordcloud库把词云当作一个WordCloud对象 - wordcloud.WordCloud()代表一个文本对应的词云 - 可以根据文本中词语出现的频率等参数绘制词云 - 词云的绘制形状、尺寸和颜色都可以设定
2.常规方法
1.配置对象参数: w = wordcloud.WordCloud()
2.
3.生成过程
1.分隔: 以空格分隔单词
2.统计: 单词出现次数并过滤
3.字体: 根据统计配置字号
4.布局: 颜色环境尺寸
4.配置对象参数
5.应用实例
import wordcloud txt = "life is short, you need python" w = wordcloud.WordCloud(background_color = "white") w.generate(txt) w.to_file("pywcloud.png") import jieba import wordcloud txt = "程序设计语言是计算机能够理解和\ 识别用户操作意图的一种交互体系,它按照\ 特定规则组织计算机指令,使计算机能够自\ 动进行各种运算处理。" w = wordcloud.WordCloud( width=1000,font_path="msyh.ttc",height=700) w.generate(" ".join(jieba.lcut(txt))) #中文需要先分词并组成空格分隔字符串 w.to_file("pywcloud.png")
6.实例12: 政府工作报告词云
8.程序设计方法学
1.实例13: 体育竞技分析
1.问题分析
1.体育竞技分析
- 需求:毫厘是多少?如何科学分析体育竞技比赛? - 输入:球员的水平 - 输出:可预测的比赛成绩
2.模拟N场比赛
- 计算思维:抽象 + 自动化 - 模拟:抽象比赛过程 + 自动化执行N场比赛 - 当N越大时,比赛结果分析会越科学
3.比赛规则
- 双人击球比赛:A & B,回合制,5局3胜 - 开始时一方先发球,直至判分,接下来胜者发球 - 球员只能在发球局得分,15分胜一局
2.自顶向下(设计)
解决复杂问题的有效方法
- 将一个总问题表达为若干个小问题组成的形式 - 使用同样方法进一步分解小问题 - 直至,小问题可以用计算机简单明了的解决
3.自底向上(执行)
逐步组建复杂系统的有效测试方法
- 分单元测试,逐步组装 - 按照自顶向下相反的路径操作 - 直至,系统各部分以组装的思路都经过测试和验证
2.Python程序设计思想
1.计算思维与程序设计
1.计算思维
1.三种思维
- 逻辑思维:推理和演绎,数学为代表,A->B B->C A->C - 实证思维:实验和验证,物理为代表,引力波<-实验 - 计算思维:设计和构造,计算机为代表,汉诺塔递归
2.抽象和自动化
- 计算思维:Computational Thinking - 抽象问题的计算过程,利用计算机自动化求解 - 计算思维是基于计算机的思维方式 - 计算思维基于计算机强大的算力及海量数据 - 抽象计算过程,关注设计和构造,而非因果 - 以计算机程序设计为实现的主要手段
2.计算生态与Python语言
1.计算生态
1.简介
计算生态以开源项目为组织形式,充分利 用“共识原则”和“社会利他”组织人员,在 竞争发展、相互依存和迅速更迭中完成信息技 术的更新换代,形成了技术的自我演化路径
2.特点
竞争发展,相互依存,迅速更迭,没有顶层设计、以功能为单位
3.发展特点
1.以开源项目为代表的大量第三方库
Python语言提供 >15万个第三方库
2.库的建设经过野蛮生长和自然选择
同一个功能,Python语言2个以上第三方库
3.库之间相互关联使用,依存发展
Python库间广泛联系,逐级封装
4.社区庞大,新技术更迭迅速
AlphaGo深度学习算法采用Python语言开源
4.价值
创新:跟随创新、集成创新、原始创新 - 加速科技类应用创新的重要支撑 - 发展科技产品商业价值的重要模式 - 国家科技体系安全和稳固的基础
5.运用
刀耕火种 -> 站在巨人的肩膀上 - 编程的起点不是算法而是系统 - 编程如同搭积木,利用计算生态为主要模式 - 编程的目标是快速解决问题
6.优质的计算生态
http://python123.io
3.用户体验与软件产品
1.用户体验
- 用户体验指用户对产品建立的主观感受和认识 - 关心功能实现,更要关心用户体验,才能做出好产品 - 编程只是手段,不是目的,程序最终为人类服务
2.提高方法
1.进度展示
- 如果程序需要计算时间,可能产生等待,请增加进度展示 - 如果程序有若干步骤,需要提示用户,请增加进度展示 - 如果程序可能存在大量次数的循环,请增加进度展示
2.异常处理
- 当获得用户输入,对合规性需要检查,需要异常处理 - 当读写文件时,对结果进行判断,需要异常处理 - 当进行输入输出时,对运算结果进行判断,需要异常处理
3.其他类方法
- 打印输出:特定位置,输出程序运行的过程信息 - 日志文件:对程序异常及用户使用进行定期记录 - 帮助信息:给用户多种方式提供帮助信息
4.基本的程序设计模式
1.从IPO开始
- I:Input 输入,程序的输入 - P:Process 处理,程序的主要逻辑 - O:Output 输出,程序的输出 - 确定IPO:明确计算部分及功能边界 - 编写程序:将计算求解的设计变成现实 - 调试程序:确保程序按照正确逻辑能够正确运行
2.自顶向下设计
3.模块化设计
1.概念
- 通过函数或对象封装将程序划分为模块及模块间的表达 - 具体包括:主程序、子程序和子程序间关系 - 分而治之:一种分而治之、分层抽象、体系化的设计思想
2.原则
- 紧耦合:两个部分之间交流很多,无法独立存在 - 松耦合:两个部分之间交流较少,可以独立存在 - 模块内部紧耦合、模块之间松耦合
4.配置化设计
- 引擎+配置:程序执行和配置分离,将可选参数配置化 - 将程序开发变成配置文件编写,扩展功能而不修改程序 - 关键在于接口设计,清晰明了、灵活可扩展
5.应用开发的四个步骤
1.产品定义
对应用需求充分理解和明确定义,而不仅是功能定义,要考虑商业模式
2.系统架构
以系统方式思考产品的技术实现,关注数据流、模块化、体系架构
3.设计与实现
结合架构完成关键设计及系统实现,结合可扩展性、灵活性等进行设计优化
4.用户体验
从用户角度思考应用效果,用户至上,体验优先,以用户为中心
3.Python第三方库安装
1.看见更大的Python世界
1.Python社区
1.网址
>13万个第三方库 https://pypi.org/
2.PyPI
- PyPI: Python Package Index - PSF维护的展示全球Python计算生态的主站 - 学会检索并利用PyPI,找到合适的第三方库开发程序
3.实例
- 第1步:在pypi.org搜索 blockchain - 第2步:挑选适合开发目标的第三方库作为基础 - 第3步:完成自己需要的功能
2.三种安装方法
- 方法1(主要方法): 使用pip命令 - 方法2: 集成安装方法 - 方法3: 文件安装方法
2.第三方库的pip安装方法
1.使用pip安装工具(命令行下执行)
2.常用的pip命令
1.pip install <第三方库名>
安装指定的第三方库
2.pip install –U <第三方库名>
使用-U标签更新已安装的指定第三方库
3.pip uninstall <第三方库名>
卸载指定的第三方库
4.pip download <第三方库名>
下载但不安装指定的第三方库
5.pip show <第三方库名>
列出某个指定第三方库的详细信息
6.pip search <关键词>
根据关键词在名称和介绍中搜索第三方库:pip search blockchain
7.pip list
列出当前系统已经安装的第三方库
3.第三方库的集成安装方法
0.简介
结合特定Python开发工具的批量安装
1.Anaconda
https://www.continuum.io - 支持近800个第三方库 - 包含多个主流工具 - 适合数据计算领域开发
4.第三方库的文件安装方法
1.原因
为什么有些第三方库用pip可以下载,但无法安装? - 某些第三方库pip下载后,需要编译再安装 - 如果操作系统没有编译环境,则能下载但不能安装 - 可以直接下载编译后的版本用于安装吗?
2.方法
http://www.lfd.uci.edu/~gohlke/pythonlibs/
- 步骤1:在UCI页面上搜索wordcloud - 步骤2:下载对应版本的文件 - 步骤3:使用pip install <文件名>安装
4.模块7: os库的基本使用
1.基本介绍
1.简介
- os库提供通用的、基本的操作系统交互功能 - os库是Python标准库,包含几百个函数 - 常用路径操作、进程管理、环境参数等几类
2.常用
- 路径操作:os.path子库,处理文件路径及信息 - 进程管理:启动系统中其他程序 - 环境参数:获得系统软硬件信息等环境参数
2.路径操作
os.path.abspath(path) os.path.normpath(path) os.path.relpath(path) os.path.dirname(path) os.path.basename(path) os.path.join(path) os.path.exists(path) os.path.isfile(path) os.path.isdir(path) os.path.getatime(path) os.path.getmtime(path) os.path.getctime(path) os.path.getsize(path)
3.进程管理
os.system(command) - 执行程序或命令command - 在Windows系统中,返回值为cmd的调用返回信息
import os os.system("C:\\Windows\\System32\\calc.exe") //计算器 >>> 0
4.环境参数
5.实例14: 第三库自动安装脚本
1.问题分析
- 需求:批量安装第三方库需要人工干预,能否自动安装? - 自动执行pip逐一根据安装需求安装
2.常用库
3.自动安装代码
#BatchInstall.py 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("pip install " + lib) print("Successful") except: print("Failed Somehow")
9.计算生态概览
1.从数据处理到人工智能
- Numpy、Pandas、SciPy - Matplotlib、Seaborn、Mayavi - PyPDF2、NLTK、python-docx - Scikit-learn、TensorFlow、MXNet
0.简介
数据表示->数据清洗->数据统计->数据可视化->数据挖掘->人工智能 - 数据表示:采用合适方式用程序表达数据 - 数据清理:数据归一化、数据转换、异常值处理 - 数据统计:数据的概要理解,数量、分布、中位数等 - 数据可视化:直观展示数据内涵的方式 - 数据挖掘:从数据分析获得知识,产生数据外的价值 - 人工智能:数据/语言/图像/视觉等方面深度分析与决策
1.数据分析
1.Numpy: 表达N维数组的最基础库
- Python接口使用,C语言实现,计算速度优异 - Python数据分析及科学计算的基础库,支撑Pandas等 - 提供直接的矩阵运算、广播函数、线性代数等功能
http://www.numpy.org
2.Pandas: Python数据分析高层次应用库
- 提供了简单易用的数据结构和数据分析工具 - 理解数据类型与索引的关系,操作索引即操作数据 - Python最主要的数据分析功能库,基于Numpy开发 Series = 索引 + 一维数据 DataFrame = 行列索引 + 二维数据
http://pandas.pydata.org
3.SciPy: 数学、科学和工程计算功能库
- 提供了一批数学算法及工程数据运算功能 - 类似Matlab,可用于如傅里叶变换、信号处理等应用 - Python最主要的科学计算功能库,基于Numpy开发
http://www.scipy.org
2.数据可视化
1.Matplotlib: 高质量的二维数据可视化功能库
- 提供了超过100种数据可视化展示效果 - 通过matplotlib.pyplot子库调用各可视化效果 - Python最主要的数据可视化功能库,基于Numpy开发
http://matplotlib.org
2.Seaborn: 统计类数据可视化功能库
- 提供了一批高层次的统计类数据可视化展示效果 - 主要展示数据间分布、分类和线性关系等内容 - 基于Matplotlib开发,支持Numpy和Pandas
http://seaborn.pydata.org/
3.Mayavi: 三维科学数据可视化功能库
- 提供了一批简单易用的3D科学计算数据可视化展示效果 - 目前版本是Mayavi2,三维可视化最主要的第三方库 - 支持Numpy、TVTK、Traits、Envisage等第三方库
http://docs.enthought.com/mayavi/mayavi/
3.文本处理
1.PyPDF2: 用来处理pdf文件的工具集
- 提供了一批处理PDF文件的计算功能 - 支持获取信息、分隔/整合文件、加密解密等 - 完全Python语言实现,不需要额外依赖,功能稳定
http://mstamy2.github.io/PyPDF2 from PyPDF2 import PdfFileReader, PdfFileMerger merger = PdfFileMerger() input1 = open("document1.pdf", "rb") input2 = open("document2.pdf", "rb") merger.append(fileobj = input1, pages = (0,3)) merger.merge(position = 2, fileobj = input2, pages = (0,1)) output = open("document-output.pdf", "wb") merger.write(output)
2.NLTK: 自然语言文本处理第三方库
- 提供了一批简单易用的自然语言文本处理功能 - 支持语言文本分类、标记、语法句法、语义分析等 - 最优秀的Python自然语言处理库
http://www.nltk.org/ from nltk.corpus import treebank t = treebank.parsed_sents('wsj_0001.mrg')[0] t.draw()
3.Python-docx: 创建或更新Word文件的第三方库
- 提供创建或更新.doc .docx等文件的计算功能 - 增加并配置段落、图片、表格、文字等,功能全面
http://python-docx.readthedocs.io/en/latest/index.html from docx import Document document = Document() document.add_heading('Document Title', 0) p = document.add_paragraph('A plain paragraph having some ') document.add_page_break() document.save('demo.docx')
4.机器学习
1.Scikit-learn: 机器学习方法工具集
- 提供一批统一化的机器学习方法功能接口 - 提供聚类、分类、回归、强化学习等计算功能 - 机器学习最基本且最优秀的Python第三方库
http://scikit-learn.org/
2.TensorFlow: AlphaGo背后的机器学习计算框架
- 谷歌公司推动的开源机器学习框架 - 将数据流图作为基础,图节点代表运算,边代表张量 - 应用机器学习方法的一种方式,支撑谷歌人工智能应用
https://www.tensorflow.org/ import tensorflow as tf init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) res = sess.run(result) print('result:', res)
3.MXNet: 基于神经网络的深度学习计算框架
- 提供可扩展的神经网络及深度学习计算功能 - 可用于自动驾驶、机器翻译、语音识别等众多领域 - Python最重要的深度学习计算框架
https://mxnet.incubator.apache.org/
2.实例15: 霍兰德人格分析雷达图
3.从Web解析到网络空间
- Requests、Scrapy、pyspider - Beautiful Soup、Re、Python-Goose - Django、Pyramid、Flask - WeRobot、aip、MyQR
1.网络爬虫
1.Requests: 最友好的网络爬虫功能库
- 提供了简单易用的类HTTP协议网络爬虫功能 - 支持连接池、SSL、Cookies、HTTP(S)代理等 - Python最主要的页面级网络爬虫功能库
http://www.python-requests.org/ import requests r = requests.get('https://api.github.com/user',auth=('user', 'pass')) r.status_code r.headers['content-type'] r.encoding r.text
2.Scrapy: 优秀的网络爬虫框架
- 提供了构建网络爬虫系统的框架功能,功能半成品 - 支持批量和定时网页爬取、提供数据处理流程等 - Python最主要且最专业的网络爬虫框架
https://scrapy.org
3.pyspider: 强大的Web页面爬取系统
- 提供了完整的网页爬取系统构建功能 - 支持数据库后端、消息队列、优先级、分布式架构等 - Python重要的网络爬虫类第三方库
http://docs.pyspider.org
2.Web信息提取
1.Beautiful Soup: HTML和XML的解析库
- 提供了解析HTML和XML等Web信息的功能 - 又名beautifulsoup4或bs4,可以加载多种解析引擎 - 常与网络爬虫库搭配使用,如Scrapy、requests等
https://www.crummy.com/software/BeautifulSoup/bs4
2.Re: 正则表达式解析和处理功能库
- 提供了定义和解析正则表达式的一批通用功能 - 可用于各类场景,包括定点的Web信息提取 - Python最主要的标准库之一,无需安装
https://docs.python.org/3.6/library/re.html
3.Python-Goose: 提取文章类型Web页面的功能库
- 提供了对Web页面中文章信息/视频等元数据的提取功能 - 针对特定类型Web页面,应用覆盖面较广 - Python最主要的Web信息提取库
https://github.com/grangier/python-goose from goose import Goose url = 'http://www.elmundo.es/elmundo/2012/10/28/espana/1351388909.html' g = Goose({'use_meta_language': False, 'target_language':'es'}) article = g.extract(url=url) article.cleaned_text[:150]
3.Web网站开发
1.Django: 最流行的Web应用框架
- 提供了构建Web系统的基本应用框架 - MTV模式:模型(model)、模板(Template)、视图(Views) - Python最重要的Web应用框架,略微复杂的应用框架
https://www.djangoproject.com
2.Pyramid: 规模适中的Web应用框架
- 提供了简单方便构建Web系统的应用框架 - 不大不小,规模适中,适合快速构建并适度扩展类应用 - Python产品级Web应用框架,起步简单可扩展性好
https://trypyramid.com/ 10行左右Hello Word程序 from wsgiref.simple_server import make_server from pyramid.config import Configurator from pyramid.response import Response def hello_world(request): return Response('Hello World!') if __name__ == '__main__': with Configurator() as config: config.add_route('hello', '/') config.add_view(hello_world, route_name='hello') app = config.make_wsgi_app() server = make_server('0.0.0.0', 6543, app) server.serve_forever()
3.Flask: Web应用开发微框架
- 提供了最简单构建Web系统的应用框架 - 特点是:简单、规模小、快速 - Django > Pyramid > Flask
http://flask.pocoo.org from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!'
4.网络应用开发
1.WeRoBot: 微信公众号开发框架
- 提供了解析微信服务器消息及反馈消息的功能 - 建立微信机器人的重要技术手段
https://github.com/offu/WeRoBot - 对微信每个消息反馈一个Hello World import werobot robot = werobot.WeRoBot(token='tokenhere') @robot.handler def hello(message): return 'Hello World!'
2.aip: 百度AI开放平台接口
- 提供了访问百度AI服务的Python功能接口 - 语音、人脸、OCR、NLP、知识图谱、图像搜索等领域 - Python百度AI应用的最主要方式
https://github.com/Baidu-AIP/python-sdk
3.MyQR: 二维码生成第三方库
- 提供了生成二维码的系列功能 - 基本二维码、艺术二维码和动态二维码
https://github.com/sylnsfar/qrcode
4.从人机交互到艺术设计
- PyQt5、wxPython、PyGObject - PyGame、Panda3D、cocos2d - VR Zero、pyovr、Vizard - Quads、ascii_art、turtle
1.图形用户界面
1.PyQt5: Qt开发框架的Python接口
- 提供了创建Qt5程序的Python API接口 - Qt是非常成熟的跨平台桌面应用开发系统,完备GUI - 推荐的Python GUI开发第三方库
https://www.riverbankcomputing.com/software/pyqt
2.wxPython: 跨平台GUI开发框架
- 提供了专用于Python的跨平台GUI开发框架 - 理解数据类型与索引的关系,操作索引即操作数据 - Python最主要的数据分析功能库,基于Numpy开发
https://www.wxpython.org import wx app = wx.App(False) frame = wx.Frame(None, wx.ID_ANY, "Hello World") frame.Show(True) app.MainLoop()
3.PyGObject: 使用GTK+开发GUI的功能库
- 提供了整合GTK+、WebKitGTK+等库的功能 - GTK+:跨平台的一种用户图形界面GUI框架 - 实例:Anaconda采用该库构建GUI
https://pygobject.readthedocs.io import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk window = Gtk.Window(title="Hello World") window.show() window.connect("destroy", Gtk.main_quit) Gtk.main()
2.游戏开发
1.PyGame: 简单的游戏开发功能库
- 提供了基于SDL的简单游戏开发功能及实现引擎 - 理解游戏对外部输入的响应机制及角色构建和交互机制 - Python游戏入门最主要的第三方库
http://www.pygame.org
2.Panda3D: 开源、跨平台的3D渲染和游戏开发库
- 一个3D游戏引擎,提供Python和C++两种接口 - 支持很多先进特性:法线贴图、光泽贴图、卡通渲染等 - 由迪士尼和卡尼基梅隆大学共同开发
http://www.panda3d.org
3.cocos2d: 构建2D游戏和图形界面交互式应用的框架
- 提供了基于OpenGL的游戏开发图形渲染功能 - 支持GPU加速,采用树形结构分层管理游戏对象类型 - 适用于2D专业级游戏开发
http://python.cocos2d.org/
3.虚拟现实
1.VR Zero: 在树莓派上开发VR应用的Python库
- 提供大量与VR开发相关的功能 - 针对树莓派的VR开发库,支持设备小型化,配置简单化 - 非常适合初学者实践VR开发及应用
https://github.com/WayneKeenan/python-vrzero
2.pyovr: Oculus Rift的Python开发接口
- 针对Oculus VR设备的Python开发库 - 基于成熟的VR设备,提供全套文档,工业级应用设备 - Python+虚拟现实领域探索的一种思路
https://github.com/cmbruns/pyovr
3.Vizard: 基于Python的通用VR开发引擎
- 专业的企业级虚拟现实开发引擎 - 提供详细的官方文档 - 支持多种主流的VR硬件设备,具有一定通用性
http://www.worldviz.com/vizard-virtual-reality-software
4.图形艺术
1.Quads: 迭代的艺术
- 对图片进行四分迭代,形成像素风 - 可以生成动图或静图图像 - 简单易用,具有很高展示度
https://github.com/fogleman/Quads
2.ascii_art: ASCII艺术库
- 将普通图片转为ASCII艺术风格 - 输出可以是纯文本或彩色文本 - 可采用图片格式输出
https://github.com/jontonsoup4/ascii_art
3.turtle: 海龟绘图体系
https://docs.python.org/3/library/turtle.html
5.实例16: 玫瑰花绘制
6.全课程总结与学习展望
10.面向对象编程
1.面向对象程序设计基础
1.封装性
1.定义
将一个数据和与这个数据有关的操作集合放在一起,形成一个实体——对象。用户不必知道对象行为的实现细节,只需要根据对象提供的外部特性接口访问对象即可
2.目的
将对象的用户与设计者分开,用户不必知道对象行为的细节,只需用设计者提供的协议命令对象去做就可以
2.继承性
1.定义
在面向对象程序设计中,根据既有类(基类)派生出新类(派生类)的现象称为类的继承机制,亦称为继承性
2.关系
派生类无需重新定义在父类(基类)中已经定义的属性和行为,而是自动地拥有其父类的全部属性与行为。派生类既具有继承下来的属性和行为,又具有自己新定义的属性和行为。当派生类又被它更下层的子类继承时,它继承的及自身定义的属性和行为又被下一级子类继承下去
3.优点
面向对象程序设计的继承机制实现了代码重用,有效地缩短了程序的开发周期
3.多态性
指基类中定义的属性或行为,被派生类继承之后,可以具有不同的数据类型或表现出不同的行为特性,使得同样的消息可以根据发送消息对象的不同而采用多种不同的行为方式
4.总结
Python完全采用了面向对象程序设计的思想,是真正面向对象的高级动态编程语言,完全支持面向对象的基本功能,如封装、继承、多态。但与其他面向对象程序设计语言不同的是,Python中对象的概念很广泛,Python中的一切内容都可以称为对象。例如,字符串、列表、字典、元组等内置数据类型都具有和类完全相似的语法和用法。创建类时用变量形式表示的对象属性称为数据成员或成员属性,用函数形式表示的对象行为称为成员函数或成员方法,成员属性和成员方法统称为类的成员
2.类和对象
1.类的定义和使用
1.类定义
Python使用class关键字来定义类,创建类时,用变量形式表示的对象属性称为数据成员或属性(成员变量),用函数形式表示的对象行为称为成员函数(成员方法)。 成员属性和成员方法统称为类的成员
class 类名: 属性(成员变量) 属性 … 成员函数(成员方法) 例:定义一个Person人员类。 class Person: num=1 #成员变量 def SayHello(self): #成员函数 print(" Hello!") ;
2.对象定义
对象是类的实例。如果人类是一个类的话,那么某个具体的人就是一个对象。只有定义了具体的对象,并通过“对象名.成员”的方式来访问其中的数据成员或成员方法 语法: 对象名=类名()
例:定义Person类的对象p. p=Person() p.SayHello() #访问成员函数SayHello() 运行结果如下: Hello!
2.构造函数
类可以定义一个特殊的叫做__init__( )的方法。 一个类定义了__init__( )方法以后,类实例化时就会自动为新生成的类实例调用__init__( )方法。构造函数一般用于完成对象数据成员设置初值或进行其他必要的初始化工作。如果用户未涉及构造函数,Python将提供一个默认的构造函数
3.析构函数
Python中类的析构函数是__del__,用来释放对象占用的资源, 在Python收回对象空间之前自动执行。如果用户未设计析构函数, Python将提供一个默认的析构函数进行必要的清理工作
4.实例属性和类属性
实例属性属于实例(对象),只能通过对象名访问; 类属性属于类可通过类名访问, 也可以通过对象名访问,为类的所有实例共享 实例属性用 self. 类属性用 类名. 可以直接动态为类增加属性和成员方法
5.私有成员和公有成员
1.定义形式
在定义类的属性时,如果属性名以两个下划线“__”开头则表示是私有属性,否则是公有属性
2.私有属性
私有属性在类的外部不能直接访问,需通过调用对象的公有成员方法来访问,或者通过Python支持的特殊方式来访问。Python提供了访问私有属性的特殊方式,可用于程序的测试和调试,对于成员方法也有同样性质 方法如下: 对象名._类名+私有成员
3.注意点
私有属性是为了数据封装和保密而设的属性,一般只能在类的成员方法(类的内部)中使用访问,虽然Python支持一种特殊的方式来从外部直接访问类的私有成员,但是并不推荐这种做法。公有属性是可以公开使用的,既可以在类的内部进行访问,也可以在外部程序中使用
4.圆点作用
在IDLE环境中,在对象或类名后面加上一个圆点“.”,会自动列出其所有公开成员,模块也具有同样的特点。如果在圆点“.”后面再加上一个下划线,则会列出该对象或类的所有成员,包括私有成员
5.举例
6.方法
1.三类方法
公有方法、私有方法、静态方法
2.私有方法
私有方法的名字以两个下划线“__”开始,每个对象都有自己的公有方法和私有方法,在这两类方法中可以访问属于类和对象的成员
3.调用方式
公有方法通过对象名直接调用,私有方法不能通过对象名直接调用,只能在属于对象的方法中通过“self”调用或在外部通过Python支持的特殊方式来调用
4.静态方法
静态方法用@staticmethod定义
5.举例
3.类的继承和多态
1.类的继承
1.语法
class 派生类名(基类名): #基类名写在括号里 派生类成员
2.关系
在继承关系中,已有的、设计好的类称为父类戒基类,新设计的类称为子类戒派生类。派生类可以继承父类的公有成员,但是不能继承其私有成员
3.特点
1.在继承中基类的构造函数(__init__()方法)不会被自动调用,需要在其派生类的构造中亲自专门调用
2.如果需要在派生类中调用基类的方法时,通过“基类名.方法名()”的方式来实现,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数。也可以使用内置函数super()实现这一目的
3.Python总是首先查找对应类型的方法,如果不能在派生类中找到对应的方法,会再到基类中逐个查找。即先在本类中查找调用的方法,找不到才去基类中找
4.举例
5.检测关系
1.issubclass(sub,sup)布尔函数,判断一个类sub是另一个类sup的子类或者子孙类,是则返回true
2.isinstance(obj,Class)布尔函数,如果obj是Class类或者是Class子类的实例对象,则返回true
2.类的多继承
1.语法
class SubClassName (ParentClass1[, ParentClass2, ...]): 派生类成员
3.方法重写
重写必须出现在继承中。它是指当派生类继承了基类的方法之后,如果基类方法的功能不能满足需求,需要对基类中的某些方法迚行修改,可以在派生类重写基类的方法,这就是重写
4.多态
1.说明
1.当定义一个class的时候,实际上就定义了一种数据类型。定义的数据类型和Python自带的数据类型,如string、list、dict没什么区别
2.在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看作是父类。但是,反过来就不行
2.好处
当我们需要传入Dog、Cat、Tortoise……时,我们只需要接收Animal类型就可以了,因为Dog、Cat、Tortoise……都是Animal类 型,然后,按照Animal类型迚行操作即可。由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法,这就是多态的意思
3.开闭原则
调用方只管调用,不管细节,而当新增一种Animal的子类时,只要确保run()方法编写 正确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则:对扩展开放,允许新增Animal子类;对修改封闭,不需要修改依赖Animal类型的run_twice()等函数
5.运算符重载
在Python中可以通过运算符重载来实现对象之间的运算。 Python把运算符不类的方法关联起来, 每个运算符对应一个函数,因此重载运算符就是实现函数。 常用的运算符不函数方法的对应关系如下表
4.面向对象应用实例
Python相关内容
0.代码书写技巧
1.格式
1.想要将几行在一行中书写
在每行的最后加上分号;
2.一行太长想要换行书写
在此行的最后加上右斜杠\即可
1.单词
0.相关
1.IDLE
Integrated Development and Learning Environment 是Python的集成开发环境
1.形容词
1.indented
缩进的
2.命令提示行命令
1.操作目录
1.cd 改变当前的子目录
2.CD命令不能改变当前所在的盘,CD..退回到上一级目录,CD\表示返回到当前盘的目录下,CD无参数时显示当前目录名
3.d: 改变所在盘
2.Python相关
1.安装指定包
pip install 包名
2.打包程序为可执行文件
pyinstaller -F 文件名.py
3.查看安装了哪些包
pip list
4.查看包的具体信息
pip show 包名
5.pip安装在哪里
pip -V
3.常见错误
1.问题格式
1.expected an indented block
缩进出现问题
2.命令行安装
0.看错误类型,一定要看最后分割线的上一行的错误
1.Error:Command errored out with exit status 1
下载对应的第三方安装包,进入到下载目录进行安装下载文件的全名
2.error: Microsoft Visual C++ 14.0 is required
安装Microsoft Visual C++ 14.0,博客有下载地址visualcppbuildtools_full
3.error: invalid command 'bdist_wheel'
pip3 install wheel
3.代码书写
1.没有的格式
1.没有i++, 只能写成i+=1
2.不同的格式
1.类
0.定义类时,第一参数必须是self,所有方法也是一样,调用本类成员时必须用self.成员
1.类中调用自身进行递归必须用 self.自身函数(参数中不用加self)
2.__两个下划线开头,定义私有方法
2.数字
1.正负无穷的表示
float("inf"), float("-inf")
4.代码
1.列表
1.需要明确使用列表下标时,创建列表必须用G = [0]*(n+1) #长度为n+1的列表,否则会下标越界
2.创建定长的二维列表时,如果*n失效,试试用循环
dp = [[float('inf') for _ in range(n)] for _ in range(n)]
4.常用代码
1.词典
1.统计出现次数
counts[word] = counts.get(word,0) + 1
2.列表
1.列表指定关键字排序
items.sort(key=lambda x:x[1], reverse=True)#对第二个元素进行倒序排序
2.将字符串列表中每个元素转化为数字列表
list(map(eval,list))
3.将列表中所有元素反转
res[::-1]
4.列表中两数交换
res[i],res[j] = res[j],res[i] #不需要中间变量
5.分配长度固定的列表
G = [0]*(n+1) #长度为n+1的列表
6.求arr列表中区间[i,j]中最大元素
max(arr[i:j + 1])
7.用该元素分割中序列表
left_l = inorder[:idx] right_l = inorder[idx+1:]
3.循环/判断
1.只需要确定循环次数,不需要获取值时
for _ in range(len(queue)):
2.if...else的简略写法
node.left = recur_func(left_l) if left_l else None
3.逆序循环
for i in range(len(postorder)-2, -1,-1)
4.映射
1.将可遍历结构快速转化为对应下标的映射
index = {element: i for i, element in enumerate(inorder)}
利用list.index(x)也可以实现,但每次都要遍历列表,时间为O(n),上面为O(1)
5.常用方法
1.系统自带
0.分类
1.类型转换
1.int(x)
1.浮点类型转为整数类型时,小数部分直接舍去
2.float(x)
3.str(x)
1.sorted(num)
1.对指定元素进行排序
2.map(func,list)
1.将第一个参数的功能作用于第二个参数的每一个元素
map(eval,list)
3.len(i)
1.获得长度,可以是任意的类型
4.enumerate()
1.将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据下标和数据,一般用在 for 循环当中: for i, element in enumerate(seq):
2.enumerate(sequence, [start=0]),小标从0开始,返回 enumerate(枚举) 对象
5.type(x)
1.对变量x的类型进行判断,适用于任何数据类型
2.如果需要在条件判断中使用变量类型作为条件,可以使用type()函数进行直接比较
if type(n) == type(123):
2.列表[]
1.当堆栈使用
1.入栈
stack.append()
2.出栈
stack.pop()
弹出最后一个元素
3.返回栈顶元素
list中无peek方法,只能先pop,再append
2.当队列使用
1.入队
queue.append()
2.出队
queue.pop(0)
出队第一个元素
3.队列deque
1.双端队列当队列使用
1.入队
queue.append()
2.出队
queue.popleft()
6.1常用数据结构/算法
1.链表
2.栈
1.单调栈
1.定义
栈内元素单调递增或者单调递减的栈,单调栈只能在栈顶操作
2.性质
1.单调栈里的元素具有单调性
2.元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除
3.使用单调栈可以找到元素向左遍历第一个比他小的元素(递增栈)/找到元素向左遍历第一个比他大的元素
3.队列
4.树
1.BST: 二叉搜索树 二叉排序树
1.定义
1.左子树上所有结点的关键字小于根结点
2.右子树上所有结点的关键字大于根结点
3.左右子树又各是一颗二叉排序树
中序遍历可得到递增有序数列
2.AVL: 平衡二叉树
1.定义
1.平衡二叉树: 任一结点的左右子树的高度差的绝对值不超过1
2.平衡因子: 结点左右子树的高度差 -1,0,1
3.mct: 最小生成树
1.定义
任何只由G的边构成,并包含G的所有顶点的树称为G的生成树
5.图
1.术语
1.团集(完全子图)
点的集合:任两点之间均有边相连
1.1 点独立集
点的集合: 任意两点之间都没有边
2.哈密尔顿图Hamilton
无向图,由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次, 闭合的哈密顿路径称作哈密顿回路,含有图中所有顶点的路径称作哈密顿路径
6.算法
1.BFS: 广度优先搜索
1.定义
类似于二叉树的层次遍历算法,优先考虑最早发现的结点
2.DFS: 深度优先搜索
1.定义
类似于树的先序遍历,优先考虑最后发现的结点
主题
主题
主题
经典思想
0.常遇问题
1.防止溢出
1.计算很多数乘积时,为防止溢出,可以对乘积取对数,变成相加的形式
1.数据结构
1.数组
1.数组中同一个元素不能使用两遍的遍历
for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) {
2.环形数组问题
有首尾不能同时的约束时,将环形数组分解为若干个普通数组问题,求最大值
2.哈希表
0.只要涉及到统计某个数/值的出现次数,就用哈希表
1.哈希表中包含某数的对应数,且不是它本身
for (int i = 0; i < nums.length; i++) { int complement = target - nums[i]; if (map.containsKey(complement) && map.get(complement) != i)
3.链表
1.两个链表中的数相加
1.逆序时: 一定单独考虑最后一次相加可能的进位问题
2.正序时: 将链表逆转/使用堆栈的数据结构实现逆转
2.有序单链表求中位数(左闭右开)
设当前链表的左端点为left,右端点right,包含关系为「左闭右开」,给定的链表为单向链表,访问后继元素十分容易,但无法直接访问前驱元素。因此在找出链表的中位数节点mid之后,如果设定「左闭右开」的关系,就可以直接用(left,mid) 以及(mid.next,right) 来表示左右子树对应的列表了,不需要mid.pre,并且,初始的列表也可以用(head,null)方便地进行表示
4.字符
1.记录每个字符是否出现过
哈希集合: Set<Character> occ = new HashSet<Character>(); occ.contains(a)
5.数字
1.两个个位数相加的进位获取
int sum = carry+x+y; int carry = sum/10;
2.整数反转
要在没有辅助堆栈/数组的帮助下 “弹出” 和 “推入” 数字,我们可以使用数学方法,先取出最后一位,然后除以10,将最后一位去掉,反转数不断将自身乘10后,加上取出的最后一位数,同时先判断是否会溢出
6.树
1.寻找前驱结点
向左走一步,然后一直向右走至无法走为止
predecessor = root.left; while (predecessor.right != null && predecessor.right != root) { predecessor = predecessor.right; }
7.集合
1.去除列表中重复元素
s = set(ls); lt = list(s)
8.元组
1.如果不希望数据被程序所改变,转换成元组类型
lt = tuple(ls)
2.经典算法
1.双指针
1.当需要枚举数组中的两个元素时,如果发现随着第一个元素的递增,第二个元素是递减的,那么就可以使用双指针的方法,将第二个指针从数组尾开始遍历,同时保证第二个指针大于第一个指针,将枚举的时间复杂度从 O(N^2)减少至 O(N)
2.查找的结果是某个范围时,利用双指针不断变化,类似于滑动窗口的机制
2.动态规划
1.要求的数,可以通过上一个以求的数通过某种操作得到,找到动态转移方程
3.快慢指针法
初始时,快指针fast 和慢指针slow 均指向链表的左端点left。我们将快指针fast 向右移动两次的同时,将慢指针slow 向右移动一次,直到快指针到达边界(即快指针到达右端点或快指针的下一个节点是右端点)。此时,慢指针对应的元素就是中位数
常用库
1.turtle绘图
1.窗体布局
1.turtle.setup(width, height, startx, starty)
2.setup()设置窗体大小及位置,4个参数中后两个可选,setup()不是必须的
2.空间坐标体系/运动控制
1.绝对坐标
1.turtle.goto(x, y)
2.海龟坐标
1.turtle.fd(d),turtle.bk(d),turtle.circle(r,angle)
3.角度坐标体系/方向控制
1.绝对角度
1.turtle.seth(angle)
seth()改变海龟行进方向,angle为绝对度数,seth()只改变方向但不行进
2.海龟角度
turtle.left(angle),turtle.right(angle)
4.画笔控制函数
1.turtle.penup() 别名 turtle.pu() 抬起画笔,海龟在飞行,无痕迹
2.turtle.pendown() 别名 turtle.pd() 落下画笔,海龟在爬行,有痕迹
3.turtle.pensize(width) 别名 turtle.width(width) 画笔宽度,海龟的腰围
4.turtle.pencolor(color) color为颜色字符串或r,g,b值,画笔颜色,海龟在涂装
color有三种形式
- 颜色字符串 :turtle.pencolor("purple") - RGB的小数值:turtle.pencolor(0.63, 0.13, 0.94) - RGB的元组值:turtle.pencolor((0.63,0.13,0.94))
5.书写字符
turtle.write('年',font=("Arial", 18, "normal"))
write(arg,move=false,align='left',font=('arial',8,'normal')) 在当前乌龟位置写入文本。 arg--信息,将写入Turtle绘画屏幕。 move(可选)--真/假。 align(可选)--字符串“左(left)”、“中(center)”或“右(right)”之一。 font(可选)--三个字体(fontname、fontsize、fonttype)华文行楷 写入文本 - arg的字符串表示形式 - 当前 根据“对齐”(“左”、“中”或“右”)定位乌龟以及给定的字体。 如果move为true,则笔将移动到右下角。 在默认情况下,move为false
6.海龟的可见性
1.不可见
turtle.hideturtle() turtle.ht()
2.可见
turtle.showturtle() turtle.st()
7.填充颜色
1.turtle.begin_fill()
在绘制要填充的形状之前调用
2.turtle.end_fill()
填充上次调用 begin_fill() 之后绘制的形状
8.海龟速度
1.turtle.speed(speed=None)
参数speed: 一个 0..10 范围内的整型数或速度字符串
如果输入数值大于 10 或小于 0.5 则速度设为 0。速度字符串与速度值的对应关系如下: "fastest": 0最快 "fast": 10快 "normal": 6正常 "slow": 3慢 "slowest": 1最慢 速度值从 1 到 10,画线和海龟转向的动画效果逐级加快。 注意: speed = 0 表示 没有 动画效果。forward/back 将使海龟向前/向后跳跃,同样的 left/right 将使海龟立即改变朝向
2.time库
1.时间获取
2.时间格式化
1.strftime()方法
2.strptime()方法
3.程序计时应用
1.测量时间:perf_counter()
2.产生时间:sleep()
3.random库
1.基本随机数函数
2.扩展随机数函数
4.PyInstaller打包库
1.使用说明
(cmd命令行,文件所在目录下) pyinstaller -F <文件名.py>
2.常用参数
5.jieba中文分词库
1.常用函数
常用代码段
1.输入
1.获取用户不定长度的输入
def getNum(): #获取用户不定长度的输入 nums = [] iNumStr = input("请输入数字(回车退出): ") while iNumStr != "": nums.append(eval(iNumStr)) iNumStr = input("请输入数字(回车退出): ") return nums
2.文本
1.英文文本去噪及归一化
def getText(): txt = open("hamlet.txt", "r").read() txt = txt.lower() #全部转化为小写字母 for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~': txt = txt.replace(ch, " ") #将文本中特殊字符替换为空格 return txt
2.统计英文文本单词频率
hamletTxt = getText() words = hamletTxt.split() #以空格分隔文本,转为为列表 counts = {} #新建一个字典 for word in words: #统计每个单词出现的频率,默认值为0 counts[word] = counts.get(word,0) + 1 items = list(counts.items()) #将字典转化为列表 items.sort(key=lambda x:x[1], reverse=True)#对第二个元素进行倒序排序 for i in range(20): word, count = items[i] print ("{0:<10}{1:>5}".format(word, count))
3.统计中文文本词频
import jieba txt = open("threekingdoms.txt", "r", encoding='utf-8').read() words = jieba.lcut(txt) counts = {} for word in words: if len(word) == 1: continue else: counts[word] = counts.get(word,0) + 1 items = list(counts.items()) #转化为列表才能排序 items.sort(key=lambda x:x[1], reverse=True) for i in range(15): word, count = items[i] print ("{0:<10}{1:>5}".format(word, count))
数学
1.计算平均值
def mean(numbers): #计算平均值 s = 0.0 for num in numbers: s = s + num return s / len(numbers)
2.计算方差
def dev(numbers, mean): #计算方差 sdev = 0.0 for num in numbers: sdev = sdev + (num - mean)**2 return pow(sdev / (len(numbers)-1), 0.5)
3.计算中位数
def median(numbers): #计算中位数 sorted(numbers) size = len(numbers) if size % 2 == 0: med = (numbers[size//2-1] + numbers[size//2])/2 else: med = numbers[size//2] return med
小花絮
1.实践平台为何叫Python123
123 代表了一种符合认知的发展过程 Python123 表达了一种提供最好学习价值的愿望
2.如何使用Python官方文档
https://docs.python.org/zh-cn/3/
- 3.7.3版本开始,Python官方文档有了中文版,快去看看吧,能看英文版更好 - 鉴于官方文档并非教程,而是技术手册,可以阅读但请注意: • 不建议初学者阅读,技术手册中包含较多背景知识,阅读要求较高 • 不建议作为教程学习,官方文档未考虑认知规律,缺少实例,跟学进展会比较慢 • 建议作为某些疑惑内容深入理解和查阅的工具手册,与字典用法相似
3.资深程序员如何看待编程工具
- 编程工具琳琅满目,资深程序员都在用什么?如何选择? - 资深程序员更理解逻辑、更期待效率、更重视简洁,因此: • 资深程序员都不用集成开发环境,不用复杂调试工具,不用复杂图形界面工具 • 资深程序员都喜欢用编辑器类型的开发工具,小巧、灵活、可定制 • 建议:Visual Studio Code(VSCode)、Notepad++、Vim,足矣! 资深程序员如何看待编程工具? PyCharm? No! Visual Studio? No! Anaconda? No! 请初学者"老老实实"用IDLE,这个工具足够了
4.小议"函数式编程"
"函数式编程"用函数将程序组织起来,貌似很流行,为何不早学呢? - 第一,函数式编程主要源于C语言,Python不是C,这说法不流行 - 第二,不要纠结于名字,关键在于按照"控制流"编程的过程式编程思维 - 第三,Python编程中函数不必须,因此更灵活,更探寻本质 如果您学过其他编程语言,不要被束缚,从本质上看待Python才更有趣!
5.如何深入学习
- 新时代学习方式:明确学习目标 + 在线课程 + 教材或教程 - 若以编程为职业:Python要学出深度,请关注嵩老师Python全内容体系 - 若以编程为能力:Python要学得宽泛,请关注嵩老师数据分析等内容 - 若以编程为素质:Python入门要学得精,请把这门课及教材好好看几遍
6.不建议低龄儿童学编程
背景:近年来,在英语/奥数之外,少儿编程又成为了新的商业热点,学生家长的焦虑感陡增。 观点:嵩老师建议青少年学编程,但不建议低龄儿童(小学三年级及以下)学习编程。 - 儿童学习需要符合认知规律成长及发展心理学 - 编程思维逻辑性很强,将限制低龄儿童创造性思维培养 - 进阶编程需要懂得大量计算机知识,不适合低龄儿童掌握
7.进一步提高Python编程能力
- 第一步:学好Python语法,即掌握非库功能,练好内功 - 第二步:学好Python领域,数据分析、Web开发、人工智能,找准了深入学 - 第三步:学好计算机专业知识,构建“系统”是本领,需要专业计算机知识 数据结构、算法、计算机网络、组成原理、操作系统、网络安全、体系结构、软件工程
主题