什么是字符串
由独立字符组成的一个序列,一般使用单引号('')双引号("")或者三引号(''' '''或""" """)包围。字符串的内容可以包含字母、标点、特殊符号、中文、日文等全世界的所有文字。
auther = '林小贱'
reader = '帅气的读者'
注意: 相同的引号不能使用多个一起使用,比如 a = ' '123' ' 或 a = " "123" ",如果我们字符串需要带引号,我们可以使用用反斜杠 \ 进行转义。
a = '\'123\''
print("a", a)
# 输出
# "'123'"
常见的转义字符
转义字符 | 含义 |
\(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\' | 单引号 |
\" | 双引号 |
\n | 换行 |
\t | 横向制表符 |
\b | 退格 |
转义字符实例
a = "当我们的遇到长字符串的时候,为了我们代码看起来美观," \
"我们也可以使用续行符号," \
"其实这个也是相对来说简单,我们只要在字符串中按回车键就可以了" # 这里的\就是续行符
b = """
我是一个一个反斜号:\\,
我是一个单引号: \',
我是一个双引号: \",
我要换行\n了,
我是横向制表符\t了,
我是退格\b.
"""
print(a)
print(b)
# 输出
当我们的遇到长字符串的时候,为了我们代码看起来美观,我们也可以使用续行符号,其实这个也是相对来说简单,我们只要在字符串中按回车键就可以了
我是一个一个反斜号:\,
我是一个单引号: ',
我是一个双引号: ",
我要换行
了,
我是横向制表符 了,
我是退.
字符常用的操作
索引
a = "abcd"
a[0] # a
切片
左闭右开的原则
a = "123456789"
a[0:2] # 12
遍历
a = "123456789"
for i in a:
print(i)
1
2
3
4
5
6
7
8
9
这里我们需要注意,Python 的字符串是不可变的(immutable),如下操作是不允许的:
a = "123456789"
a[0] = 1
Traceback (most recent call last):
File "/Users/linjian/MonitorCenter/MonitorCenter/apps/t6.py", line 2, in <module>
a[0] = 1
TypeError: 'str' object does not support item assignment
另外python中可变序列有列表,字典;不可变序列有元组,字符串。
python字符编码
我们要了解在计算机中储存的信息都是用二进制数表示的,即它只认识 0 和 1 两个数字,而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码";反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致'a'解析成'b'或者乱码。
字符集
字符是各种文字和符号的总称,而字符集定义了字符和二进制的对应关系,为每个字符分配了唯一的编号。可以将字符集理解成一个很大的表格,它列出了所有字符和二进制的对应关系,计算机显示文字或者存储文字,就是一个查表的过程;
字符编码
规定了如何将字符的编号存储到计算机中,要知道,有些字符编码规定,不同字符在存储时所占用的字节数是不一样的,因此为了区分一个字符到底使用了几个字节,就不能将字符的编号直接存储到计算机中,字符编号在存储之前必须要经过转换,在读取时还要再逆向转换一次,这套转换方案就叫做字符编码
Python使用哪种字符编码?
import sys
# 查看当前环境的编码格式
print(sys.getdefaultencoding())
# utf-8
在Python2 中使用 ASCII 码作为默认编码方式导致 string 有两种类型 str 和 unicode,Python3 只 支持 unicode 的 string
python中也提供了ord() 和 chr() 函数实现字符和编码数字之间的转换
>>ord("a")
97
>>chr(97)
'a'
我们在开发的时候有时候我们需要其他的编码或者用其他的编码来进行解码,体贴的python为我们准备了 encode (编码: str 类型转换成 bytes 类型)和 deocde (解码:bytes 类型的二进制数据转换为 str 类型)两个方法
格式化输出
使用 %
# 单个可以不用元组
print("%s的%s" % ("帅气", "读者"))
帅气的读者
但是这个如果更长的字符串中嵌入更多变量,代码的可读性就会成为一个问题:
print("%s,%s,%s,%s,%s,%s" % ("a", "b", "c", "d,", "e", "f"))
看起来是不是想打人,而且官方也不是很推荐使用这个方式,官方原话说:此处描述的格式化操作存在一些奇怪之处,容易导致一些常见错误(比如无法正确格式化元组与字典等)。
使用新的格式化方式或str.format()
函数可以避免这些错误。这些格式化方式不仅更强大,而且更灵活,更易于扩展 。
使用format
# 指定变量的引用顺序
print("{a}大写是{A}".format(a="a", A="A"))
# 通过大括号,我们可以在字符串中嵌入变量
print("{}大写是{}".format("c", "C"))
# 指定变量的引用顺序
print("{}大写是{}".format("d", "D"))
# 引用字典时,可以用**操作符进行字典拆包
t_dic = {"b": "b", "B": "B"}
print("{b}的大写是{B}".format(**t_dic))
# 输出
a大写是A
c大写是C
d大写是D
b的大写是B
但是如果在较长的字符串中嵌入多个变量,依然会显得繁琐,这里就不举例子了
f-Strings
f-string只支持python3.6以后的版本
name = "读者"
print(f"你可以使用小写f前缀")
print(F"你可以使用大写F前缀")
# 可以支持format的{}格式
print(f"帅气的{name}")
你可以使用小写f前缀
你可以使用大写F前缀
帅气的读者
除了上面的输出,f-string还支持如下:
1-直接的计算式
print(f"你还可以直接的计算,7+3={7+3}")
你还可以直接的计算,7+3=10
2-调用函数
def fun(a):
return a.lower()
print(f"也可以在里面调用函数:A的小写 {fun('A')}")
也可以在里面调用函数:A的小写 a
3-字典
auther_dic = {"name":"读者", "age":18}
print(f"帅气的{auther_dic['name']},永远{auther_dic['age']}")
帅气的读者,永远18
如果想查看更多的使用可以来官方文档查看
扩展阅读
+=和+哪一个快?
>>>timeit.timeit("s1 = s1 + s2 + s3", setup="s1 = ' ' * 100000; s2 = ' ' * 100000; s3 = ' ' * 100000", number=100)
0.5366953490010928
>>>timeit.timeit("s1 += s2 + s3", setup="s1 = ' ' * 100000; s2 = ' ' * 100000; s3 = ' ' * 100000", number=100)
0.018825671984814107
在Python2.5开始 += 首先会检测s1 还有没有其他的引用。如果没有的话,就会尝试原地扩充字符串 buffer 的大小,而不是重新分配一块内存来创建新的字符串并拷贝。即连接两个以上的字符串时 +=
比 +
更快, 因为在计算过程中第一个字符串 (例如, s1 += s2 + s3
中的 s1
) 不会被销毁.( +=
执行的是追加操作,少了一个销毁新建的动作.)
连接字符串用join还是+?
使用+: 因为字符串是不可变序列,所以当用操作符+连接字符串的时候,每执行一次+都会申请一块新的内存,然后复制上一个+操作的结果和本次操作的右操作符到这块内存空间,因此用+连接字符串的时候会涉及好几次内存申请和复制。
使用join:连接字符串的时候,会先计算需要多大的内存存放结果,然后一次性申请所需内存并将字符串复制过去。
学习链接
字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8
Python字符串格式化问题:%、format()与f-strings