目录

  • 零. 前言
  • 一. 字符串的赋值与格式化处理
  • 1. 初始化
  • 2. 格式化
  • 二. 字符串操作
  • 1. 遍历
  • 2. 拼接
  • 3. 切片
  • 4. 反转
  • 5. 查找替换
  • 三. 字符串编码


零. 前言

python的字符串算是吸引我学习python的最直接原因

当初学c的时候, 定义一个字符串需要初始化一个字符数组, 然后往这个数组里面一个一个的填字符, 麻烦至极, 但是在python中却优雅的很, 直接变量名加上等于符号即可

example = "string"

于是, 便走上了学python的坑. 这篇博客也是想聊聊Python的字符串这一数据结构, 主要的内容如下:

  1. 字符串的赋值格式化处理
  2. 字符串的常用的一些内置函数
  3. 字符串编码

一. 字符串的赋值与格式化处理

1. 初始化

在Python中, 字符串的初始化有以下三种: ‘’(单引号), “”(双引号), “”""""(三重引号)

其中, 单双引号("", “”"") 没有太大的本质区别, 在开发中主要的用途是兼容字符串中出现的引号,
比如, 如果字符串中有单引号(’’), 那么就可以使用双引号来避免使用转义符

some_string = "single quotation marks '' in init string"

同理, 如果在字符串中有双引号(""), 那么外面就要用单引号来初始化

some_stirng = 'double quotation marks "" in init string  '

三重引号的使用场景是可以保存字符串的格式(三重引号可以是’’‘something’’’, 也可以是""“some thing”""):

string_a = """
a
b
c
"""

# output:
# a
# b
# c

2. 格式化

字符串的格式化有以下种方式:

  1. % 操作符

这个操作符和c语言类似, 也是因为python是c写的, 所以语言的语法借鉴:

特殊的是, 这个%s会自动将数字也转成字符

a = "this is %s" % "hello"
b = "this is %s" % 11
# output 
# a: 'this is hello'
# b: 'this is 11'
  1. format函数

format表达式是后面提出的, 主要是为了解决字符串中如果要填的值太多容易导致混乱的问题

a = "{a}, {b}, {c}".format(a=11, b=22, c=22)
# output
# a: '11, 22, 22'
  1. f表达式

f表达的使用有两个比较重要的好处:

  1. 可以清楚的看到这个字符串中使用的变量名
name = "xxz"
age = 17
a = f"my name is {name}, and i am {age}"
# output:
# a: 'my name is xxz, and i am 17'
  1. 可以在f表达式中进行一些函数执行或者变量的操作
first_name = "x"
second_name = "xz"
a = f"my name is {first_name}{second_name}"
# output:
# a: 'my name is xxz'

二. 字符串操作

1. 遍历

在python中, 字符串是可迭代的, 有两种方式, 直接迭代字符串, 迭代项为字符, 第二种是使用range函数迭代索引, 迭代项为索引号码

a = "abcdef"
for i1 in a:
    print(i1)
# i1是字符, abcdef

for i2 in range(len(a)):
    print(i2)
    print(a[i2])
# i2是索引数字, 01234
# a[i2]即为对应位置的字符: abcdef

2. 拼接

在python中, 拼接字符可以简单的用 + 操作符来实现

str_1 = "a"
str_2 = "b"
final = str1 + str2
# output: ab

常用的情况是拼接列表中的多个字符串

string_l = ["a", "b", "c", "d"]
new_str = ""
for i in string_l:
    new_str += i
# output: abcd

这里值得一提的是在Python中, 字符串是不可变对象, 所以这种操作的代价很高, 更好的拼接操作是用join

string_l = ["a", "b", "c", "d"]
new_str = "".join(string_l)
# output: abcd

此外, 在Cpython中, 字符串在只有一个字符串引用的情况下是可变的, 但是根据PEP8 中的规则, python开发最好不要和底层实现关系过大, 保证在各种实现中效果一致, 所以统一使用join操作符回比价好

3. 切片

python的切片用来获取字符串中想要的部分, 使用分片操作符[param1:param2:param3]

第一个参数是开头, 第二个参数是结尾, 第三个参数是间隔获取

例如下面这个例子, 我们需要前五个字符

all_string = "abcde1314564"
need_string = all_stirng[0:5]
# need_string: abced

切片获取的原则是顾头不顾尾, 这样设计的好处有两个:

方便分开获取, 例如以5为界限, 前半部分和后半部分的获取就是[0:5]和[5:] :

all_string = "abcde1314564"
first_string = all_stirng[0:5]
second_string = all_string[5:]
# need_string: abced

方便计算需要的个数, 例如第一个例子中的前五个, 那么切片的第二个数字就是5

4. 反转

字符串经常会有反转的需求, 常用的两个方式是切片和join

old_string = "abcde"
new_string = old_string[::-1]
new_string2 = ''.join(reversed(old_string))
# output: new_string:edcba new_string2:edcba

5. 查找替换

先说查找, 在实际开发中一般用到的是查找字符是否在字符串中和找到字符的位置

find_string = "c"
string_test = "abcde"
find_string in string_test  #  True
string_test.index(find_string)  #  0

接着是替换, 是内置的replace函数, 同样, 如果想消除字符串中的某个字符, 可以将要删除的字符替换为空

old_string = "abcde"
new_string = old_string.replace("a", "b") # bbcde
new_string2 = old_string.replace("a", "") # bcde

三. 字符串编码

python与其他的数据格式最大的不同在于他还有个编码问题, 在很多代码中大家都可以看见这样一个注释

# -*-coding:utf-8 -*-

这个注释的作用就是用来指定编码, 告诉python的解释器这个该文件的保存格式是utf-8, 防止文件中含有中文导致报错

当然, 这个注视是源自于python2的pep8编码规范(https://peps.python.org/pep-0263/), 现在在python3中默认的编码格式就是utf-8, 所以现在新的项目中就很少出现了

补充, 计算机编码的历史:

数字 =》英文编码(acill) =》各国语言编码(GB2312, Euc-krd等) =》所有国家统一语言编码(unicode) =》 节约资源的可变长度编码(utf-8)