目录
一.python解释器
python解释器的安装,验证是否安装成功
作用:代码转为字节码
二.pycharm社区版安装
作用:提供写代码的窗口
创建项目,创建文件的方法,各文件的解释
三.print()
print("")
print('')
引号里面都是字符串
1.拼接字符串
拼接字符串 +(两边空格更美观,但不要在代码前后空格)
2.单双引号转义
单双引号转义:反斜杠(enter上面的斜杠)—单引号包双引号/双包单也可以
3.换行
内部字符串换行:\n
4.三引号
三引号(打印跨行多的)
四.变量:
更换变量值且保存原变量值
1.变量命名规则
不能有空格不能以数字开头
只能由文字,数字,下划线组成,不能有除下划线以外的其他符号
2.命名方法
下划线命名法
驼峰命名法
3.变量名大小写敏感
4.不能使用关键字作为变量名
五.数学运算(math库)
六.注释
1.#
win:快捷键:ctrl+/,多行多选,撤销同命令
2.""" """
三引号多行注释
七.数据类型
1.str字符串
len()函数
获取字符串的长度
其中空格数字符号都会占据一个长度,
但是转义字符不占:反斜杠不占,n占
""[]字符串索引
提取字符串某一位置上的单个字符(索引):
下标从0开始
2.整数
3.浮点数
(运算提到过)
4.布尔bool
True
False
大写开头
5.空值类型
None
大写开头
需要一个变量但是还不知道该变量的值,就先赋值为None
6.type()函数
不确定对象类型时,用type函数
判断数据类型的重要性:
数据类型的重要:决定你能在该类型的对象上可以使用什么函数
eg:len()函数给字符串正常,给整数报错
7.组合使用
八.python的使用模式
命令行模式和交互模式
1.交互模式
在pycharm的python控制台/终端
输入一行执行一行
想看结果不用print
退出交互模式:quit()/ctrl+d
2.命令行模式
更常用命令行模式:交互模式的命令不会被保存
九.input
1.input返回值
用变量获取input的返回值(返回值类型一律为字符串)
将一种类型的变量转变为另一种类型
要确保能这样转
2.返回值类型转换![img](https://i-blog.csdnimg.cn/blog_migrate/ea8b428ce9de70e1d3a218de86f4420d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/21882be45b4329b0c10dfff5742a0591.png)
3.实践
十.条件语句
1.缩进
建议缩进为四个空格
python会根据缩进判断该部分代码归谁管
2.if-else
3.if的嵌套
if-if……
4.if-elif-...-else
多条件判断
十一.逻辑运算
十二.列表[]:可变
数据结构:把相关联的数据整合在一起
[]:表示空的列表,数据存放其间,用逗号分割
1.append()-方法
往列表添加数据:使用针对列表的方法—append
方法与函数的区别:
都是用来负责某个特定功能
方法使用时,在操作对象的后面加点
函数使用时,其括号放入对象
2.可变数据类型
与其他数据类型的不同:
3.upper()-方法
想要将已定义好的字符串的字母转化为大写打印:
但字符串本身不变
4.remove()-方法
移除列表元素remove(),元素要确实存在在列表里
5.列表存放数据
列表中可以存放不同类型的数据
6.len()-函数
求长度
返回列表里元素个数的数量
7.列表索引
获取某个位置的元素,通过索引
8.列表某位置赋值
对列表某一位置的元素赋值/覆盖
9.针对列表的内置函数
十三.字典{}
1.键值对
用于存储键值对
键是用来查找值的
{}:空的字典用一对花括号表示,将要存放的键值对用引号包住,
键值之间用冒号表示对应
键值对之间用逗号分隔
2.获取键的值
字典[键名]
3.键的类型:不可变类型
列表不能做键:
列表为可变类型,所以无法做键值对的键
但是字典里有三个张伟年龄不一样,无法使用列表作为键,怎么区分?
使用元组
4.元组tuple():做键
元组tuple:可存放多个元素,元组不可变
元组和列表的对比
():空的元组
[]:空的列表
不可变:不能使用列表能用的append()和remove()方法
元组在字典中的作用:
5.字典:可变
添加删除键值对
添加键
覆盖原键值
检查该键是否已经存在
删除键
len():查有多少键值对
十四.for循环
在有明显的循环对象和次数的时候更加方便
1.对列表,字典,字符串做迭代for-in-
具体方法
变量名叫什么无所谓,会被依次赋值为迭代对象里的每一个元素
2.字典的三个方法
获取字典的键
获取字典的值
获取字典的键值对
3.对字典迭代![img](https://i-blog.csdnimg.cn/blog_migrate/43c1e11ea08ed7a4a2c34684a6adb012.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5200d2bb1c205bbf1aef31d6a974756c.png)
变量会被赋值为键和值组成的元组
4.range():整数序列
for循环结合range
range表示整数序列
一个值
range只放一个值时,默认起始值为0
两个值
注意结束值
注意:结束值不在序列的范围内
三个值
range()可以包含三个数字
步长
加一个步长,表示每次跨几个数字:默认跨1
十五.while循环
在条件何时结束未知的情况下使用while
十六.for和while之间的转换
实践练习:python21
十七.格式化字符串
1.format()
参数索引格式化0,1
只看参数关键字
没看懂
2.f-字符串
3.数字对字符串格式化
gpa是浮点数,但是使用format方法时,数字不用转化为字符串去和其他字符串拼接
使用format:.2f
使用f-字符串:.3f
十八.函数:远离复读机行为
1.python自带的函数:内置函数
2.定义函数
def关键字
表示开始定义函数
调用函数
定义函数时,代码不会被执行,调用函数时,代码才会被执行
3.作用域的概念
局部变量
函数内部的变量-局部变量
4.函数的返回值
无return:默认None
没有return时,默认返回None
不带返回值的函数
带返回值的函数
5.sum():内置函数
内置函数sum()计算列表中所有数字的和
6.查看内置函数官方地址
十九.引入模块
python标准库里的其他模块
1.模块概念
模块:一个python程序,引入模块后,其中的函数和变量都可以为我所用
2.sorted()排序
3.使用模块内部的函数
除了自己定义函数也可以引入python模块里的函数
代码可简化为:
内置函数都是很常用的函数, median()不是很常用所以没有将它内置
4.引入模块的三种方式
import 模块名
from 模块 import 函数/变量
from 模块 import *
第三种不推荐
命名冲突
5.标准库内置模块
查看python标准库里的内置模块:
直接import
这些都可以直接import
查看引入的函数
查看引入的函数具体是怎么写的:win系统,按ctrl点击函数名
二十.第三方库的模块
1.概念
标准库模块不够使用:引入第三方库的模块(数量大,多样)
第三方库的模块:不是python官方提供的,其他程序员提供的
2.引入语法同上(先安装)
在引入之前需要先安装,也就是从互联网上下载好别人写好的模块
3.内置函数,内置模块,第三方模块使用比较![img](https://i-blog.csdnimg.cn/blog_migrate/81982ad54b7dd4e21c4f71f0c720ad23.png)
![](https://i-blog.csdnimg.cn/blog_migrate/18f6177efeb2efece8f87d6a4ea3705d.png)
4.查询第三方库
pypi.org
5.安装第三方库
安装第三方库时,在pycharm终端输入:pip install 库的名字
之后通过import引入,就可以使用了
二十一.面向对象的编程-概念
1.oop
oop:面向对象编程
理解oop的概念,不涉及具体代码
2.面向对象和面向过程的对比
过程:
负责完成某个具体任务的代码,之前的几乎都是面向过程,基本可以理解为函数
面向过程的核心:
把要实现的事情拆分成一个个步骤,一次完成
面向对象:
不会聚焦于事情的一步步的步骤
模拟真实世界,考虑各个对象有什么性质、能做什么事情
类和对象之间的关系
类是对象的模板,对象是类的实例
类相当于图纸,图纸上规定了
类定义了对象有何种属性和方法,而对象拥有的具体属性则可以不尽相同(后面提到的多态)。
属性
方法:
通过对象,获取与它绑定的属性,代码更加有逻辑,清晰,让人理解
另一个能和对象绑定的是:方法
对象拥有不同的性质(属性——放在类里面的变量),且能做不同的事情(方法——放在类里面的函数)
3.面向对象的特性
面向对象的特性:封装,继承,多态
封装(隐藏细节):
表示写类的人,将内部实现细节隐藏起来。
使用类的人,只能通过外部接口访问和使用
接口
接口:提供使用的,方法
eg:
已经有人写好了一个类,
你只需要知道这个类有什么方法,
方法有什么作用,
具体怎么用就足够了
而不需要知道方法是具体怎么写的(现实世界使用洗衣机,只需要知道按钮啥功能怎么用)
作用:
封装减少了我们对不必要细节的精力投入
继承(有层次的类)
面向对象编程允许创建有层次的类(儿子继承爸爸,爸爸继承爷爷)
类也可以有
子类父类
表示从属关系
作用
好处:减少代码的冗余—父类的属性、方法都可以被继承,不需要反复定义
多态(具体表现可不同):
同样的接口,因对象具体类的不同,而有不同的表现
小学生和大学生都要写作业,但是作业的内容和难度不同
故写作业的方法不能直接定义在父类里面,需要分别定义在子类里否则大小学生用一个方法
但是使用时不用管大小学生,直接调用这个方法,会因为所属类的不同,执行不同的写作业方法。
如果不使用面向对象,不定义类,使用if,还要判断很多具体……
二十二.面向对象编程-具体语法
1.创建类
创建属于自己的类
类名
Pascal命名风格
类名的命名方法:不同于命名变量时的下划线命名,这里使用Pascal命名风格
用首字母大写来分割单词
定义属性
定义一个类,思考该类的对象都有哪些属性
构造函数
构造函数:作用-定义实例对象的属性,必须被命名为init
__init___()
括号里面可以存放很多参数,但是第一个参数的位置会被self占据
self:
用于表示对象自身,帮把属性的值绑定在实例对象上
定义方法:
表示对象能做什么事情,和创建普通函数差不多
和创建普通函数的两个区别
定义的方法要写在class里面
和init一样,第一个参数被占用,self:用于表示对象自身
self
为什么在方法里面也要self: 在方法里面,去获取或修改和对象绑定的属性
字符串乘以数字
字符串乘以数字:把字符串重复这么多次
调用结果
方法的调用结果根据其属性不同而改变
调用类的方法:
对象.方法名(参数)
不需要手动把self传入
二十三.继承的具体语法
哺乳动物是父类
人和猫是子类
1.继承父类
子类括号里面写上父类,可以继承父类的属性和方法
如果对子类创建对象,对象调用的方法/属性在子类里没有,则会调用父类的
2.调用的优先级
如果子类里面有,则会优先使用子类里面的
3.如何给子类添加其不同于其他子类的属性
super().init()
super().init(参数为:父类中除去self的参数)
因为直接init,则会只调用子类的属性的构造函数,忽略父类其他共有属性
但是将公有属性再添加在子类的属性构造函数里,又会造成代码重复
因此使用super
类各自定义的属性要放在def init()的参数列表里
4.什么时候可以用继承?
A、B两个东西
二十四.操作文件
1.文件概念
编程时对文件的操作:对文件的读写(文档/图片/音乐——内容形式不同,但都属于文件)
2.目录概念
文件归属于某一目录下
目录:看作是文件夹
3.目录结构
用代码对文本进行操作
问题:代码如何找到那个文件—了解电脑操作系统的目录结构
不同系统不一样
Unix/Linux/macOS: /
目录结构像树根一样:根节点叫根目录—用/表示—一切的文件目录,都存放在根目录下面
win:分区:\
每个磁盘分区有自己的根目录,用分区名+\ 表示
4.定位文件位置的两种方法
虽然表示根目录的表示不一样
但是都可以用两种方法定位文件位置
绝对路径和相对路径
绝对路径:
Unix:
路径中的每个目录之间,用斜杠分隔,最后以目标文件或者目标目录结尾
win:
相对路径:
以参考位置出发,以出发的位置来看,相对于这个位置处于什么路径
.
. :用点表示参照文件当前所在的目录
..
.. :当前文件更上一层的父目录,目录之间用/还是\进行分隔,取决于操作系统
编辑
.和/的省略条件
.和/是可以省略的:处于同一父目录下
二十五.读操作-python对文件进行
1.open()-打开文件
参数一
open(参数一:放文件的路径:相对/绝对,参数二:放模式,模式是一个字符串,参数三:encoding:表示编码方式,一般都是UTF-8,用这个编码方式读取文件)
参数二
常见的模式
r:只读
w:只写
a:附加
r+:读写
参数二也可以不写,不写的时候默认为读取模式r
r:只读,找不到文件报错
在读取模式下,程序找不到你传入的文件名时,报错如下:提示文件不存在
参数三:编码科普视频
encoding=“ ”
返回文件对象f
如果open函数执行成功,就会返回一个文件对象
后续可对其进行读取或者写入操作
2.read()-读文件
读取方式和打印形式
针对读文件,文件对象有个read方法,调用后,一次性读取文件里面的所有内容,并以字符串形式进行返回
二次调用
程序会记录文件读到了哪个位置因此调用完一次read(),再对同一个文件再次调用read会读空字符串,并打印
一般用代码操作的文件都比较简单,内容都是简单的字符串
read(数字)
在文件很大的时候,不要读这个文件,读出来的内容,占很大的内存
给read传一个数字:只会读1-这个数个字节的文件内容
二次调用
下一次调用时,会接着这个字节继续往下读
3.readline()方法读文件
读一行,并打印
多次调用
再调用,再读一行,
根据换行符来判断什么时候一行结尾,换行符也被视为读到的内容的一部分
如果读到结尾,readline和read一样,返回空字符串
结合while循环
一般会用while循环,判断不是空字符串就继续读下一行,注意,换行符也是有内容的
4.readlines()-读文件
每行作为列表元素
readlines()读取全部,每行作为列表元素
和for循环结合
5.三种读文件的方法
6.关闭文件
读完文件后要关闭文件
close()-常忘
open()-f.close()
编辑
with 文件自动关闭
经常忘记关闭文件的解决办法:with
with open() as f
二十六. 写操作-对文件进行
1.自动创建文件
如果文件不存在,不会像读文件时一样报错,会自动创建一个文件
2.w模式:原存则清空
三思而后行
打开文件进行写入,如果原文件已经存在,则会将原本内容清空
write()-调用时不会换行
手动添加换行符
编辑
3.a模式:附加模式
如果不想把原文件清空
只想在其后附加内容,则不使用w模式,使用a附加模式
同w一样,文件如果不存在,会自动帮其创建
4.w/a:无法读
无论是w还是a,都无法读取原文件内容
5.r+:读和附加
既想读又想写的时候怎么办
r+:读写模式,而且调用的write是以追加的方式添加内容
二十七.捕捉程序异常
捕捉程序异常,在程序出错之前进行预判,用我们想要的方式去处理错误情况
python测试:不应该牵一发动全身
1.异常类型:很多
错误类型非常多,写的代码越多,对不同的类型的错误越熟悉
通过测试的方式把能够避免的bug都揪出来,debug掉
2.错误输入源于用户
对捕捉到的异常给出反应
try-except
try:后代码块跟可能出现异常的代码
except 异常类型:后跟应对的代码
except:不判断异常类型,对捕捉到的所有错误类型给出这个应对
运行时从上往下运行,如果第一个except语句 捕捉到了语句错误,后面的except语句则不会执行
和if elif很像
3.异常源于自身
assert 布尔-终止测试
assert后面可以跟上任何的布尔表达式
测试时,在assert后面加上我们认为应该是正确的布尔表达式
问题:一旦测试出异常,代码终止,后续未被测试的也不能测试
unittest:测试专用库
所以一般使用专门做测试的库,他能一次性跑多个测试用例,并且能更直观的展现哪些测试用例通过了,哪些没有
unittest:常用的python单元测试库,python自带,无需额外安装
但是是库,需要使用import语句,将其引入测试程序
单元测试
单元测试:对软件中的最小可测试单元进行验证
验证某函数某方面表现是否符合预期
单独文件
将测试代码放在独立的文件里,不和要测试的功能混合
更清晰的划分实现代码和测试代码
二十八.测试步骤
1.引入被测
在测试文件中,把要测试的函数或类引入进来
如果测试文件和被测试文件位于同一文件夹下,引入的语法:
form 文件名 import 函数名/类名
2.创建unittest.TestCase类的子类
编辑
3.定义测试用例 test_ :类下面的一个方法
在创建的测试的类的下面可以定义不同的测试用例
每一个测试用例,都是类下面的一个方法
名字必须以test_开头
命名很关键,因为unittest这个库会自动搜寻test_开头的方法
并且只把test_开头的当成测试用例
写测试用例之前,先构想预期的被测函数的行为是什么样的
4.python -m unittest
写完测试用例后,在pycharm的终端,输入:python -m unittest
这个库会自动搜寻所有,继承了unitest库里TestCase类的子类
运行所有以test_开头的方法,并展示测试结果
告诉运行了几个测试,每个点代表测试通过的意思
5.展示测试结果
.
F
如果有一个测试没有通过,其中一个点就会变成F
6.其他
针对性的方法进行测试
推荐使用更针对性的方法进行测试,因为失败时会给出更详细的原因
TestCase的setUp方法
额外的方法,进一步提高测试效率(耐心点,别慌,看代码)
TestCase的setUp方法,在每一次执行test_方法前都会先调用一次
所以通过setUp方法,把测试对象创建好
实践