05 | 深入浅出字符串
s = 'a\nb\tc' len(s)
# 5

# Python 的字符串是不可变的(immutable)。
s = 'hello' s[0] = 'H' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment
s = 'H' + s[1:] s = s.replace('h', 'H')
Java,有可变的字符串类型,比如 StringBuilder,每次添加、改变或删除字符(串),无需创建新的字符串,时间复杂度仅为 O(1)。这样就大大提高了程序的运行效率。但可
惜的是,Python 中并没有相关的数据类型,我们还是得老老实实创建新的字符串。因此,每次想要改变字符串,往往需要 O(n) 的时间复杂度,其中,n 为新字符串的长度。
l = [] for n in range(0, 100000): l.append(str(n)) l = ' '.join(l)
str1 += str2 # 表示 str1 = str1 + str2
s = '' for n in range(0, 10): s += str(n)
l = " ".join(l)
# 0 1 2 3 4 5 6 7 8 9 =>str
string.join(iterable) # 时间复杂度为 O(n)。
string.split(separator) # 常常应用于对数据的解析处理
def query_data(namespace, table): """ given namespace and table, query database to get corresponding data """ path = 'hive://ads/training_table' namespace = path.split('//')[1].split('/')[0] # 返回'ads' table = path.split('//')[1].split('/')[1] # 返回 'training_table' data = query_data(namespace, table)
每次循环,似乎都得创建一个新的字符串;而每次创建一个新的字符串,都需要 O(n) 的时间复杂度。因此,总的时间复杂度就为O(1) + O(2) + … + O(n) = O(n^2)。但这个结论只适用于老版本的 Python 了。自从 Python2.5 开始,每次处理字符串的拼接操作时(str1+= str2),Python 首先会检测 str1 还有没有其他的引用。如果没有的话,就会尝试原地扩充字符串 buffer 的大小,而不是重新分配一块内存来创建新的字符串并拷贝。这样的话,上述例子中的时间复杂度就仅为 O(n) 了。因此,以后你在写程序遇到字符串拼接时,如果使用’+='更方便,就放心地去用吧。
string.strip(str),表示去掉首尾的 str 字符串;
string.lstrip(str),表示只去掉开头的 str 字符串;
string.rstrip(str),表示只去掉尾部的 str 字符串。
这些在数据的解析处理中同样很常见。比如很多时候,从文件读进来的字符串中,开头和结尾都含有空字符,我们需要去掉它们,就可以用 strip() 函数:
s = ' my name is jason ' s.strip() 'my name is jason'
当然,Python 中字符串还有很多常用操作,比如,string.find(sub, start, end),表示从 start 到 end 查找字符串中子字符串 sub 的位置。
字符串的格式化
字符串的格式化,通常会用在程序的输出、logging 等场景。
举一个常见的例子。比如我们有一个任务,给定一个用户的 userid,要去数据库中查询该用户的一些信息,并返回。而如果数据库中没有此人的信息,我们通常会记录下来,这样有利于往后的日志分析,或者是线上 bug 的调试等等。
print('no data available for person with id: {}, name: {}'.format(id, name))
其中的 string.format(),就是所谓的格式化函数;而大括号{}就是所谓的格式符,用来为后面的真实值——变量 name 预留位置。
print('no data available for person with id: %s, name: %s' % (id, name))
当然,现在你写程序时,我还是推荐使用 format 函数,毕竟这是最新规范,也是官方文档推荐的规范。
总结
Python 中字符串使用单引号、双引号或三引号表示,三者意义相同,并没有什么区别。其中,三引号的字符串通常用在多行字符串的场景。
Python 中字符串是不可变的(前面所讲的新版本 Python 中拼接操作’+='是个例外)。因此,随意改变字符串中字符的值,是不被允许的。
Python 新版本(2.5+)中,字符串的拼接变得比以前高效了许多,你可以放心使用。
Python 中字符串的格式化(string.format)常常用在输出、日志的记录等场景。
a = """ qqq, qwdqdqwdqdqdqdq qwqdqw """ print(a) """ output: qqq, qwdqdqwdqdqdqdq qwqdqw """
浙公网安备 33010602011771号