做题时遇到的不知道的知识点会更新在此:
python中的int()函数可以用于进制转换
该函数最为常见的使用是用于强制类型转换,实际上,它可以有两个参数
值得强调的是当传入两个参数时第一个参数一定要是字符串类型
字符串方法:
- lower()将字符串所有字符变为小写(非原地)
- upper()将字符串所有字符变为大写
- title()将字符串内每一个单词首字母大写
- capitlize()将首字母大写
- .swapcase()将字符串中的大写字符变成小写字符,小写字符变成大写字符
- strip()去除首尾空白字符
- lstrip()去除左边空白字符
- rstrip()去除右边空白字符
- 想重复输出某个字符串可以使用*号
- split()从字符串的左边开始切分,默认的切分参数(第一个)是空格,第二个参数可以选择指定切分次数,返回列表
- rsplit()从字符串的右边开始切分,其他同上
- isalpha()判断字符串是否只包含字母
- isalnum()判断字符串是否全部由字母和数字组成
- isdigit()判断字符串是否只包含数字
- isdecimal()判断字符串是否只包含十进制数字
- isnumeric()判断字符串是否只包含数字
- 注意s.isdigit、isdecimal 和 s.isnumeric 区别
- isspace()判断字符串是否只包含空格(回车、换行、水平制表符)
- .center()居中对齐,第一个参数指定宽度,第二个参数可以指定填充字符是什么(默认是空格,如果设定的宽度小于原字符串宽度则返回原字符串)
- .ljust()左对齐,参数同上
- rjust()右对齐,参数同上
- zfill()右对齐,只接受一个参数(指定宽度),默认使用0填充
- .isidentifier()判断指定的字符串是否是合法的标识符
- .encode()编码方法,可以指定编码的类型,传入参数即可
- .decode()解码方法,可以指定解码的类型
python内置函数del(注意与列表.del()区分)
- del 对象 直接删除一个对象
- 可用于列表删除一个(del lst[ j ])或多个元素(del lst[ 0:3 ]利用切分)
内置函数/方法
- max()参数为一个可迭代对象,得到其中的最大值
- min()同上,得到其中的最小值
- sum()第一个参数为一个可迭代对象,第二个参数为结果相加值(默认为0,即返回值会加上这个数),得到迭代对象的和
- abs()返回传入参数的绝对值
- ord()返回传入参数的ASCII码数值
- hex()返回传入十进制整数的十六进制(返回类型是字符串)
- bin()返回传入十进制整数的二进制(返回类型是字符串)
- pow(x,y)返回x^y
- .count() 统计列表中传入参数出现的次数
- .index(参数)得到传入参数在列表中第一次出现的下标是多少(从0开始)(未找到则报错)
- .find()查找传入参数在序列中的索引下标(未找到返回-1)
- string.join(iterable)
join() 方法获取可迭代对象中的所有项目,并将它们连接为一个字符串。
必须将字符串指定为分隔符
.replace(old,new,max)可将字符串中的某些字符替换为其他字符,第一个参数是原字符,第二个参数是新字符,第三个参数是替换次数(默认替换全部),注意该函数不是原地替换
round(num,dig)
函数返回一个浮点数,该浮点数是指定数字的舍入版本,并带有指定的小数位数。
默认的小数位数为 0,表示该函数将返回最接近的整数。
eval()函数计算指定的表达式,如果该表达式是合法的 Python 语句,它会被执行。
set(序列集合或迭代器)函数创建集合对象。集合列表中的项目是无序去重的,因此它将以随机顺序出现。
hasattr(obj,name)函数用于判断对象是否包含对应的属性
setattr(obj,name,value)函数用于设置属性值,如果该对象已经拥有该属性值则对其进行修改,如果没有该属性,则创建该属性后对其赋值
dir(对象)可以查看某个对象所拥有的属性和方法
hex(十进制数)以字符串形式返回参数的十六进制
oct(十进制数)以字符串形式返回参数的八进制
bin(十进制数)以字符串形式返回参数的二进制
对输出函数print的总结
num=int(input("请输入一个整数")) print("你输入了",num) print("你输入了"+str(num)) print("你输入了%d"%(num)) print("你输入了{0}".format(num)) print(f"你输入了{num}") print("你输入了%d"%(num),file=用open得到的文件对象)//输出到某个文件里,相当于write
常用数据类型
整数类型int
- 二进制以0b开头
- 八进制以0o开头
- 十六进制以0x开头
这里还有一个值得注意的点:python中的整型是“无限长”的,因此它可以表示任何数
浮点数
python中只有float作为浮点数,没有double
主要注意python中对浮点数与Decimal的关系,例如:
可参考
布尔类型
有True和False两种,其中要注意的是python的bool可以作为数字进行运算
例如:
True+1=2False+1=0
字符串类型
可以用一对单引号或一对双引号或三个单引号对或三个双引号对 表示
其中三引号表示的字符串可以跨行输入,其他的则不行
三引号还可以实现多行注释
对于字符串想要输出原字符串可以在字符串前加上r或R
print(r'我是字符串')
但是注意 想输出的字符串末尾不能是反斜杠,因为如果末尾是反斜杠就变成了\'即一个已经存在的转义字符
类型转换
float()
int()
str()
bool()(字符串转成bool类型都是True)
运算符
python中没有++运算符和--运算符
python的整除是//
而 / 则会得到浮点数
幂运算是**
赋值上python可以支持解包赋值,即类似
a,b,c=1,2,3; #这样就完成了a=1,b=2,c=3的赋值
对象id(地址)的比较可以使用is和is not
python的布尔运算符有and,or,not,in,not in
python的位运算符有&,|,<<,>>
其中<<是“高位溢出舍弃,低位补零” >>是“低位溢出舍弃,高位补零”
条件表达式
x if 判断条件 else y
即如果判断条件返回True则得到x,反之得到y
pass语句
在遇到暂时不想写的地方时可以使用pass语句进行略过
分支结构
if 判断条件: 语句 elif 判断条件: 语句 else: 语句
内置函数range
该函数用于生成一个整数序列
我们有如下三种方法对其进行创建
该函数的返回值是一个迭代器对象
循环
while循环
#语法结构 while 表达式: 语句
for-in循环
in表达从(字符串、序列等)以此取值,称为遍历
for-in遍历的对象必须是可迭代对象
#语法结构 for 自定义的变量 in 可迭代对象: 循环体
如果不需要上述的自定义变量可以使用'_'代替该位置
循环与else
在python中,else可以与循环搭配使用
即一个循环如果正常退出则执行else语句内容
列表
python中的列表可以相当于其他语言中的数组
上图可近似抽象表示一个列表的内存形式
列表的创建方式:
- 直接使用中括号创建
- 使用内置函数list()
列表的特点:
- 列表元素按照顺序有序排序
- 索引映射唯一一个元素
- 列表可以存储重复数据
- 列表可以任意数据类型混合存储
- 列表会根据需要动态分配和回收内存空间
列表的查询操作
这里值得强调的是切片得到的列表与原列表的id是不同的,说明新的列表是拥有了新的内存空间,此外,切片三个参数中的中间参数不管是正序遍历还是逆序遍历都是“开的一边”,即不会遍历的stop本身
列表元素的增加操作
值得强调的是append()方法是“原地添加元素”,extend()方法适用于两个列表的拼接(也是原地拼接)
此外,切片也是一种灵活的方式
输出如下
等于是在下标为>=1的后面所有元素都变了
列表的删除操作
- remove()(根据元素值删除)
- 一次删除一个元素
- 重复元素只删除第一个
- 元素不存在则抛出异常
2.pop()(根据索引进行删除)
- 删除一个指定索引位置上的元素
- 指定索引不存在则抛出异常
- 如果不指定索引则默认删除最后一个元素
3.切片
- 可实现一次至少删除一个元素
但是这样不是原地操作,最好的做法如下:
4.clear()
- 清空列表
5.del()
- 直接删除列表
列表元素的修改操作
- 直接通过索引修改(单个元素)
- 切片
列表元素的排序
- 调用列表的sort()方法,默认将列表进行升序排序,如果指定参数reverse=True,则可实现降序排序(该方法是原地排序)
- 调用内置函数sorted(),同理可传入参数reverse=True实现降序排序(会产生新列表)
列表产生式
列表产生式是用于生成列表的公式
补充列表的另外一些常用方法:
- reverse() 实现原地反转列表
字典
什么是字典?
与列表一样,字典也是python的一种数据结构,它以键值对的形式存储数据
此外字典是可变序列,即我们可以对其中的元素进行增删改
字典是无序的,即添加的第一个元素不一定被放在第一个位置,添加的第二个元素也不一定在第二个位置,这是因为元素的位置是由字典的key经过哈希函数的结果来决定的,所以也会要求字典的key是不可变序列(类似字符串就是不可变序列)来避免元素的位置被频繁改变
值得一提的是字典也可以根据需要动态地伸缩
不过字典会浪费较大的空间,是一种空间换时间的数据结构
字典的创建
主要有以下两种方式:
- 使用花括号
- 使用内置函数dict()
注意使用内置函数dict()内部是用等号'='进行赋值的不是冒号
字典元素的获取
主要有以下两种方式:
- 使用中括号[]取值
- get()方法取值
上述二者的区别:
字典key的判断
字典元素的删除
- 使用.clear()方法可直接清空字典
- 使用内置函数删除即可
del 字典['张三']
字典元素的添加与修改
该操作较为简单,有点类似访问其中的元素操作
获取字典视图
- .keys()方法获取字典中所有的key
- .values()方法获取字典中所有的value
- .items()方法获取字典中所有的键值对
这里还可以将上述得到的序列使用list()转换为列表方便操作
字典元素的遍历
当然使用上述提到的字典视图也可以实现遍历
内置函数zip()
该函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个元组,然后返回由这些元组组成的列表
例如
如上两个列表使用zip(items,prices)所得到的为
[('Fruits',96),('Books',78),('Others',85)]
字典产生式
具体语法如下图所示
元组
元组是python中内置的数据结构之一,是一个不可变序列,即元组不能被增删改
补充:
截至目前所学的不可变序列出现了有 字符串、元组,这些不可变序列如果进行了增删改就相当于直接修改了地址创建了一个新的对象,反之可变序列 列表、字典进行增删改操作对象地址并不会改变
语法如下图所示
元组的创建方式
主要包含如下两种方式:
- 直接小括号需要强调的是 只包含一个元素的元组需要使用逗号和小括号
- 使用内置函数tuple()需要强调的是tuple()函数内还需要使用小括号
实际上,元组的小括号是可以省略的
需要强调的是:
元组中存放的是对象的引用
如果说元组中的对象本身是不可变对象,则不能再引用其他对象‘
如果说元组中的对象本身是可变对象,则可变对象的引用不能被修改,但是可变对象的数据可以修改
元组的遍历
而关于元组元素的查看 则直接使用索引下标即可
此外想输出元组内的多个元素也可以使用切片操作,不过需要注意的是元组的切片也是使用的中括号
集合
集合也是python所提供的内置数据结构之一,并且它属于可变无序序列,我们通常使用“没有value的字典”来理解它,也就是说集合中的元素不能重复
集合的创建
- 使用{}创建
- 使用内置函数set()
集合元素的判断操作
类似其他数据结构,直接使用in与not in 判断元素是否存在集合中即可
集合元素的新增操作
- .add()方法,一次添加一个元素
- .update()方法,一次添加一个或多个元素(参数是可迭代对象)
集合的删除操作
- .remove() 一次删除一个指定元素,如果元素不存在则抛出异常
- .discard()同上一次删除一个指定元素,但是如果元素不存在不会报错
- .pop()该方法无参数,它会随机删除集合中的一个元素
- .clear()该方法用于清空集合
集合之间的关系
值得强调的点是这个isdisjoint()方法,该方法如果两个集合没有交集返回True,反之返回False
集合的数学操作
- 交集 使用.intersection()方法可以返回两个集合的 交集
- 此外 还可以使用 & 符号得到两个集合的 交集
- 并集 使用.union()方法可以得到两个集合的 并集
- 此外 还可以使用 | 符号得到两个集合的 并集
- 差集 使用.difference()方法可以得到两个集合的 差集
- 此外还可以使用 - 符号得到两个集合的差集
- 对称差集 使用.symmetric_difference()可以得到两个集合的 对称差集
- 此外还可以使用 ^ 符号得到
集合生成式
将列表生成式的中括号改为花括号即可
学了这么多生成式,我们需要注意的是元组没有生成式
python内置数据结构总结
字符串
字符串的驻留机制
什么是字符串的驻留机制?
python对字符串仅保留一份相同且不可变的方法,不同的值被保留在字符串的驻留池内,python对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量
什么样的字符串会被驻留
- 字符串的长度为0或1时
- 符合标识符的字符串
- 字符串只在编译时进行驻留,而非运行时
- [-5,256]之间的整数数字
python还提供了方法允许我们对字符串进行强制驻留
即可以使用sys中的intern方法强制两个字符串指向同一对象
这里需要注意的是pycharm对字符串进行了优化,即可能不满足上述条件的字符串也会被驻留
字符串的比较操作
字符串与字符串之间其实可以使用类似
这些运算符进行比较
- 比较规则:
- 首先比较两个字符串的第一个字符,如果相等就继续比较下一个字符串,以次比较下去,直至两个字符串中的字符不相等,其比较结果就是两个字符串的比较结果,此后后续字符不再进行比较
- 比较原理:
- 两个字符进行比较时调用的是内置函数ord()所得到的值
值得强调的是==符号比较的是字符串的内容
而 is 运算符比较的是字符串的地址id
字符串的切片
与其他数据类型相似,字符串也能进行切片操作
但是,因为字符串是不可变类型,不具备增删改操作,切片操作将产生新的对象
字符串的格式化
对字符串进行格式化主要有一下两种方式:
1.%作为占位符 这一点与C语言中完全一样,这里不再赘述
2. {}作为占位符
如上图所示的0与1分别代表format参数的第一个参数与第二个参数
补充:
上图中如果format中只有一个参数那么可以省略0
函数
函数就是执行和完成特定功能的一段代码
函数的好处:
- 复用代码
- 隐藏实现细节
- 提高可维护性
- 提高可读性便于调试
函数的创建
函数的参数传递
主要有如下两种方式:
1.位置实参
根据形参对应的位置进行实参传递
2.关键字实参
根据形参名称进行实参传递
函数参数传递的内存分析
如上图代码所示,我们定义了一个函数fun,且传入两个参数,分别时不可变类型int与可变类型list,我们发现在调用fun后n1还是n1,但是列表n2却被改变了
- 如果参数是不可变对象,在函数体内的修改不会影响实参的值
- 如果是可变对象,则在函数体内会影响实参的值
函数的返回值
- 如果函数没有返回值,return可以省略不写
- 函数的返回值如果存在多个,返回的类型为元组
默认值参数
函数定义时,我们可以给形参设置默认值,如果不希望使用默认值时则可以传递实参,反之不传实参则默认使用默认值
个数可变的函数参数
主要有以下两类:
1.个数可变的位置参数
定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数
使用*定义个数可变的位置形参
结果为一个元组
2.个数可变的关键字形参
定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的关键字参数
使用**定义个数可变的关键字形参
结果为一个字典
值得强调的是,如果一个函数的形参既有个数可变的位置形参也有个数可变的关键字形参,那么我们定义 位置形参 放在 关键字形参前面
函数传参时的解包
只需在传实参时在前面加上对应的星号即可
变量的作用域
即程序代码能访问该变量的区域
根据变量的有效范围可分为:
- 局部变量
- 在函数内部定义的变量,只在函数内部有效,但如果局部变量使用global声明,这个变量就会成为全局变量
- 全局变量
- 在函数体外定义的变量,可作用于函数内外
异常
python与其它高级程序语言一样提供了异常处理机制,可以在异常出现时进行捕获,然后内部“消化”,让程序继续运行
try....except....else....finally语句
如上图所示,我们可以使用这样的语句来实现捕获异常,在try子句内编写可能会出现异常的语句块,except后书写异常类型,然后在except语句块内编写如果出现该异常需要执行的代码
当然我们可以书写多个except语句,如果书写多个except语句的话,我们希望从上到下按照异常的范围大小,从小到大排下来,这样我们更能精确地处理异常
其次上述语句也可以补充使用else语句,else语句块的内容表示,如果try语句块中未出现异常所需要执行的代码
最后,我们还可以添加finally语句块,该语句块无论是否发生异常都会被执行,通常用来释放try语句块中申请的资源
常见异常类型如下图所示
类与对象
值得注意的一点是
实例对象的创建一般有两种形式
stu.info() Student.info(stu)
类属性、类方法、静态方法
需要强调的是类方法与静态方法的区别
类方法:
类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象)。也就是说,我们在调用类方法时,无需显式为 cls 参数传参。
其次,类方法只能访问类属性
类方法推荐使用类名直接调用,当然也可以使用实例对象来调用(不推荐)
Student.cm() stu.cm()#不推荐
静态方法:
静态方法,其实就是我们学过的函数,和函数唯一的区别是,静态方法定义在类这个空间(类命名空间)中,而函数则定义在程序所在的空间(全局命名空间)中
静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法静态方法的调用,既可以使用类名,也可以使用类对象
动态绑定属性和方法
python是一门动态语言,在对象创建后,允许动态地绑定属性和方法
面向对象的三大特征
封装
封装可以提高程序的安全性,封装即将属性和方法包装到类对象中,在方法内部对属性进行操作,在类的外部调用方法
需要强调的是,在python中没有专门的修饰符用于表示属性的私有,我们通常在我们希望的私有成员前面使用两个下划线_
继承
继承可以很好地提高代码的复用性
python中的继承语法格式如下
如果一个类没有继承任何类则,默认继承object
python支持多继承,即一个子类可以有多个父类
定义子类的构造方法时,必须在其中调用父类的构造方法(利用super())
多态
多态可以提高程序的可扩展性和可维护性
方法重写
- 如果子类对继承自父类的某个属性或方法不满意,可以在子类中对其进行重新编写
- 子类重写的方法中也可以通过super().xxx调用父类的方法
object类
- object类是所有类的父类,因此所有类都有object类的属性和方法
- object类中存在一个__str()__方法,用于返回一个对象的描述,我们通常会将其重写使其返回更加确切的类描述
如上图所示,如果我们没有重写__str__方法则print(p)会输出该对象的地址,反之则输出了我们重写方法__str__返回的内容
object的一些属性
- x.__dict__ 如果x是一个实例对象的话,那么返回实力对象的属性字典,如果x是一个类名则返回该类的属性与方法的字典
- x.__class__ 返回对象所属的类
- x.__bases__ 返回一个元组包含x的父类
- x.__mro__ 返回一个元组包含类的层次结构
- x.__subclasses__ 返回子类的列表
object的一些方法:
- __add__(self,other) 类似C++实现了类与类之间的运算符操作一样,如果我们想使得两个类可以相加,我们就需要实现它
- __len__(self)同理,如果我们想要得到len(类),那么我们需要在该类中实现该方法
- __new__(cls,其他参数) 与 __init__(self) 中前者用于创建对象,后者则用于初始化前者创建的对象,具体可参考通俗的讲解Python中的__new__()方法
值得强调的是发现__new__方法是传入类(cls),而__init__方法传入类的实例化对象(self),而有意思的是,__new__方法返回的值就是一个实例化对象(ps:如果__new__方法返回None,则__init__方法不会被执行,并且返回值只能调用父类中的__new__方法,而不能调用毫无关系的类的__new__方法)
类的浅拷贝与深拷贝
- 变量的赋值操作:实质上是形成两个变量指向同一个对象
- 浅拷贝:使用copy模块中的copy方法,python中的拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此源对象与拷贝对象会引用同一个子对象
- 深拷贝:使用copy模块中的deepcopy方法,递归拷贝对象中包含的子对象,源对象与拷贝对象中的所有子对象均不同
如上图所示,我们发现computer对象与浅拷贝对象computer2是不同的对象,但是他们的子对象都是相同的
上图则使用了深拷贝,我们发现源对象与拷贝对象都不同,包括他们的子对象
模块Modules
我们可以简单将模块理解为一个.py文件就是一个模块
而一个模块会包含函数、类、语句
使用模块的好处:
- 方便其他程序或脚本的导入并使用
- 避免函数名和变量名的冲突
- 提高代码的可维护性
- 提高代码的可重用性
- 有利于团队协作开发
模块的导入
我们在自定义模块时,名称尽量不要与python自带的标准模块名称相同
导入模块的方式有如下两种:
此外第三方模块的导入
以主程序形式运行
简单地说,就是我们的模块中因为可以包含语句例如print,因此在我们导入某个模块运行时,该模块的语句也会被执行,如果我们不希望它被执行,就在该语句加上if __name__ == __name__即可
包
- 包是一个分层次的目录结构,它将功能相近的模块整合到一个目录下
- 包使得我们的代码更为规范,避免了模块名称的冲突
- 包在创建时通常会包含__init__.py文件,而目录不会
值得强调的是,使用import进行导入,后面只能跟包或者是模块
但是使用from...import...可以导入包、模块、函数、类
python中常用的内置模块
文件
文件的读写原理如下图所示
.py文件被解释器所运行,而解释器会用到操作系统中的资源进行相关操作
使用python中的文件相关函数来实现对文件的操作
一般分为以下步骤
- 获取文件对象
- 对文件对象进行操作
- 关闭文件对象
- 内置函数open()创建文件对象
语法规则如下图所示
常用的文件打开方式
按照文件的数据组织形式,文件分为以下两类
- 文本文件:存储的是普通’字符‘文本,默认为unicode字符集,可以用记事本打开
- 二进制文件:把数据内容用’字节‘进行存储,无法用记事本打开,例如MP3,jpg图片
文件对象的常用方法
值得强调的是flush与close的区别
close()关闭流对象,但是先刷新一次缓冲区,关闭之后,流对象不可以继续再使用了。
flush()仅仅是刷新缓冲区(一般写字符时要用,因为字符是先进入的缓冲区),流对象还可以继续使用
with语句(上下文管理器)
- with语句可以自动管理上下文资源,无论说明原因跳出with块,都能确保文件的正确关闭,以此来达到释放资源的目的
- 该语句可以避免遗忘关闭文件的行为
上图是一个利用with语句实现copy功能的代码
os模块的常用函数
- os模块是python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行结果可能不同
- os模块与os.path模块用于对目录或文件进行操作
- filename.endswith('.后缀')用于判断是否某个文件以参数为后缀名
- os.walk(path)用于遍历目录下的所有文件包含子目录下,返回值是一个迭代器对象
下图则是os.path中的常用函数
序列化与反序列化
通过文件操作,我们可以将字符串写入到文件中,但是如果是一个对象(例如列表、元组、字典等)就无法直接写入到文件中,我们需要对这个对象进行序列化,然后才能写入文件中
因此人们设计了一套协议,按照某种规则,把内存中的数据转化为字节序列,保存到文件中,这就是序列化,反之,从文件中将字节序列恢复到内存中,这就是反序列化
这套协议就是JSON
序列化
- dumps
- dump
反序列化
- loads
- load
文章来源:https://www.toymoban.com/news/detail-419339.html
load与loads的区别在于参数,即loads的参数是一个字符串,而load希望的参数是一个文件 文章来源地址https://www.toymoban.com/news/detail-419339.html
到了这里,关于Python学习简记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!