Python知识回顾(3)

Day 3
本节主要讲解的是Python中字符串、列表、元组的使用。

文章目录

    • 1.字符串的处理
      • 1.1 字符串的格式化
      • 1.2 字符串的分割与合并
      • 1.3 字符串驻留机制和字符串比较
      • 1.4 Python的移位运算符
    • 2. Python中的列表
      • 2.1 列表的创建
        • 2.1.1 基本语法[]创建
        • 2.1.2 list()创建
        • 2.1.3 range()创建整数列表
        • 2.1.4 推导式生成列表(简介一下,重点在 for 循环后讲)
      • 2.2 列表元素的增加和删除
      • 2.3 列表的切片操作
      • 2.4 列表的遍历与排序
        • 2.4.1 列表的遍历
        • 2.4.2 列表的排序
        • 2.4.3 reversed()返回迭代器
    • 3. Python中的元组
      • 3.1 元组的创建
        • 3.1.1 通过()创建元组。小括号可以省略。
        • 3.1.2. 通过 tuple()创建元组
        • 3.1.3.生成器推导式创建元组
      • 3.2 元组的访问与计数

1.字符串的处理

1.1 字符串的格式化

Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的
功能。
基本语法是通过 {} 和 : 来代替以前的 % 。
format 函数可以接受不限个参数,位置可以不按顺序。

>>> a = "名字是:{0},身份是:{1}"
>>> a.format("谭松韵","偶像")
'名字是:谭松韵,身份是:偶像'
>>> a.format("谭松韵","老婆")
'名字是:谭松韵,身份是:老婆'
>>> b = "名字是:{0},身份是:{1}。{0}是个偶像派演员"
>>> b.format("谭松韵","演员")
'名字是:谭松韵,身份是:演员。谭松韵是个偶像派演员'
>>> c = "名字是:{name},年龄是:{age}"
>>> c.format(age=18,name="谭松韵")
'名字是:谭松韵,年龄是:18'

我们可以通过{索引}/{参数名},直接映射参数值,实现对字符串的格式化,非常方便。
附以前的格式化方式:
%c 单个字符
%d 十进制整数
%o 八进制整数
%s 字符串
%x 十六进制整数,其中字母小写
%X 十六进制整数,其中子母大写。

1.2 字符串的分割与合并

split()可以基于指定分隔符将字符串分隔成多个子字符串(存储到列表中)。如果不指定分隔
符,则默认使用空白字符(换行符/空格/制表符)。示例代码如下:

>>> a = "to be or not to be"
> >>> a.split()
['to', 'be', 'or', 'not', 'to', 'be']
>>> a.split('be')
['to ', ' or not to ', '']

join()的作用和 split()作用刚好相反,用于将一系列子字符串连接起来。示例代码如下:

>>> a = ['sxt','sxt100','sxt200']
>>> '*'.join(a)
'sxt*sxt100*sxt200'

拼接字符串要点:
使用字符串拼接符+,会生成新的字符串对象,因此不推荐使用+来拼接字符串。推荐
使用 join 函数,因为 join 函数在拼接字符串之前会计算所有字符串的长度,然后逐一拷贝,
仅新建一次对象。
Python知识回顾(3)_第1张图片

1.3 字符串驻留机制和字符串比较

字符串驻留:仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中。
Python 支持字符串驻留机制,对于符合标识符规则的字符串(仅包含下划线(_)、字母
和数字)会启用字符串驻留机制驻留机制。

>>> a = "abd_33" 
>>> b = "abd_33" 
>>> a is b
True
>>> c = "dd#" 
>>> d = "dd#" 
>>> c is d
False
>>> str1 = "aa" 
>>> str2 = "bb" 
>>> str1+str2 is "aabb
False
>>> str1+str2 == "aabb" 
True

1.4 Python的移位运算符

这是一个补充知识点:
在Python中,移位运算符要比加减乘除速度快很多。
如果处理的数字要刚好乘除Python 的2^n倍的话,可以考虑用移位运算符提升运算速度。

>>> a = 8
>>> a>>2
2
>>> a<<2
32
>>> a<<-2
Traceback (most recent call last):
File "", line 1, in 
a<<-2
ValueError: negative shift count

2. Python中的列表

Python中常用的序列结构有:
字符串、列表、元组、字典、集合
列表:用于存储任意数目、任意类型的数据集合。
列表是内置可变序列,是包含多个元素的有序连续的内存空间。列表定义的标准语法格式:
a = [10,20,30,40]
其中,10,20,30,40 这些称为:列表 a 的元素。
列表中的元素可以各不相同,可以是任意类型。比如:
a = [10,20,‘abc’,True]
列表对象的常用方法汇总如下,方便大家学习和查阅。
Python知识回顾(3)_第2张图片
Python 的列表大小可变,根据需要随时增加或缩小。
字符串和列表都是序列类型,一个字符串是一个字符序列,一个列表是任何元素的序列。我
们前面学习的很多字符串的方法,在列表中也有类似的用法,几乎一模一样。

2.1 列表的创建

2.1.1 基本语法[]创建

>>> a = [10,20,'lll','tansongyun']
>>> a = [] #创建一个空的列表对象

2.1.2 list()创建

使用 list()可以将任何可迭代的数据转化成列表。

>>> a = list() #创建一个空的列表对象
>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a = list("dwsbhahefj ")
>>> a
['d', 'w', 's', 'b', 'h', 'a', 'h', 'e', 'f', 'j', ' ']

2.1.3 range()创建整数列表

range()可以帮助我们非常方便的创建整数列表,这在开发中及其有用。语法格式为:
range([start,] end [,step])
start 参数:可选,表示起始数字。默认是 0
end 参数:必选,表示结尾数字。
step 参数:可选,表示步长,默认为 1
python3 中 range()返回的是一个 range 对象,而不是列表。我们需要通过 list()方法将其
转换成列表对象。

>>> list(range(3,15,2))
[3, 5, 7, 9, 11, 13]
>>> list(range(15,3,-1))
[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4]
>>> list(range(3,-10,-1))
[3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

2.1.4 推导式生成列表(简介一下,重点在 for 循环后讲)

使用列表推导式可以非常方便的创建列表,在开发中经常使用。但是,由于涉及到 for 循环
和 if 语句。在此,仅做基本介绍。在我们控制语句后面,会详细讲解更多列表推导式的细
节。

>>> a = [x*2 for x in range(5)] #循环创建多个元素
>>> a
[0, 2, 4, 6, 8]
>>> a = [x*2 for x in range(100) if x%9==0] #通过 if 过滤元素
>>> a
[0, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198]

2.2 列表元素的增加和删除

当列表增加和删除元素时,列表会自动进行内存管理,大大减少了程序员的负担。但这个特点涉及列表元素的大量移动,效率较低。除非必要,我们一般只在列表的尾部添加元素或删除元素,这会大大提高列表的操作效率。

2.3 列表的切片操作

注意和字符串一样,包头不包尾原则。
我们在前面学习字符串时,学习过字符串的切片操作,对于列表的切片操作和字符串类似。
切片是 Python 序列及其重要的操作,适用于列表、元组、字符串等等。切片的格式如下:
切片 slice 操作可以让我们快速提取子列表或修改。标准格式为:
[起始偏移量 start:终止偏移量 end[:步长 step]]
注:当步长省略时顺便可以省略第二个冒号

Python知识回顾(3)_第3张图片

2.4 列表的遍历与排序

2.4.1 列表的遍历

Python知识回顾(3)_第4张图片
如下代码实现列表元素的复制了吗?
list1 = [30,40,50]
list2 = list1
只是将 list2 也指向了列表对象,也就是说 list2 和 list2 持有地址值是相同的,列表对象本
身的元素并没有复制。
我们可以通过如下简单方式,实现列表元素内容的复制:
list1 = [30,40,50]
list2 = [] + list1
注:我们后面也会学习 copy 模块,使用浅复制或深复制实现我们的复制操作。

2.4.2 列表的排序

>>> a = [20,10,30,40]
>>> id(a)
46017416
>>> a.sort() #默认是升序排列
>>> a
[10, 20, 30, 40]
>>> a = [10,20,30,40]
>>> a.sort(reverse=True) #降序排列
>>> a
[40, 30, 20, 10]
>>> import random
>>> random.shuffle(a) #打乱顺序
>>> a
[20, 40, 30, 10]

上述方法是修改原列表,不建新列表的排序。
我们也可以通过内置函数 sorted()进行排序,这个方法返回新列表,不对原列表做修改。

>>> a = [20,10,30,40]
>>> id(a)
46016008
>>> a = sorted(a) #默认升序
>>> a
[10, 20, 30, 40]
>>> id(a)
45907848
>>> a = [20,10,30,40]
>>> id(a)
45840584
>>> b = sorted(a)
>>> b
[10, 20, 30, 40]
>>> id(a)
45840584
>>> id(b)
46016072
>>> c = sorted(a,reverse=True) #降序
>>> c
[40, 30, 20,  10]

通过上面操作,我们可以看出,生成的列表对象 b 和 c 都是完全新的列表对象。

2.4.3 reversed()返回迭代器

内置函数 reversed()也支持进行逆序排列,与列表对象 reverse()方法不同的是,内置函数reversed()不对原列表做任何修改,只是返回一个逆序排列的迭代器对象。

> c

>>> list(c)
[9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> list(c)
[]
>>> 

我们打印输出 c 发现提示是:list_reverseiterator。也就是一个迭代对象。同时,我们使用list©进行输出,发现只能使用一次。第一次输出了元素,第二次为空。那是因为迭代对象在第一次时已经遍历结束了,第二次不能再使用。
注:关于迭代对象的使用,后续章节会进行详细讲解。

3. Python中的元组

列表属于可变序列,可以任意修改列表中的元素。元组属于不可变序列,不能修改元组中的元素。因此,元组没有增加元素、修改元素、删除元素相关的方法。
我们只需要学习元组的创建和删除,元组中元素的访问和计数即可。元组支持如下操作:

  1. 索引访问
  2. 切片操作
  3. 连接操作
  4. 成员关系操作
  5. 比较运算操作
  6. 计数:元组长度 len()、最大值 max()、最小值 min()、求和 sum()等。

元组的注意事项:

  1. 元组的核心特点是:不可变序列。
  2. 元组的访问和处理速度比列表快。
  3. 与整数和字符串一样,元组可以作为字典的键,列表则永远不能作为字典的键使用。

3.1 元组的创建

3.1.1 通过()创建元组。小括号可以省略。

a = (10,20,30) 或者 a = 10,20,30。如果元组只有一个元素,则必须后面加逗号。这是因为解释器会把(1)解释为整数 1,(1,)解释为元组。

>>> a = (1)
>>> type(a)

>>> a = (1,) #或者 a = 1, >>> type(a)

3.1.2. 通过 tuple()创建元组

tuple(可迭代的对象)
例如:
b = tuple() #创建一个空元组对象
b = tuple(“abc”)
b = tuple(range(3))
b = tuple([2,3,4])
总结:
tuple()可以接收列表、字符串、其他序列类型、迭代器等生成元组。
list()可以接收元组、字符串、其他序列类型、迭代器等生成列表。

3.1.3.生成器推导式创建元组

从形式上看,生成器推导式与列表推导式类似,只是生成器推导式使用小括号。列表推导式直接生成列表对象,生成器推导式生成的不是列表也不是元组,而是一个生成器对象。
我们可以通过生成器对象,转化成列表或者元组。也可以使用生成器对象的__next__()方法进行遍历,或者直接作为迭代器对象来使用。不管什么方式使用,元素访问结束后,如果需要重新访问其中的元素,必须重新创建该生成器对象。

>>> s = (x*2 for x in range(5))
>>> s
 at 0x0000000002BDEB48>
>>> tuple(s)
(0, 2, 4, 6, 8)
>>> list(s) #只能访问一次元素。第二次就为空了。需要再生成一次
[]
>>> s
 at 0x0000000002BDEB48>
>>> tuple(s)
()
>>> s = (x*2 for x in range(5))
>>> s.__next__()
0
>>> s.__next__()
2
>>> s.__next__()
4

3.2 元组的访问与计数

元组的元素访问和列表一样,只不过返回的仍然是元组对象。

>>> a = (20,10,30,9,8)
>>> a[1]
10
>>> a[1:3]
(10, 30)
>>> a[:4]
(20, 10, 30, 9)

列表关于排序的方法 list.sorted()是修改原列表对象,元组没有该方法。如果要对元组排序,只能使用内置函数 sorted(tupleObj),并生成新的列表对象。

>>> a = (20,10,30,9,8)
>>> sorted(a)
[8, 9, 10, 20, 30]

在这里加一个小知识:
zip(列表 1,列表 2,…)将多个列表对应位置的元素组合成为元组,并返回这个 zip 对象。

>>> a = [10,20,30]
>>> b = [40,50,60]
>>> c = [70,80,90]
>>> d = zip(a,b,c)
>>> list(d)
[(10, 40, 70), (20, 50, 80), (30, 60, 90)]

你可能感兴趣的:(字符串,列表,元组,python)