我的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不会解析其中的转义字符。常用的转义字符有:

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

  后面会讲到字符串的其他方法:字符串大小写转换/去除字符串的空格和特殊符号/格式化字符串/等其他方法

 

posted @ 2019-06-10 22:20  雨霓同学  阅读(439)  评论(0编辑  收藏  举报