本篇介绍不可变序列,即字符串和元组。
在序列类型的学习中,字符串是最基础的,学好字符串,理解序列会更加容易,对于列表,元组等的学习就会更加迅速。
字符串的创建
在python中,用单引号或者双引号来定义一个字符串变量,例如:
e_string = 'hello, world!'
特别地,当定义的字符串本身含有单引号时,只能用双引号来定义,同理,但字符串含有双引号就要用单引号来定义。而当字符串既有单引号,又有双引号,或者字符串是多行时,可用三个双引号来定义。
second_string = "it's good."
third_string = 'you said, "that is good".'
fourth_string = """it's good.
you said,
"that is good"."""
print(e_string, second_string, third_string)
print(fourth_string)
可以得到以下结果:
字符串的拼接
字符串可以用算数运算符(加法运算符和乘法运算符)进行拼接,例如:
1.加法运算符
hello_string = 'hello, '
world_string = 'world! '
hello_world_string = hello_string + world_string
2.乘法运算符
tripe_hello = hello_world_string * 3
这时候可能就会有好奇宝宝要问了,减法运算符可以用吗?在这里先传授大家学习的重要方法:不仅要多动脑,多提问,更重要的是多动手。吾尝终日而思矣,不如须臾之所学也。自己在pycharm中试一下,就会知道答案。
答案是不能。
字符串的增删改查
说到序列,我们自然能够想到四个操作——增,删,改,查。
1.增删改
实际上来说,既然字符串是不可变序列,那么不能进行增,删,改的操作,为什么这里可以呢?实际上,是把原来的字符串删除了,然后再重新定义了一个字符串,可通过以下程序进行测试:
my_string = 'hello, '
your_string = 'world'
print(id(my_string))
my_string = my_string + your_string
print(id(my_string))
其中,id()函数用于指出对象存储的位置,打印后可以明显看到id已经发生了改变。
所以说,对于不可变字符串而言,增,删,改其实都意味着:先把原来的变量删除,然后再定义一个新的变量。如果只是单纯地想要删除一个字符串,释放内存,可通过以下操作:
# region 删除字符串
to_del_string = 'hello'
del to_del_string
# endregion
2.查
接下来说说查,查找操作分为很多种,介绍如下:
1.查找某个位置上的元素
既然是序列,那么排序的逻辑就要搞清楚,通常我们称之为“索引”。在python中,有两种方式来表示索引,第一种是从前往后,称为“正向索引”,这种方式将第一个位置上的索引记为0,第2个位置上的索引记为1,依次类推。第二种称为“方向索引”,这种方式将倒数第一个的索引记为-1,倒数第二个记为-2,依此类推。
特别地,对于索引还能实现“切片操作”,即取出序列中的一部分元素。例如string[2;5],表示将string中的第2,3,4个元素取出,注意“切片“操作中,
1)索引可以用正向也可以用反向,而且也可以混用(但是不建议,不论写python还是其他语言,尽量简单易懂)
2)“切片”包含左索引但不包含右索引。
下面给出一个例子:
# region 测试索引
test_string = 'hello, world!'
# 正向索引从0开始
print(test_string[0], test_string[1])
# 负向索引从-1开始
print(test_string[-1], test_string[-2])
# 正向切片操作
print(test_string[2:5])
# 负向切片操作
print(test_string[-5: -2])
# 混用正向和负向,但不建议
print(test_string[-5:10])
# endregion
得到结果如下:
2.查找某个元素在不在序列中
通常使用in或者not in来判断一个元素是否出现在序列中,通常是在一个判断语句中这么做,关于判断语句可在以下链接中查看。
给出一个demo:
# region 查找元素在不在字符串中
test_string = 'hello, world!'
if 'h' in test_string:
print('it is in string!')
if 'a' not in test_string:
print('it is not in string!')
# 查看某个元素在字符串中出现了几次
l_num = test_string.count('l')
print(l_num)
# endregion
运行结果如下:
3.查找某个元素出现的位置
对于字符串而言,可以通过find()或index()方法找出某个元素首次出现的位置,但是对于多次出现的元素也只能找到首次出现位置。因此,如果想要拥有更加强大的查找功能,就要使用正则表达式,这个将在python高级教程中提及。
在实际应用中,建议先判断元素是否在字符串中,再进行位置的查找。因为如果元素并未在字符串中而直接查找,将会导致程序报错。
给出一个demo:
# region查找某个元素在字符串中出现的位置
test_string = 'hello, world!'
l_index = test_string.find('l')
print(l_index)
print(test_string.index('l'))
# endregion
运行后将会看到,l在“hello, world!“中出现的位置为2。
学完字符串后,元组的学习就简单多了。
元组的创建
在python中,可通过如下命令创建一个元组:
a_tuple = (1, 2, 3, 4)
特别地,当元组只包含一个数字时,必须要加上逗号,否则括号将被认为时一个运算符(即这里的括号被认为是:先乘除,后加减,括号优先),给出一个demo:
# region 创建只有一个数字的元组
a_number_tuple = (1,)
a_number = (1)
print(type(a_number), type(a_number_tuple))
# endregion
可以明显看到,a_number的类型为数字而不是元组。
元组的拼接
与字符串类似,元组也可以用加法运算符和乘法运算符进行拼接。
元组的增删改查
元组的增删改与字符串一致,这里注意一下,在删除操作中用到的 del()其实是删除了整个变量,而非删除了某个元素,由于字符串和元组是不可变序列,所以是不可能实现“删除某个元素”这种操作的。
同样地,元组的索引、“切片”跟字符串一样,不仅如此,后面讲到的列表也是相同的。
元组也可以通过in以及not in 判断元素是否存在于元组中。
而且,元组也是通过index()方法来查找某个元素首次出现的位置。
怎么样,这些知识是不是和字符串几乎一模一样。
下面给出一个demo:
# region 测试元组
test_tuple = (1, 'hello', 'world')
print(test_tuple[1])
if 1 in test_tuple:
print('1 is in tuple!')
if 'my' not in test_tuple:
print('string "my" is not in tuple!')
hello_index = test_tuple.index('hello')
print(hello_index)
# endregion
可以看到结果为