描述
python的字符串类型属于不可变数据类型(关于这个可以看我的第一篇文章),也就是当你修改变量的值时,系统会重新分配一个内存地址给他。而且python的字符串变量有复用的特性,即同一个值的不同变量指向同一个内存地址。
示例:
>>> a = '123456789'
>>> b = '123456789'
>>> id(a)
3019085027056
>>> id(b)
3019085027056
>>>
定义
python中的字符串可以通过 ’ ’ 或者 " "来定义,两个的具有同样的效果。
示例:
>>> a = '123'
>>> b = "123"
>>> id(a)
3019085518472
>>> id(b)
3019085518472
>>>
python中没有 char 类型,单个的字符也用字符串来表示。
访问
访问字符串时,可以将字符串看成一个字符数组,用下标来访问单个字符,用区间来访问一段字符。
示例:
>>> a = 'Hello World'
>>> a[0]
'H'
>>> a[0:4] #不能完整的截取 ‘Hello’
'Hell'
>>> a[0:5]
'Hello'
对字符串进行切片时,注意它是一个左闭,右开的区间。也就是说,选取区间[0:4]时,不能取到下标为4的元素,取值范围为 0,1,2,3。所以想要截取到最后一个字符时右区间值要比对应的下标大 1。
同时python支持反向切片,即下标可为负数。如图:
string | a | b | c | d | e | f | g |
---|---|---|---|---|---|---|---|
正序 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
反序 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
这样当我们只想取后面几个字符 的时候就很方便了。
示例:
>>> s = 'abcdefg'
>>> s[-1]
'g'
>>> s[6]
'g'
>>> s[-7:-1] #不能取到完整的字符串
'abcdef'
>>> s[-7:]
'abcdefg'
>>> s[-5:-7] #区间方向写反了
''
>>> s[-7:-5]
'ab'
>>>
这里要注意了,当切片区间为负数时,任然需要按照正序的方向来写,如在这里反向截取整个字符串应写为s[-7:]。
这里还有一个问题要注意,当切片的右区间取 -1 时并不能截取到最后一个字符,原因之前已经讲过了。此外 -1 的后面不是 0,0只表示第一个元素。
所以要截取到最后一个元素应将右区间省略,以表示截取至最后一个元素。同样的当截取的起点是 0 是也可省略左区间,默认为 0 。
示例:
>>> s = 'abcdefg'
>>> s[-2:] #截取最后两个元素
'fg'
>>> s[:2] #截取开头两个元素
'ab'
字符串运算符
python中常用的字符串运算符如下表:
操作符 | 描述 |
---|---|
+ | 字符串连接 |
* | 重复输出字符串 |
[] | 通过索引获取字符串中字符 |
[ : ] | 截取字符串中的一部分,遵循左闭右开原则,str[0,2] 是不包含第 3 个字符的。 |
in | 成员运算符 - 如果字符串中包含给定的字符返回 True |
not in | 成员运算符 - 如果字符串中不包含给定的字符返回 True |
r/R | 原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母 r(可以大小写)以外,与普通字符串有着几乎完全相同的语法。 |
% | 格式字符串(见后两节) |
示例:
>>> a = "Hello World"
>>> b = a + " this is python" # + 运算
>>> print(b)
Hello World this is python
>>> print(a*2) # * 运算
Hello WorldHello World
>>> print("H" in a) # in运算
True
>>> print("H" not in a) # not in运算
False
>>> b = r"a\\b" # r/R 运算
>>> print(b)
a\\b
>>> b = "a\\b"
>>> print(b)
a\b
字符串转义字符
python中同样用 ‘\’ 做转义字符,详细情况如下表:
转义字符 | 描述 |
---|---|
\(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\’ | 单引号 |
\" | 双引号 |
\a | 响铃 |
\b | 退格(Backspace), 将光标位置回退一格 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 将光标的位置回退到行首,在写文件时,‘\r\n’可用来换行。’\r’的使用还可以参考 lizz07的博客 |
\f | 换页 |
\oyy | 八进制数,yy代表的字符,例如:\o12代表换行 |
\xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |
示例:
>>> a = 'abcd\000efg' #“\000” 转义符
>>> print(a)
abcd efg
>>> a = 'abc' #“\v” 纵向制表符
>>> for i in a:
... print(i)
... print('\v')
...
a
b
c
>>> b = "abc" + '\b' + "123" #" \b" 回退符
>>> print(b)
ab123
>>> print(c + '\f' + "123" + '\f' + '456') # '\f' 转义符
ab123
123
456
格式化输出
python字符串格式化符号:
符 号 | 描述 |
---|---|
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串 |
%d | 格式化整数 |
%u | 格式化无符号整型 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数 |
%g | %f和%e的简写 |
%G | %f 和 %E 的简写 |
%p | 用十六进制数格式化变量的地址 |
其中使用频率较高的是 %s,%d,%f。
格式化操作符辅助指令:
符号 | 功能 |
---|---|
* | 定义宽度或者小数点精度 |
- | 用做左对齐 |
+ | 在正数前面显示加号( + ) |
<sp> | 在正数前面显示空格 |
# | 在八进制数前面显示零(‘0’),在十六进制前面显示’0x’或者’0X’(取决于用的是’x’还是’X’) |
0 | 显示的数字前面填充’0’而不是默认的空格 |
% | ‘%%‘输出一个单一的’%’ |
(var) | 映射变量(字典参数) |
m.n. | m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |
示例:
>>> i = 100
>>> print("%+d" % i)
+100
>>> print('%o' % i) #输出8进制数
144
>>> print('%x' % i) #输出16进制数
64
>>> print("%#x" % i) # 使用 ‘#’ 辅助符号
0x64
>>> print('%.2f' % i) # m.nf m表总位数, n表小数点位数
100.00
>>> print('%e' % i) #输出计数法的浮点数
1.000000e+02
在使用 %s 时注意,不是所有的变量都能直接转化成字符串。当变量为元组会出现此类情况。
示例:
>>> t = ('127.0.0.1', 1234)
>>> print('localhost: %s' % t)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting(在字符串格式化期间,没有转化所有的参数)
>>>
解决方法就是不将元组单独的作为一个参数,而是将他作为一个可迭代的对象。(暂时认为是如此,求教)
>>> print('localhost: %s' % (t, ))
localhost: ('127.0.0.1', 1234)
前缀
有时字符串前会带有前缀,常见的有 r/u/b。
其含义如下表:
前缀 | 含义 |
---|---|
r / R (raw string) | 原始字符串,所有转义字符失效 |
u (Unicode) | 使用Unicode编码,避免编码问题。python 3 字符串默认使用Unicode编码 |
b (bytes) | 将字符串对象转化为字节序列对象,在网络交互时传输的都是bytes类型的数据 |
f (format) | 用来格式化字符串,可以添加参数 |
示例:
>>> name = 'world'
>>> name2 = 'python 3'
>>> print(f"Hello {name}, i am {name2}")
Hello world, i am python 3
总结
上面表格中列出的符号还有一些不会用 。
转义符:\o, \x, \f,\other
格式化输出辅助符:*,<sp>
以上是我的学习经验,如果发现有任何错误,请帮忙指出来,谢谢!