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
"""

 

posted on 2019-06-13 20:16  wzc521  阅读(196)  评论(0)    收藏  举报

导航