我的Python入门笔记(5)
三章、序列与字符串(上)
Complex is better than complicated.——The Zen of Python
在数学中,序列也称为数列,是指按照一定顺序排列的一列数,在程序设计中,序列是一种常用的数据存储方式,在Python中序列是基本的数据结构。它是一块用于存放多个值的连续内存空间。Python中有五种常用的序列结构,分别是字符串、列表、元组、集合、字典。
一、序列
序列是一块用于存放多个值的连续内存空间,并且按一定的顺序排列,每一个值(称为元素)都分配一个数字,称为索引或位置。通过该索引可以取出相应的值。在Python中,序列结构主要有字符串、列表、元组、集合、字典。对于这些序列结构以下几个通用操作。
1.1 索引
序列中的每一个元素都有一个编号,称之为索引,通常情况下在Python中,索引是从0开始递增的,即下标为0表示第一个元素,下标为1表示第2个元素,以此类推,此外在Python中,它的索引也可以是负数。即可以从右向左计数,也就是从最后一个元素开始计数,即最后一个元素的索引值是-1,倒数第二个元素的索引值为-2,以此类推。采用负数作为索引值时,是从-1开始,而不是从0开始,即最后一个元素的下标为1,这是为了防止与第一个元素重合.
通过索引我们可以访问序列中的任何元素。示例如下:
1 Snumber=["220",'284',"1210","1184","测试文本"] 2 print(Snumber[2]) 3 print(Snumber[-1]) 4 输出: 5 1210 6 测试文本
1.2 切片
切片是访问序列元素的另一种方法,它可以访问一定范围内的元素。通过切片操作可以生成一个新的序列。语法格式如下:
snumber[Start : end : step]
snumber:表示序列的名称
start:表示切片的开始位置(包括该位置,如果不指定,则默认为0.)
end: 表示切片的截止位置(不包括该位置),如果不指定则默认序列的长度
step: 表示切片的步长,如果省略,则默认为1,当省略该步长时,最后一个冒号也可以省略
在进行切片是,如果规定了步长,那么将按照该步长遍历序列的元素,否则将一个一个遍历序列.示例如下:
1 Snumber=["220",'284',"1210","1184","测试文本","雨霓同学","天依","初音未来","Python"] 2 print(Snumber[1:5]) # 获取第2个到第5个元素 3 print(Snumber[0:5:2]) #获取第1、3、5的元素 4 print(Snumber[:]) # 获取所有元素 5 输出: 6 ['284', '1210', '1184', '测试文本'] 7 ['220', '1210', '测试文本'] 8 ['220', '284', '1210', '1184', '测试文本', '雨霓同学', '天依', '初音未来', 'Python']
1.3序列相加
在Python中,支持两种相同类型的序列进行相加操作,即两个序列进行连接,使用(+)运算符实现:示例如下:
1 Snumber=["220",'284',"1210","1184","测试文本","雨霓同学","天依","初音未来","Python"] 2 Snumber2=["这是新的测试文本","Java","C++"] 3 print(Snumber+Snumber2) 4 输出: 5 ['220', '284', '1210', '1184', '测试文本', '雨霓同学', '天依', '初音未来', 'Python', '这是新的测试文本', 'Java', 'C++']
在进行序列相加时,相同类型的序列是指,同为列表、元组、集合等,序列中的元素类型可以不同,不同类型的序列相加则会进行报错,示例如下:
1 Snumber2=["这是新的测试文本","Java","C++"] 2 Snumber3="这是一段字符串" 3 print(Snumber3+Snumber2) 4 输出: 5 File "C:/Users/Mortal/PycharmProjects/Python_Note/venv/day_02.py", line 4, in <module> print(Snumber3+Snumber2) TypeError: can only concatenate str (not "list") to str
1.4 乘法
在Python中,使用数字n乘以一个序列会生成一个新的序列,新序列的内容为原来序列被重复n次的结果,此外在进行序列乘法运算时还可以实现初始化指定列表的功能。示例如下:
1 lanuage=["python","c++","java"] 2 print(lanuage*3) 3 newlist=[None]*5 #创建一个列表元素为None,长度为5的一个列表 4 print(newlist) 5 输出: 6 ['python', 'c++', 'java', 'python', 'c++', 'java', 'python', 'c++', 'java'] 7 [None, None, None, None, None]
1.5 检查某个元素是否是序列的成员(元素)
在上节中,我们提到了Python的成员运算符,通过成员运算符可以检查某个元素是否为序列的成员,即检查某个元素是否包含在该序列中,语法格式如下:
Value in sequence
Value:表示要检查的元素,sequence:表示指定的序列
另外,还可以使用not in检查某个元素是否不包含在指定序列中,这个前面也提到过。示例如下:
1 lanuage=["python","c++","java"] 2 print("python" in lanuage) #检查Python元素是否在该序列中 3 print("latex"not in lanuage) #检查latex是否不在该序列中 4 输出 5 True 6 True
1.6 计算序列的长度、最大值、最小值
在Python中,提供了内置函数计算序列的长度、最大值和最小值。分别是:
len(): 计算序列的长度,即返回序列包含多少个元素;
max() : 返回序列中元素的最大值
min() : 返回序列中元素的最小值
snumber=[220,284,1210,1184,26] print(len(snumber)) print(max(snumber)) print(min(snumber)) 输出: 5 1210 26
此外,在Python中还有很多其他内置函数,这里给出几个示例:
list() : 将序列转换为列表
str() : 将序列转换为字符串
sum() : 计算元素和
sorted() : 对元素进行排序
reversed() : 反向序列中的元素
enumerate() :将序列组合为一个序列索引,多用于for循环当中
这些方法在后续中也许会一一记录。
二、字符串(上)
字符串是一种有序的字符集合,用于表示文本数据。字符串的中的字符可以是ASCII字符,各种符号及各种Unicode字符。字符串属于不可变序列,即就是不能直接修改字符串。字符串中的字符按照从左到右的顺序,支持索引、分片等操作。
2.1字符串的创建和表示
Python中的字符串常量可用以下多种方法表示:
(1)单引号:'a','220','284'.
(2)双引号:“1210”,“1184”,“abc”
(3)三引号:三个单引号:''' 测试''',三个双引号:"""新的测试文本"""
(4)带r或R前缀的Raw字符串:r'abc\n123'、R'abc\n123'.
字符串都是str类型的对象,可用内置的str函数创建str字符串对象。
In [1]: x=str(220) #用数字创建字符串对象 In [2]: x Out[2]: '220' In [3]: type(x) #查看字符串对象类型 Out[3]: str In [4]: x=str(r'abc220') #用字符串常量创建字符串对象 In [5]: x Out[5]: 'abc220'
Raw字符串:对于一些不能直接输入的各种特殊字符通常用转义字符来表示,例如转义字符\\ 表示反斜线,\'表示单斜线,在Raw字符串中,Python不会解析其中的转义字符。常用的转义字符有:
转义字符 | 说明 | 转义字符 | 说明 |
\(在行尾时) | 续行符 | \n | 换行 |
\\ | 反斜线 | \v | 纵向制表符 |
\' | 单引号 | \t | 横向制表符 |
\" | 双引号 | \r | 回车 |
\a | ASCII蜂鸣(BEl) | \f | 换页 |
\b | ASCII退格(Baskspace) | \uhhhh | 给定16位十六进制值的Unicode字符 |
\N{name} | 给定名称的Unicode字符 | \uhhhhhhhh | 给定32位十六进制值的Unicode字符 |
\ooo | 给定八进制字符 | \xhh | 给定8位十六进制值的Unicode字符 |
2.2字符串的方法
1.计算字符串的长度
在Python中,len()函数可以用来计算字符串的长度,语法格式如下:
len(string) 其中string用于指定要进行长度统计的额字符串。
1 str1="人生苦短,我用Python" #定义一个字符串 2 length=len(str1) #计算字符串长度 3 print(length) 4 输出: 5 13
在实际开发时,有时需要获取字符串实际所占字节数,即如果采用UTF-8编码,汉子占3个字节,才有用GBK或者GB2312时,汉字占两个字节,这时可以通过encode()方法进行编码后在进行获取,示例如下:
1 str1="人生苦短,我用Python" #定义一个字符串 2 length1=len(str1.encode()) #计算UTF-8编码的字符串长度 3 length2=len(str1.encode('gbk')) #计算GBK编码的字符串长度 4 print(length1,length2) 5 输出: 6 27 20
2.截取字符串
字符串也属于序列,所以也需要截取字符串,可以采用切片的方法实现通过切片方法截取字符串的语法格式如下:
string[start : end : step]
string:表示序列的名称
start:表示切片的开始位置(包括该位置,如果不指定,则默认为0.)
end: 表示切片的截止位置(不包括该位置),如果不指定则默认序列的长度
step: 表示切片的步长,如果省略,则默认为1,当省略该步长时,最后一个冒号也可以省略
字符串的索引同序列的索引是一样的,也是从0开始,并且每个字符占一个位置,定义一个字符串,可以通过切片的方法截取不同长度的字符串,示例如下:
1 str1="人生苦短,我用Python" #定义一个字符串 2 substr1=str1[1] #截取第2个字符 3 substr2=str1[5:] #从第6个字符开始截取 4 substr3=str1[:5] #从左边开始截取5个字符 5 substr4=str1[2:5] #截取第3到第5个字符 6 print('原字符串:',str1) 7 print(substr1+'\n'+substr2+'\n'+substr3+'\n'+substr4) 8 输出: 9 生 10 我用Python 11 人生苦短, 12 苦短,
在进行字符串截取时,如果指定索引不存在,则会抛出异常。
3.分割字符串
在Python中,字符串对象提供了分割字符串的方法。分割字符串是吧字符串分割为列表,字符串对象的split()方法可以实现字符串分割,也就是把一个字符串按照指定的分割符切分为字符串列表,在该列表中,不包含分割符,split()方法的语法格式如下:
str.split(sep,maxsplit)
str: 表示要进行分割的字符串。
sep: 用于指定分割分隔符,可包含多个字符,默认为None,即所有空字符(包括空格、换行“\n”,制表符“\t”等)
maxsplit: 可选参数,用于指定分割的次数,如果不指定或者为-1,则分割次数没有限制,否则返回结果列表的元素最多为maxsplit+1.
在split()方法中,如果不指定sep参数,那么也不能指定maxsplit参数.示例如下:
1 str1= '雨 霓 同 学 的 博 客 园 地 址 >>> https://www.cnblogs.com/1210x1184/' 2 print('原字符串:',str1) 3 list1=str1.split() #采用默认分割符进行分割 4 list2=str1.split(">>>") # 采用多个字符进行分割 5 list3=str1.split('.') #采用“.”进行分割 6 list4=str1.split(" ",4) #采用空格进行分割,并且只分割前4个 7 print(str(list1)+'\n'+str(list2)+'\n'+str(list3)+'\n'+str(list4)) 8 list5=str1.split('>') #采用">"进行分割 9 print(list5) 10 输出: 11 原字符串: 雨 霓 同 学 的 博 客 园 地 址 >>> https://www.cnblogs.com/1210x1184/ 12 ['雨', '霓', '同', '学', '的', '博', '客', '园', '地', '址', '>>>', 'https://www.cnblogs.com/1210x1184/'] 13 ['雨 霓 同 学 的 博 客 园 地 址 ', ' https://www.cnblogs.com/1210x1184/'] 14 ['雨 霓 同 学 的 博 客 园 地 址 >>> https://www', 'cnblogs', 'com/1210x1184/'] 15 ['雨', '霓', '同', '学', '的 博 客 园 地 址 >>> https://www.cnblogs.com/1210x1184/'] 16 ['雨 霓 同 学 的 博 客 园 地 址 ', '', '', ' https://www.cnblogs.com/1210x1184/']
在使用split()方法时,如果不指定参数,默认采用空白符进行分割,这时无论有几个空格都将作为一个分割符进行分割。但是如果指定一个分隔符,那么当这个分隔符出现多个时,就会每个分割一次,没有得到内容,将产生一个空元素。
2.3 检索字符串
在Python中,字符串对象提供了很多应用于字符串查找的方法.
1.count()方法
count()方法用于检索指定字符串在另一个字符串中出现的次数。如果检索的字符串不存在,则返回0,否则返回出现的次数。其语法格式如下:
str.count(sub[, start [, end ]])
str : 表示原字符串
sub: 表示要检索的字符串
start: 可选参数,表示检索范围的起始位置的索引,如果不指定,则从头开始检索。
end: 可选参数,表示检索范围的结束位置的索引,如果不指定,则一直检索到结尾。
1 str1="@雨霓同学@220@284@艾丝蒂尔@约修亚" 2 cou=str1.count('@') 3 print('原始字符串中包含',cou,'个@符号') 4 输出: 5 原始字符串中包含 5 个@符号
2. find()方法
该方法用于检索字符串中是否包含指定的子字符串。如果检索的字符串不存在,则返回-1,否则返回首次出现该子字符串时的索引。其语法格式如下:
str.find( sub[, start[, end] ])
str : 表示原字符串
sub: 表示要检索的字符串
start: 可选参数,表示检索范围的起始位置的索引,如果不指定,则从头开始检索。
end: 可选参数,表示检索范围的结束位置的索引,如果不指定,则一直检索到结尾。
1 str1="@雨霓同学@220@284@艾丝蒂尔@约修亚" 2 cou=str1.find('@') 3 cou2=str1.find('*') 4 print('原始字符串中首次出现@的位置索引为',cou,'出现*的位置索引为',cou2) 5 输出: 6 原始字符串中首次出现@的位置索引为 0 出现*的位置索引为 -1
如果只是想判断指定的字符串是否存在,可以使用in关键字实现。如上实例中,上面的字符串str1中是否存在@符号,可以使用“print('@' in str1)”,如果存在就返回True,否则返回False.此外,也可以根据find()方法的返回值是否大于-1来判断指定字符串是否存在.此外Python的字符串对象还提供了rfind()方法,其作用与find()类似,只是从右边开始查找。
3.index()方法
index()方法同find()方法,也是用于检索字符串中是否包含指定的子字符串。只不过在使用index()方法时,在指定字符串不存在是会抛出异常。其语法格式同find()方法的语法格式:
str.index( sub[, start[, end] ])
1 str1="@雨霓同学@220@284@艾丝蒂尔@约修亚" 2 cou=str1.index('@') 3 print('原始字符串中首次出现的位置索引为',cou) 4 输出: 5 原始字符串中首次出现的位置索引为 0
1 str1="@雨霓同学@220@284@艾丝蒂尔@约修亚" 2 cou2=str1.index('*') 3 print('原始字符串中首次出现*的位置索引为',cou2) 4 输出: 5 File "C:/Users/Mortal/PycharmProjects/Python_Note/venv/day_03_find.py", line 2, in <module> 6 cou2=str1.index('*') 7 ValueError: substring not found
Python的字符串对象还提供了rindex()方法,其作用与index()类似,只是从右边开始查找.
4. startwith()与endwith()方法
startwith()用于检索字符串是否以指定字符串开头,endwith()用于检索字符串是否以指定字符串结尾,如果是则返回True,否则返回False。语法格式如下:
str.startwith( suffix[, start[, end] ])
str.endwith( suffix[, start[, end] ])
str : 表示原字符串
prefix和suffix:分别表示要检索的子字符串
start: 可选参数,表示检索范围的起始位置的索引,如果不指定,则从头开始检索。
end: 可选参数,表示检索范围的结束位置的索引,如果不指定,则一直检索到结尾。
1 str1="@雨霓同学@220@284@艾丝蒂尔@约修亚.com" 2 cou1=str1.endswith('.com') 3 cou2=str1.startswith('@') 4 print('原始字符串是否以@开头',cou1,'是否以.com结尾',cou2) 5 输出: 6 原始字符串是否以@开头 True 是否以.com结尾 True
后面会讲到字符串的其他方法:字符串大小写转换/去除字符串的空格和特殊符号/格式化字符串/等其他方法