学习一门语言,了解其数据结构是基础。由于Python是动态编程语言,所以在定义变量时并不需要事先指定变量的数据类型,变量的声明和初始化是同时进行的。
Python有如下五大数据结构类型:
1、Number类型
2、字符串类型
3、列表,元组
4、字典
5、集合
下面我们逐一来了解一下~
本篇主要介绍字符串类型,是数据结构类型介绍的第二篇。
第一篇关于Number类型的介绍,可以点这儿。
二、字符串类型
字符串类型,一般也称String类型,是各个语言中最常用到的数据结构类型。
1.1 字符串表达方式
1.1.1 单引号与双引号
在python语言中,字符串可以用单引号(‘hello’)或双引号(“hello”)来表示,2种表示方式基本没啥区别
str1 = 'hello'
str2 = "world"
# 输出结果:hello world
print(str1, str2)
1.1.2 转义符
如果需要输出带引号的字符串,就会用到转义符(\)了
首先,输出单引号的字符串,可以用双引号包起来:
str1 = "It's me!"
# 输出结果:It's me!
print(str1)
再来,输出双引号的字符串,可以用单引号包起来:
str1 = '他说:"好的"'
# 输出结果:他说:"好的"
print(str1)
最后,如何输出既有单引号又有双引号的字符串:
str1 = '他说:"It's me"'
print(str1)
str2 = "他说:"It's me""
print(str2)
运行报错,这是因为python解释器无法判断字符串中间的引号是正常的字符,还是多余的单引号,所以抛出语法错误!
那么如何同时输出既有单引号又有双引号的字符串呢?转义符(\)闪亮登场:
str1 = '他说:"It\'s me"'
# 输出结果:他说:"It's me"
print(str1)
转义符的作用就是告诉python解释器,反斜杠(\)后面的字符是字符串的一部分,而非用于表达字符串。
附上转义符(\)的常见用法
转义字符 | 描述 |
---|---|
\(处于行尾位置) | 续行符 |
\\ | 反斜杠 |
\’ | 单引号 |
\" | 双引号 |
\a | 响铃 |
\b | 退格 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
1.1.3 保持字符串原始含义
有时候,我们并不想转义符起作用,就是想输出一段介绍转义符的文字,结果被python解释器”转义“了。
看个栗子~
str1 = "在python中,'\n'字符用于换行"
print(str1)
可以看到,\n被当成换行了,这与我们的初衷相悖,怎么办呢?
有三种解决方法:
- 使用反斜杠将反斜杠转义,有点拗口~
- 使用repr() 函数
- 在字符串前加 r
str1 = "在python中,'\\n'字符用于换行"
print(str1)
str2 = "在python中,'\n'字符用于换行"
print(repr(str2))
str3 = r"在python中,'\n'字符用于换行"
print(str3)
可以看到,都能完整的输出字符串,不再进行转移了,其中repr() 函数还将引号也一并输出。
1.1.4 三引号
在python中,我们还会见到一种特殊的字符串表达方式,用三引号表示,既可以是三个单引号,也可以是三个双引号。
三引号在python中有2种使用方式
-
用于字符串跨行,不必使用拼接符或换行符
str1 = "hello, world!\n hello, world!\n hello, world!\n" print(str1) str2 = "hello, world!\n" + \ " hello, world!\n" + \ " hello, world!\n" print(str2) str3 = ''' hello, world! hello, world! hello, world! ''' print(str3)
-
用于注释
''' @desc: 计算两个数的和 @param a: 加数a @param b: 加数b ''' def sum(a, b): return a + b print sum(1, 2)
1.2 字符串格式化
1.2.1 格式化基础
什么叫字符串格式化,百度百科给出了定义:
格式化字符串(Format String)是在编程过程中,允许编码人员通过特殊的占位符,将相关对应的信息整合或提取的规则字符串。
简单来说,字符串格式化相当于定义一个模板,其中有一部分是固定不变的,另一部分是动态变化的。这些动态变化的部分在python中使用 % 操作符进行替换。
str_template = "Hello, my name is %s, I'm %d years old"
# 输出结果:Hello, my name is LiLei, I'm 14 years old
print(str_template % ("LiLei", 14))
从上面例子可以看出,不仅模板中的格式化参数要用 %(%s、%d),格式化操作时候也要用到 %
常用的字符串格式化符号如下表所示:
符号 | 描述 |
---|---|
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串 |
%d | 格式化整型 |
%u | 格式化无符号整型 |
%o | 格式化无符号八进制 |
%x | 格式化无符号十六进制 |
%X | 格式化无符号十六进制(大写) |
%f | 格式化浮点数字,可以指定精度值,比如 %.4f |
%e | 用科学计数法格式化浮点数 |
%% | 百分号 |
常用格式化辅助符号:
辅助符号 | 描述 |
---|---|
m.n | m是显示的最小总宽度,n是小数位数 |
- | 左对齐 |
+ | 正数前面显示加号 |
# | 八进制前显示’0o’,十六进制前显示’0x’/‘0X’ |
0 | 显示的数字前面填充’0’取代空格 |
学了这么多,不动手写一写全白搭~
print('%c' % 97)
print('%s' % 'hello world')
print('%+d' % 97)
print('%#o' % 97)
print('%#x' % 97)
print('%#X' % 97)
print('%e' % 100000000000)
print('%%' % ())
print('%8.3f' % 97.4567)
print('%-8.3f' % 97.4567)
print('%08.3f' % 97.4567)
1.2.2 模板字符串
在string模块中,有个Template的类,可批量替换所有相同的格式化参数,与上面不同的是,格式化参数用 $ 符号
template = Template("$str1 is $str1, not $str2")
# 输出结果:one is one, not two
print(template.substitute(str1="one", str2="two"))
1.2.3 format() 方法
字符串本身也有一个format()方法用于格式化自身,字符串自身的格式化参数与上面2种又不一样(抓狂!!!),用的是 {} 占位符。
format()方法常用的匹配方法有三种:
- 不带编号,即“{}”;
- 带数字编号,可调换顺序,如“{0}”、“{1}”等;
- 带关键字,如“{name}”、“{age}”等。
# 输出结果:1 2 3
print("{}, {}, {}".format(1, 2, 3))
# 输出结果:3 2 1
print("{2}, {1}, {0}".format(1, 2, 3))
# 输出结果:1 3 2
print("{a}, {b}, {c}".format(a=1, c=2, b=3))
format()方法功能很强大,远不止上面这些,下面例子
# 输出结果:我, '我', '\u6211'
print("{str1!s}, {str1!r}, {str1!a}".format(str1="我"))
除此之外,format()方法还支持很多其他控制符,比如,将整数按浮点数输出、进制之间转换、控制字符宽度与精度、对齐方式、0填充等。
print("{:f}".format(10))
print("{:o}".format(10))
print("{:x}".format(10))
print("{:X}".format(10))
print("{:10.4f}".format(10))
print("{:010.4f}".format(10))
print("{:.5}".format('hello,world'))
print("{:,}".format(10 ** 10))
print("{:<10.4f}".format(10))
print("{:>10.4f}".format(10))
print("{:^10.4f}".format(10))
1.2.4 f字符串
python 3.6版本以后,引入了 f字符串,可以很方面的直接引用外部变量。
str1 = "hello"
str2 = "world"
# 输出结果:hello, world!
print(f"{str1}, {str2}!")
1.3 字符串方法
字符串方法太多了,这里主要介绍一些常见的方法,可以完成日常大部分字符串操作,其他的感兴趣的可以自行查阅~
-
字符串连接:join()
# join()方法用于连接列表中的元素 l = ['1', '2', '3'] # 输出结果:123 print("".join(l)) # 字符串连接还可以用字符串连接符 + print('1' + '2' + '3') # 字符串连接还可以用格式化方法 print("%s%s%s" % (1, 2, 3))
-
字符串查找:find()
# find()方法用于在字符串中寻找字串,如果找到,返回字串的索引,如未找到,返回-1 # 输出结果:9 print("hello world".find("ld")) # 输出结果:-1 print("hello world".find("xx"))
-
字符串分割:split()
# split()方法是join()方法的逆操作,将字符串分割为列表 # 输出结果:['hello', 'world'] print("hello world".split(" ")) # 默认以空格分隔 # 输出结果:['hello', 'world'] print("hello world".split()) # 输出结果:['1', '2', '3'] print("1+2+3".split("+"))
-
字母大小写转换:upper()、lower()
# 输出结果:HELLO WORLD print("HeLlo WOrld".upper()) # 输出结果:hello world print("HeLlo WOrld".lower())
-
字符串替换:replace()
# replace()方法用于在字符串中替换指定的子串,如果未找到子串,则不替换 # 输出结果:hi world print("hello world".replace("hello", "hi")) # 输出结果:hello world print("hello world".replace("hi", "hoho"))
-
字符串截取:strip()
# strip()方法用于截取字符串前后指定字符,默认是空格 str1 = "{:^12.4f}".format(10) # 输出结果: 10.0000 print(str1) # 输出结果:10.0000 print(str1.strip()) # 输出结果:str1 print("#str1#".strip("#"))
-
索引和切片
字符串在python中本质上是字符列表,既然是列表,就有索引概念,索引编号默认是从0开始的,并且在python中,还支持反向索引,用负数表示:
str1 = "hello world" # 输出结果:h print(str1[0]) # 输出结果:l print(str1[-2])
切片操作可以从列表中根据指定的开始索引与结束索引来获取一个新的子列表,切片有如下几个特点:
(1)切片截取的是左开右闭区间,s[1:3]取的是s[1]与s[2]
(2)结束索引若为0,会获取一个空列表
(3)结束索引在列表中的位置若小于等于开始索引在列表中的位置,也会返回一个空列表
(4)切片默认步长是1,也可以手动指定,但步长不能为0,否则会抛出异常
str1 = "hello world" # 输出结果:hell print(str1[0:4]) # 结束索引为0,输出结果:(空列表) print(str1[4:0]) # 输出结果:o worl print(str1[4:-1]) # 结束索引在列表中的位置小于等于开始索引在列表中的位置,输出结果:(空列表) print(str1[4:-7]) # 省略开始索引,表示从0开始,输出结果:hell print(str1[:4]) # 省略结束索引,表示截取到列表结尾,输出结果:hello world print(str1[0:]) # 省略开始与结束索引,表示复制整个列表,输出结果:hello world print(str1[:]) # 指定步长为2,输出结果:hlowrd print(str1[::2]) # 指定反向步长为1,输出结果:dlrow olleh print(str1[::-1])
下篇开始介绍列表与元组,如果觉得小编写的不错的话,麻烦给个关注,点赞、转发~
更多的Python学习资料,可以到这儿获取,持续不间断地免费更新Python资料~