1. 字符串的实现细节
python的字符串是不可变的,这既是它的缺点,也是它的优点
一方面由于字符串的不可变性,字符串可以作为字典的键或集合的元素,因为一旦初始化之后字符串的值就不会改变
另一方面每当修改字符串时,哪怕只是一个非常微小的改变,都需要创建一个全新的字符串实例,内存地址发生改变.如下图:
2. 字符串拼接
由于python的字符串是不变的,在需要合并多个字符串实例时可能会产生一些问题,如前所述,拼接任意不可变序列都会产生一个新的序列对象,下面我们使用多个字符串拼接为一个字符串
list_data = ["pig", "like", "eat"]
s = ""
for data in list_data:
s+= data
如上:运行时间成本和字符串总长度是成正比的,换句话说,这种方法效率是非常低的,处理这种问题可以用str.join()方法,它接受可迭代的字符串作为参数,返回合并后的字符串
list_data = ["pig", "like", "eat"]
s = "".join(list_data)
print(s) # piglikeeat
这样看起来三个单词实在没法看,不过没关系,字符串的这一方法还可以用在需要合并的多个字符串插入分隔符
list_data = ["pig", "like", "eat"]
s = " ".join(list_data)
print(s) # pig like eat
这样看起来就顺眼多了
虽然join()方法速度更快(针对大型列表来说),并不意味着在所有需要拼接的地方都使用这一方法,以为在实际应用中要 注 意 可读性 还是非常重要的!!!在很多情况下,join()的性能甚至还不如加法的普通拼接.
例:
- 如果子字符串的数量很少,而且已经包含在某个可迭代对象中,那么在某些情况下,创建一个新的新序列来进行拼接操作的开销可能会超过使用join()节省下来的开销
- 在拼接短的字面值时,由于cpython中的常数折叠,一些复杂的字面值(不只是字符串)在编译时会被转换为更短的形式,例如"a"+“b”+“c"被转换为"abc”,当然,这只适用于相对短的变量
3. 字符串格式化
如果事先知道字符串的数目,可以使用字符串格式化的方法来保证字符串拼接的最佳可独性,字符串格式化可以使用str.format()方法或%运算符.
例:
name = "张三"
age = 23
print('my name is {}'.format(name)) # my name is 张三
print('my name is %s' % name) # my name is 张三
print("my age is %d" % age) # my age is 23
格式化字符串中的%占位符和类型码:
占位符 | 描述 |
---|---|
% s | 转为字符串, 使用str(x)函数转换 |
% r | 转为字符串, 使用repr(x)函数转换 |
% c | 整数转为单个字符 |
% d | 数字转为十进制整数 |
% o | 整数转为八进制整数 |
% x | 整数转为十六进制整数(字符a - f小写) |
% X | 整数转为十六进制整数(字符A - F大写) |
% e | 指数浮点数(e小写), 如: 2.9e+10 |
% E | 指数浮点数(E大写), 如: 11.3E+10 |
% f, % F | 转为十进制浮点数 |
% g, % G | 十进制形式浮点数或指数浮占数自动转换 |
% % | 等同于一个 % 字符 |
占位符 % 和类型码之间的格式语法
% [- + 0 宽度.精度] | 类型码 |
---|---|
- | 左对齐(默认为右对齐) |
+ | 显示正号 |
0 | 左侧空白位置补零 |
宽度 | 整个数据输入的宽度 |
精度 | 保留小数点后多少位(默认为6位)) |
示例:
"%5d" % 123 # ' 123' 五位,左边默认补空格
'%-5s' % 'abc' # 'abc ' '五位,左对齐,右侧补空格
"%+d" % 123 # '+123'
'%+010d' % 123 # '+000000123'右对齐,左侧空位补0
'%7.2f' print('aa%7.2f' % 3.1415926535) # aa 3.14
4. 用转义字符代表特殊字符
字符串字面值中用字符反斜杠\ 后跟一个或一些字符代表特殊
的一个字符
字符串中转义字符:
\' 一个单引号
\" 一个双引号
\\ 一个斜杠
\n 换行符
\r 返回光标至行首
\f 换页
\t 水平制表符
\v 垂直制表符
\b 倒退
5. 常用字符串方法
方法 | 描述 |
---|---|
S.isdigit() | 判断字符串中的字符是否全为数字 |
S.isalpha() | 判断字符串是否全为英文字母 |
S.islower() | 判断字符串所有字符是否全为小写英文字母 |
S.isupper() | 判断字符串所有字符是否全为大写英文字母 |
S.isspace() | 判断字符串是否全为空白字符 |
S.center(width[,fill]) | 将原字符串居中,左右默认填充空格 |
S.count(sub[, start[,end]]) | 获取一个字符串中子串的个数 |
S.find(sub[, start[,end]]) | 获取字符串中子串sub的索引,失败返回-1 |
S.strip([chars]) | 返回去掉左右char字符的字符串(默认char为空白字符) |
S.lstrip([chars]) | 返回去掉左侧char字符的字符串(默认char为空白字符) |
S.rstrip([chars]) | 返回去掉右侧char字符的字符串(默认char为空白字符) |
S.upper() | 生成将英文转换为大写的字符串 |
S.lower() | 生成将英文转换为小写的字符串 |
S.replace(old, new[, count]) | 将原字符串的old用new代替,生成一个新的字符串 |
S.startswith(prefix[, start[, end]]) | 返回S是否是以prefix开头,如果以prefix开头返回True,否则返回False, |
S.endswith(suffix[, start[, end]]) | 返回S是否是以suffix结尾,如果以suffix结尾返回True,否则返回False |
S.title() | 生成每个英文单词的首字母大写字符串 |
S.isnumeric() | 判断字符串是否全为数字字符 |