>>> from env_helper import info; info()
页面更新时间: 2020-02-27 19:02:29
操作系统/OS: Linux-4.19.0-8-amd64-x86_64-with-debian-10.3 ;Python: 3.7.3

4.6. 字符串和元组

字符串是单个文本字符的列表。对列表的许多操作,也可以作用于字符 串:按下标取值、切片、用于 for 循环、用于 len() , 以及用于 innot in 操作符。

>>> name = 'Zophie'
>>> name[0]
'Z'
>>> name[-2]
'i'
>>> name[0:4]
'Zoph'
>>> 'Zo' in name
True
>>> 'p' not in name
False
>>> for i in name:
>>>     print('* * * ' + i + ' * * * ')
* * * Z * * *
* * * o * * *
* * * p * * *
* * * h * * *
* * * i * * *
* * * e * * *

4.6.1. 可变和不可变数据类型

列表是“可变的”数据类型,它的值可以添加、删除或改变。但是,字符串是“不可变的”,它不能被更改。尝试 对字符串中的一个字符重新赋值,将导致 TypeError 错误。如下实例:

name = 'Zophie a cat'
name[7] = 'the'

TypeError: 'str' object does not support item assignment

“改变”一个字符串的正确方式,是使用切片和连接。构造一个“新的”字符串,从老的字符串那里复制一些部分。例如:

>>> name = 'Zophie a cat'
>>> newName = name[0:7] + 'the' + name[8:12]
>>> name
'Zophie a cat'
>>> newName
'Zophie the cat'

我们用 [0:7][8:12] 来指那些不想替换的字符。请注意, 原来的 'Zophie a cat' 字符串没有被修改, 因为字符串是不可变的。尽管列表值是可变的, 但下面代码中的第二行并没有修改列表 eggs:

>>> eggs =[1,2, 3]
>>> eggs = [4, 5, 6]
>>> eggs
[4, 5, 6]

这里 eggs 中的列表值并没有改变,而是整个新的不同的列表值([4, 5, 6]) , 覆写了老的列表值。如图4-2所示。

_images/img4_3.png

图4-2当 eggs=[4,5,6] 被执行时,eggs 的内容被新的列表值取代

如果你确实希望修改 eggs 中原来的列表, 让它包含 [4, 5, 6] ,就要这样做:

>>> eggs = [1, 2, 3]
>>> del eggs[2]
>>> del eggs[1]
>>> del eggs[0]
>>> eggs.append(4)
>>> eggs.append(5)
>>> eggs.append(6)
>>> eggs
[4, 5, 6]

在第一个例子中, eggs 最后的列表值与它开始的列表值是一样的。 只是这个列表被改变了,而不是被覆写。图4-3展示了前面交互式脚本的例子中, 前7行代码所做的7次改动。

_images/img4_4.png

图4-3 del 语句和 append() 方法当场修改了同一个列表值

改变一个可变数据类型的值,当场改变了该值,因为该变量的值没有被一个新的列表值取代。

4.6.2. 元组数据类型

除了两个方面,“元组”数据类型几乎与列表数据类型一样。 第一,元组输入时用圆括号 () ,而不是用方括号[] 。例如:

>>> eggs = ('hello', 42, 0.5)
>>> eggs[0]
'hello'
>>> eggs[1:3]
(42, 0.5)
>>> len(eggs)
3

第二,元组是不可变的。元组不能让它们的值被修改、添加或删除。例如:

eggs = ('hello', 42, 0.5)
eggs[1] = 99

TypeError: 'tuple' object does not support item assignment

另外,Python可以实现一些优化,让使用元组的代码比使用列表的代码更快。

4.6.3. list()tuple() 函数来转换类型

函数 list()tuple() 将返回传递给 它们的值的列表和元组版本。在交互式环境中输入以下代码, 注意返回值与传入值是不同的数据类型:

>>> tuple( ['cat' , 'dog', 5])
('cat', 'dog', 5)
>>> list (('cat', 'dog', 5))
['cat', 'dog', 5]
>>> list('hello')
['h', 'e', 'l', 'l', 'o']

4.6.4. 元组

元组语法很简单,只要将一些值用逗号分隔,就能自动创建一个元组。

>>> 1, 2, 3
(1, 2, 3)

如你所见,元组通常用圆括号括起。

>>> (1, 2, 3)
(1, 2, 3)
>>> tup1 = () #创建空元组
>>> tup1 = (50)
>>> type(tup1)     # 不加逗号,类型为整型
int
>>> tup1 = (50,)
>>> type(tup1)     # 加上逗号,类型为元组
tuple

注意 加上一个逗号,就能完全改变表达式的值。

>>> 3 * (40 + 2)
126

添加逗号后,如下 :

>>> 3 * (40 + 2,)
(42, 42, 42)

为何要熟悉元组呢?原因有以下两个。

  • 它们用作映射中的键(以及集合的成员),而列表不行。

  • 有些内置函数和方法返回元组,这意味着必须跟它们打交道。只要不尝试修改元组,与元组“打交道”通常意味着像处理列表一样处理它们(需要使用元组没有的index和count 等方法时例外)。

4.6.5. 访问元组

元组可以使用下标索引来访问元组中的值,例如:

>>> tup1 = ('Google', 'Runoob', 1997, 2000)
>>> tup2 = (1, 2, 3, 4, 5, 6, 7 )
>>>
>>> print ("tup1[0]: ", tup1[0])
>>> print ("tup2[1:5]: ", tup2[1:5])
tup1[0]:  Google
tup2[1:5]:  (2, 3, 4, 5)

4.6.6. 修改元组

元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,例如:

>>> tup1 = (12, 34.56);
>>> tup2 = ('abc', 'xyz')
>>>
>>> # 以下修改元组元素操作是非法的。
>>> # tup1[0] = 100
>>>
>>> # 创建一个新的元组
>>> tup3 = tup1 + tup2;
>>> print (tup3)
(12, 34.56, 'abc', 'xyz')

4.6.7. 删除元组

元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,例如:

>>> tup = ('Google', 'Runoob', 1997, 2000)
>>> print (tup)
>>> del tup
>>> print ("删除后的元组 tup : ")
>>> print (tup)
('Google', 'Runoob', 1997, 2000)
删除后的元组 tup :
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

<ipython-input-62-b2b7fab1cdfe> in <module>()
      3 del tup
      4 print ("删除后的元组 tup : ")
----> 5 print (tup)


NameError: name 'tup' is not defined

4.6.8. 元组内置函数

Python元组包含了以下内置函数

len(tuple) 计算元组元素个数。

>>> tuple1 = ('Google', 'Runoob', 'Taobao')
>>> len(tuple1)
3

max(tuple) 返回元组中元素最大值。

>>> tuple2 = ('5', '4', '8')
>>> max(tuple2)
'8'

min(tuple) 返回元组中元素最小值。

>>> tuple2 = ('5', '4', '8')
>>> min(tuple2)
'4'

tuple(seq) 将列表转换为元组。

>>> list1= ['Google', 'Taobao', 'Runoob', 'Baidu']
>>> tuple1=tuple(list1)
>>> tuple1
('Google', 'Taobao', 'Runoob', 'Baidu')