python后期学习进阶的过程中,发现一些之前容易遗漏的知识点和自己遇到的bug出了关联,所以进阶之前有必要把这些细节整理清楚。新入门的话,可以试试我找到的案例,案例弄清楚相关概念印象会很深。
知识点一、基本数据类型
不可变:数字、字符串、元组
可变:集合、字典、列表
学习任何语言,都需要对这个语言中的数据类型的概念和操作方法有了解,熟练对每一种基本数据类型的操作后,下一步可以再组合生成一些复杂的数据类型,比如字典套列表,列表套字典,组合复杂的对象等。然后,在使用这些语言或者自定义框架的过程中,逐渐熟悉他自己的一些特性。
python语言学习学习这里数据类型的特性的时候,需要注意的只有一个细节,就是和深拷贝和浅拷贝有关的概念,受深浅拷贝的影响,你需要弄清楚当前代码的这个位置,这个变量的值到底是什么,因为变量作用域的关系,可能变量在传递的过程中,他的值根本不是你想象的那个样子。
1、数字类型
整型
与数学的整数一致,需要知道的是不同进制的表示方式,在处理一些特殊场景的数据类型的时候,需要认识这个数是几进制。还有就是整数没有长度和大小的限制。可以调用pow()函数求幂
| 进制类型 | 示例 |
|---|---|
| 十进制 | 00,01,-999 |
| 二进制 | ±0b开头或者±0B开头,0是数字0 |
| 八进制 | ±0o开头或者±0O开头,数字0和字母o |
| 十六进制 | ±0x开头或者±0X开头 |
布尔型
True或False,布尔类型的父类是int
浮点型
与实数一致,取值范围 [−10308,10308] ,精度 10−16 的程度。
如果是科学计算场景,注意可能会出现不确定尾数的问题,0.1+0.2=0.3000000004,这种不止是python,其他语言也有。可以用round()函数取整。
普通科学计算场景,可以用 a∗e∗b=a∗10b 的形式表示,
复数
复变函数涉及到空间变换的话,使用-a+bj,和数学中复数的相关概念一致。
容易出错的运算符:/ 除 // 整数除 % 取余 ** 幂运算[小数时表示开平方]
混合运算时会默认变成最宽的类型: 123+4.0=127.0,需要注意混合运算时是否出现了不确定尾数
数字类型的运算需要注意的概念和知识点大概就这么多,需要小心的就是类型转换的时候结果是否有问题吧。一些复杂的数字类型的运算,需要依赖第三方库,那就属于第三方库的经验分享,不属于基础知识的范围,如果遇上了合适的再另外开文章吧。
2、字符串
字符串是python基本数据类型的重中之重,很多应用场景下都非常有价值,我学习python后,新手阶段遇上的大多数需求,都是靠操作字符串灵活解决的。
2.1 字符串类型的表示
0或多个字符组成的序列类型。单双引号组合形成四种组成形式。
''' '''本身是字符串,如果不把这个字符串赋值给一个元素的情况,会把它当注释用。
使用[]可以获取元素:
- 根据字符的序号对字符串进行索引,可以获取到指定元素
- [M:N:K]根据步长对字符串进行切片
[M:N] 获取的是左闭右开的区间,K代表步长。M缺失表示至开头,N缺失表示至结尾。 比如[0:3]获取的就是:请输入。[0:9:3]获取的是:请带号。 [::-1]表示逆序输出字符串。
需要注意的是,[0:9:3]那种情况,那就按照步长取这个范围内所有能取到的数,再次强调是左闭右开。
转义符表示,就是""来表示一些特殊符号,常用的一些有"\n"或者"\t"。注意字符串中出现\时,对应的符号是否会被转义。
2.2字符串操作符
a+b表示字符串a和b连接,注意是字符串a和字符串b,字符串a和整数b不行。
a*b表示复制b次a
a in b表示如果a是b的子串,返回True否则返回False
2.3字符串处理函数与方法
我就直接列最常用的了:
| 函数名称 | 作用 |
|---|---|
| len() | 获取长度 |
| chr() | unicode转字符 |
| ord() | 字符转unicode |
| str() | 任意类型转字符串 |
| str.split(a) | 将字符串中的字符按照a分割拆分放入列表,列表中不包括a |
| str.lower()或str.upper() | 字符串转大小写 |
| str.count(a) | 统计字符串str中字符a出现的次数 |
| str.replace(a, b) | 将字符串str中的所有a替换为b |
| str.strip(a) | 将str中左右两侧的字符a去除,如果a有多个字符,就所有字符全部去除 |
| "".join(a) | 列表元素直接拼接为字符串 |
| str.index(x) | 返回字符串str中字符x出现的序号 |
| str.index(x,i,j) | 返回字符串str中从i位置开始到j位置中x第一次出现的位置 |
2.4 字符串类型格式化
格式化输出的话,标准方法就是str.format()了,但是这个并没有想象那么间接,还容易因为元素出现的顺序出问题,a = f"xxx{b}xx{c}x"的形式更多一些。
平时如果需要在字符串中直接插入一个元素的时候,经常会用到这种格式化方法,尤其是这个元素可能为None的时候,就会使用这种格式化方法。因为"+"是连接字符串的, "+"无法连接一个None类型和一个字符串。
3、元组
使用()或者tuple()函数来创建,属于序列类型,字符串的索引,切片,index, len,count方法仍然适用。元组不可被修改,所以切片和索引的结果进入的是一个新的空间。
这个小括号是可缺省的:★★★★★
注意:这也代表你需要注意一个事情,你在调用一个不是自己写的函数的时候,尤其是官方库,你往里面传参,然后你要传的还是元组类型,你就要确定这个元组类型被赋值到了形参列表的哪个元素上。
比如 调用一个函数
f(a,b,c=None)
如果你只是想实现
f(a=4, b=(4,5))
但是,你又偷懒这样写效果就完全不一样了
f(4,4,5)
这种类型的特点就是创建后不能被修改。
函数的返回值经常以元组的形式返回,需要注意的是,返回的元组的长度,元组中元素出现的顺序,是否是自己期望的,是否满足接收要求等等,如果有可能用不到函数的返回值,可以用"_"接收。
4、集合
与数学的集合类型一致,不可修改,无序,元素唯一。用{}或set()创建。建立空集合必须用set()。数据去重用set()。
集合的应用类型相对狭窄一些,集合需要了解的就是操作符和处理方法。
集合的操作符: | (交), -(差),&(并), ^(补,非相同元素)
集合的处理函数: set.add(x) 增加x, set.discard(x)移除元素x, set.clear()清空, set.pop()随机返回元素,
set.copy()生成副本
5、字典
python中的字典类型是一个可以转为json的格式,是无序的,用{}或dict()创建,每个元素都是一个键值对。
| 操作名称 | 作用 |
|---|---|
| del dict[k] | 删除字典dict中键k对应的值 |
| dict.keys() | 获取字典中的所有键的信息 |
| dict.values() | 获取字典中所有值的信息 |
| dict.items() | 获取字典中所有键值对的信息 |
| dict.get(x) | 如果字典dict存在键x,返回值,如果不存在,返回空 |
| dict.pop(x) | 如果字典dict存在键x,取出,如果不存在,返回空 |
| dict.clear() | 清空dict |
| json.loads(dict) | 字典转json |
| json.dumps(dict) | 字典解析为字符串,用于处理网络中的json |
6、列表
与元组类型相似,内部可变。用[]或list()创建。
操作方法:
| 方法名称 | 作用 |
|---|---|
| ls[i]=x | 将列表ls的第i元素替换为x |
| ls[i:j:k]=lt | 将列表ls进行切片后的部分替换为lt |
| del ls[i] | 删除列表ls中的第i个元素 |
| del ls[i:j:k] | 删除列表中从i开始到j的步长k的元素 |
| ls += lt | 将列表lt增加到列表ls中 |
| ls *= n | 列表元素重复n次 |
| ls.append(x) | 在列表ls末尾添加元素x |
| ls.clear() | 删除列表ls中的所有元素 |
| ls.copy() | 生成一个新列表,复制ls中的所有元素 |
| ls.insert(i,x) | 在列表ls的第i个位置后插入元素x |
| ls.pop(i) | 将列表ls第i位置元素取出并删除 |
| ls.remove(x) | 将列表ls中出现的第一个x删除 |
| ls.reverse() | 将列表ls的元素反转 |
总结: 一些简单的功能性函数,很多人猜也能猜到函数名是什么,一些复杂的功能性函数,真到了用的时候,很多也只能靠翻阅文档,或者在自己的应用场景遇上了会记忆一波。靠翻书翻博客学那些东西,......,博客最大的作用感觉还是供写博客的人自己整理知识,或者把博客当作字典翻阅罢了。
练习案例
深度学习领域有一个数据集的概念,目标检测领域的coco格式的数据集,是以json格式存储的。尝试在网上找到一个coco格式的数据集,尝试把它按7:2:1的方式拆分出训练集,验证集和测试集。
关联的知识点:
- python深浅拷贝
- json库读取文件应用
- 字典类型和列表类型操作的熟悉