1.7 序列结构
可变对象和与可变对象
Python中内置数据类型主要有三大类:
-
数字:整型、浮点型
-
序列:字符串、列表、元组、集合
-
映射:字典
按照是否可以原地修改分为两大类:
-
不可变对象(数字,字符串,元组,不可变集合)
不可变的分类中没有哪个对象类型支持原地修改,但可以创建新的对象并将结果赋予变量
-
可变对象(列表,字典,可变集合)
相反,可变的类型总是可以通过相关的操作进行原处修改,而不需要创建新的数据对象
序列的通用操作
索引,切片,相加,相乘,迭代和成员资格检查
索引操作
索引中的所有元素都有编号(角标),角标从0开始计数,当然在Python当中,也可以使用负角标来访问元素,所有最后一个元素的角标-1(倒数第一个)
>>> word = "hello"
>>> word[0]
'h'
>>> word[2]
'l'
>>> word[-1]
'o'
>>> word[-5]
'h'
>>> word[10]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
对于序列的字面量,可以直接用角标操作,而不需要变量
>>> "hello"[3]
'l'
>>> "hello"[-1]
'o'
切片操作
索引是一次去一个数据,切片是一次取一片数据,要定开始和结尾,包括步长(默认为1)
>>> word = "12345678"
>>> word[0:3]
'123'
>>> word[-3:-1]
'67'
不管是正索引,还是负索引,必须要保证顺序
>>> word[1:8:2]
'2468'
>>> word[-6:-2:3]
'36'
>>> word[7:1:-2]
'864'
>>> word[-1:-5:-1]
'8765'
>>> word[-1:-5:1]
''
>>> word[:]
'12345678'
>>> word[2:]
'345678'
>>> word[:5]
'12345'
>>> word[-5:]
'45678'
>>> word[-3::-1]
'654321'
步长是正数,开始~结尾 递增
步长是负数,开始~结尾 递减
>>> text = "我爱你"
>>> text = text[::-1]
>>> text
'你爱我'
>>> text = text[-1:-4:-1]
>>> text
'我爱你'
相加操作
指的是两个序列合并,会产生新的序列对象,不会改变原先序列的值
>>> s1 = "abc"
>>> s2 = "ABC"
>>> s1 + s2
'abcABC'
>>> s1
'abc'
>>> s2
'ABC'
相加只能是在同类型序列之间进行
相乘操作
将序列与数字x相乘,将重复这个序列x次创建一个新的序列
>>> s1
'abc'
>>> s3 = s1 * 3
>>> s3
'abcabcabc'
迭代操作
可以在for循环中迭代序列中的每一元素,或者迭代角标来获取元素
>>> s1
'abc'
>>> for i in s1:
... print(i)
...
a
b
c
>>> for i in range(len(s1)):
... print(s1[i])
...
a
b
c
>>> word[0] = '9'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
成员资格检查操作
就是验证一个数据元素是否存在于当前序列当中
>>> '8' in word
True
>>> 8 in word
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'in <string>' requires string as left operand, not int
>>> '10' not in word
True
>>> '10' in word
False
>>> 5 in range(0,10)
字符串
不可变对象,一个有序的字符集合,用于存储和表现基本文本信息
字符串不允许原地修改值,字符串的长度大小一旦定义则不能修改
如果真想去修改字符串的话,只能创建一个该字符串的副本,副本的内容就是修改过后的内容
测试字符串方法:
-
isalnum():验证是否只包含数字和字母
-
isalpha():验证是否只包含字母
-
isdigit():验证是否只包含数字