数据结构简介
数据结构
是以某种方式(例如通过编号)组合起来的数据元素(例如数字,字符)的集合。在Python中,最基本的数据结构就是序列
(sequence
)。序列中每个元素都有编号,这个编号就是元素的位置或索引,其中第一个元素的索引是0,第二个是1,第三个是2,依此类推。
容器(container)
Python支持一种数据结构的基本概念,名为容器
。容器基本上就是可包含其它对象的对象,两种主要的容器是序列(例如列表和元组)和映射(如字典),在序列中,每个元素都有编号,而在映射中,每个元素都有名称(也叫键(key)
)。有一种既不是序列,也不是映射的容器,叫集合(set)
。
Python数据类型概览
python3中有六个标准的数据类型,分别为:①Number(数字);②String(字符串);③List(列表);④Tuple(元组);⑤Sets(集合);⑥Dictionary(字典)。
根据能否更改这些类型变量的值,可以把这六个标准类型划分为两类:
第一类:不可变数据(四个):Number(数字)、String(字符串)、Tuple(元组)、Sets(集合);
第二类:可变数据(两个):List(列表)、Dictionary(字典)。
根据不同类型的数据内的元素是否有顺序,还可以划分两类:
第一类:有序序列:列表,元组,字符串;
第二类:无序序列:字典,集合。
变量的赋值
Python中变量要遵循一定的规则,例如不得以数字开头,不得以Python关键字作为变量。此外,Python还提供了一个函数用于判断一个字符串能否作为变量的名称,即isidentifier()
,如下所示:
|
|
常规赋值操作
Python使用等号(=)给变量赋值,等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值,如下所示:
|
|
多变量赋值
Python可以同时对多个变量进行赋值,如下所示:
|
|
或者像这样:
|
|
这种赋值试方式,就是相当于a = 1, b = 2, c = "runoob"
。
判断是否是同一个对象——is
两个变量是否指向的是同一个对象,可以用is 运算符,如下所示:
|
|
Number(数字)
类型判断函数type()
Python3中的数字类型具体包括int(整型)
,float(浮点型)
,bool(布尔型)
和complex(复数型)
这四种。使用内置的type()
函数可以查看对象的类型,如下所示:
|
|
类型判断函数instance()
还可以通过instance
函数来判断,这个函数的使用格式为instance(a,b)
,即判断a是否是b的一个实例,如下所示:
|
|
isinstance
和type()
的区别可以通过一些代码来看:
|
|
区别就是,type()
认为子类与父类不是一个类型,isinstance()
认为子类与父类是一个类型。
字符串转换为整型
不同类型的变量有时候会出现错误,如下所示:
|
|
因此,只要在一段代码中要涉及不同类型的变量,最好使用type()
函数来查看一下数据类型。如果不同,有时候需要进行类型转换,如下所示:
|
|
变量的删除
变量的删除使用del
函数。
字符串
字符串的访问
字符串就是一串有序的字符。你可以通过方括号操作符,每次去访问字符串中的一个字符,如下所示:
|
|
其中[1]是索引,用于指示字符串中字符的位置,python中第1个位置是[0],而非[1]。
字符串的长度
len
是一个内置函数,会返回一个字符串中字符的长度:
|
|
长字符串加三引号'''
如果要在Python中输入比较长的字符串,例如要跨越多行的字符串,可以使用三引号'''
,如下所示:
|
|
运行结果如下所示:
|
|
换行加左斜杠\
常规字符串如果要换行,需要加左斜杠\
,左斜杠和换行符将被转义,即被忽略,如下所示:
|
|
运行结果如下所示:
|
|
字符串的加法+
字符串的加法就是将字符串连接起来,如下所示:
|
|
字符串无法修改
字符串属于不可变序列,无法进行修改,如下所示:
|
|
但是可以新建一个字符串,如下所示:
|
|
在Python中处理这类无法修改的数据类型时,通常的做法就是提取相应的字符串,然后再新建一个。
字符串的切片与索引
先看一个案例,如下所示:
|
|
再看另外一个案例,下面的这个案例中使用了几个参数,如下所示:
|
|
步长
看一个案例,如下所示:
|
|
运行结果如下所示:
|
|
这里面涉及到一个步长的概念,上面代码表示的是意思是,取0到7之间的元素,第0个元素是0
,第7个元素是7
(但末尾元素不取),并间隔取,其中[0:7:2]
这个2
就表示间隔取。如果是3,则是间隔3个取,如下所示:
|
|
字符串的分割split()
这里要与字符串的切片区分,字符串的分割使用的是split()
,如下所示:
|
|
可选的参数是定界符,是用来确定单词边界的。下面这个例子中就是把连接号-
作为定界符:
|
|
字符串的拼接join()
join是与split功能相反的一个方法。它接收一个字符串列表,然后把所有元素拼接到一起。join是一个字符串方法,所以必须把 join放到定界符后面来调用,并且传递一个列表作为参数:
|
|
替换某字符串replace()
这里用到了字符串的replace()方法,这个方法是用某个字符替换某个字符,虽然是替换,但是原字符是不变的,只是将替换后的字符赋值给了一个新的变量,如下所示:
|
|
替换某字符串translate()
方法translate
与replace
一样能替换字符串的特定部分,但不同的是,translte只能进行单字符替换,它的优势在能够同时替换多个字符,效率比replace高。
现在看一个案例,将某段字符中的c
和s
分别替换为k
和z
。
在转换之前,translate
需要创建一个转换表
,这个转换表指出了不同Unicode码点之间的转换关系,要创建转换表,可以对字符串类型str
调用方法maketrans
,这个方法接收2个参数:两个长度相同的字符串,它们指定要将第一个字符串中的每个字符都替换为第二个字符串中相应的字符,类似于以下的东西:
|
|
完整代码为:
|
|
运行结果如下所示:
|
|
其中>>> table {99: 107, 115: 122}
这一部分表示Unicode码点之间的映射。
在调用maketrans
时,还可以添加第3个参数,它是指定哪些字符删除,例如下面的代码会将空格删除,如下所示:
|
|
运行结果如下所示:
|
|
字符串计数
下面的这段代码是统计在banana
这个单词有多少个a,如下所示:
|
|
除了函数形式外,还可以使用count()
方法,如下所示:
|
|
查询字符串find()
、rfind()
和index()
查询字符常用的方法是find()
,rfind()
,index()
。其中,find()
与rfind(
)的区别在于,一个是在左边开始查找,一个在右边开始查找(r就是right的意思),index()
法检测字符串中是否包含子字符串str
,如果指定beg
(开始) 和end
(结束) 范围,则检查是否包含在指定范围内,该方法与 python find()方法一样,只不过如果str不在 string中会报一个异常。find()
与rfind()
查找一个字符串在另一个字符串指定范围(默认是整个字符串)中首次出现的位置,如果不存在,返回-1,存在返回1,如下所示:
|
|
再看一个查询电话号码的案例:
|
|
查询某字母
方法与前面的类似,如下所示:
|
|
in运算
in 这个词在字符串操作中是一个布尔操作符,它读取两个字符串,如果前者的字符串为后者所包含,就返回真,否则为假:
|
|
删除字符串中的空格strip()
使用的strip()
方法,如下所示:
|
|
遍历所有字符串
使用的是for循环,第一种方法,使用索引,如下所示:
|
|
第二种方法,直接使用字符串,如下所示:
|
|
字符串的复制
直接使用乘法就行,如下所示:
|
|
字符串的 大小转换upper()
和lower()
,首字母大写capitalize()
、title()
和capwords()
符串提供了一些方法,这些方法能够进行很多有用的操作。方法和函数有些类似,也接收参数然后返回一个值,但语法稍微不同。比如,upper
这个方法就读取一个字符串,返回一个全部为大写字母的新字符串。与函数的upper(word)
语法不同,方法的语法是word.upper()
。后面括号里面是空白的,表示这个方法不接收参数,如下所示:
|
|
upper()方法是大写,lower()是小写,capitalize()首字母大写、title()将每个字母变为大写,swapcase()大小写互换,如下所示:
|
|
另外两个词首大写的方法是tilte()
与string
模块中的capwords()
函数,如下所示:
|
|
运行结果如下所示:
|
|
ASCII值的转换
ord()是一个内建函数,能够返回某个字符(注意,是一个字符,而不是多个字符组成的串),所对应的ASCII值(是十进制的),字符a在ASCII中的值是97,空格在ASCII中也有值,是32,反过来,根据整数值得到的相应字符,可以使用chr(),如下所示:
|
|
转义字符
转义字符是指,在字符串中某些特定的符号前加一个斜线之后该字符将被解释为另外一种含义,不再表示本来的字符,常见的转义字符如下所示:
转义字符 | 含义 |
---|---|
\b |
退格,把光标移动到前一列位置 |
\f |
换页符 |
\n |
换行符 |
\r |
回车 |
\t |
水平制表符 |
\v |
垂直制表符 |
\\ |
一个\ |
\' |
单引号 |
\" |
双引号 |
\ooo |
3位八制对应的字符 |
\xhh |
2位十六进制对应的字符 |
\uhhhh |
4位十六进制数表示的Unicode字符 |
使用案例如下所示:
|
|
eval函数
eval()是一具内置变数,它可以将任意字符串转化为Python表达式,并进行求值。
|
|
判断某字符串的开头或结尾
startswith(),endswith()用于判断字符串是否以指定字符串开始或结束,可以接收两个整数参数来限定字符串的检测范围,如下所示:
|
|
判断字符串的首个字符内容
isalnum(),isalpha(),isdigit(),isdecimal(),isnumeric(),isspace(),isupper(),islower()用于检测字符串是否为数字或字母,是否为字母,是否为数字字符,是否为空白字符,是否为大写字母以及是否为小写字母,如下所示:
|
|
添加填充字符center
字符串的方法center
的功能在于向字符串两边填充字符,默认是空格,如下所示:
|
|
运行结果如下所示:
|
|
其中数字39表示,填充后的字符串一共39个字符。
输出格式美化format()
Python两种输出值的方式:表达式语句和print()
函数。 第三种方式是使用文件对象的write()
方法,标准输出文件可以用sys.stdout
引用,write()
方法在处理文本文件的时候经常使用,如果你希望输出的形式更加多样,可以使用str.format()
函数来格式化输出值,如果希望将输出的值转成字符串,可以使用repr()
或str()
函数来实现。 这两个函数区别如下所示:
str()
:函数返回一个用户易读的表达形式。repr()
:产生一个解释器易读的表达形式。
输出格式案例1-字符串
如下所示:
|
|
输出格式案例2-整数输出
下面的代码输出一个平方与立方根,如下所示:
|
|
输出格式案例3zfill()
zfill方法表示在数字的左边填充0,如下所示:
|
|
数值输出的格式化
字符串的格式化输出有两种方式,一种是使用%
符号,这个符号为称转换说明符
,它可以指出要将值插入什么地方,例如%s
的意思表示对字符串进行格式设置,如果指定的值不是字符串,那么就转换为字符串,再例如%.3f
则是将格式设计为包含3位小数点的浮点数。
另外一种是使用str.format()
,下面是使用的一些案例:
|
|
format()
的多参输出
format()
也可以用于多参数输出,如下所示:
|
|
计算结果如下所示:
|
|
str.format
str.format
的基本使用如下所示:
|
|
括号及其里面的字符(称作格式化字段)将会被format()
中的参数替换。在括号中的数字用于指向传入对象在format()
中的位置,如下所示:
|
|
如果在 format() 中使用了关键字参数, 那么它们的值会指向使用该名字的参数,如下所示:
|
|
位置及关键字参数可以任意的结合:
|
|
'!a'
(使用ascii()
),'!s'
(使用str()
)和'!r'
(使用repr()
)可以用于在格式化某个值之前对其进行转化,如下所示:
|
|
可选项':'
和格式标识符可以跟着字段名。这就允许对值进行更好的格式化。下面的例子将Pi保留到小数点后三位,如下所示:
|
|
在':'
后传入一个整数,可以保证该域至少有这么多的宽度。用于美化表格时很有用,如下所示:
|
|
如果你有一个很长的格式化字符串, 而你不想将它们分开, 那么在格式化时通过变量名而非位置会是很好的事情。 最简单的就是传入一个字典, 然后使用方括号[]
来访问键值 :
|
|
也可以通过在 table 变量前使用**
来实现相同的功能:
|
|
%
用于格式化输出
格式化字符串时,Python使用一个字符串作为模板。模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式。Python用一个tuple将多个值传递给模板,每个值对应一个格式符。%
的格式化输出如下所示:
|
|
格式符汇总
格式符为真实值预留位置,并控制显示的格式。格式符可以包含有一个类型码,用以控制显示的类型,如下所示:
|
|
格式符号进阶
格式符号还可以按如下方式进行使用:
|
|
使用案例如下所示:
|
|
上面的width, precision为两个整数。我们可以利用*
,来动态代入这两个量。比如:
|
|
Python实际上用4来替换*
。所以实际的模板为%.4f
:
|
|
参考资料
- 编程小白的第一本Python入门书
- Python可以这样学.董付国
- Python教程|菜鸟教程
- MagnusLieHetland. Python基础教程.第3版[M]. 人民邮电出版社, 2018.
- Python数据分析基础。ClintonW.Brownley.