字符串 str 基本用法

字符串


  • 字符组成的有序序列,字符的集合
  • 不可变对象
  • 可迭代
  • python3 起,字符串都是 Unicode

字符串定义及初始化

  • 单引号,双引号,三引号
  • r'c:\windows\monkey'

字符串元素访问

  • 索引

字符串 join 方法

  • 'string'.join(iterable)
  • 返回新的字符串 str
  • 将可迭代对象连接起来,使用'string'作为分隔符
# 如字符串去重(该方法并不是字符串去重推荐的方法,这里仅用于举例)
def fn(s):
    return ''.join(set(s))

字符串+连接

  • 连接两个字符串并返回一个新的字符串

字符串拼接+=

s = ''
for n in range(0, 100000):
    s += str(n) # s = s + str(n)

每次循环,似乎都得创建一个新的字符串;而每次创建一个新的字符串,都需要 O(n) 的时间复杂度。因此,总的时间复杂度就为 O(1) + O(2) + … + O(n) = O(n^2)。这样到底对不对呢?
乍一看,这样分析确实很有道理,但是必须说明,这个结论只适用于老版本的 Python 了。自从 Python2.5 开始,每次处理字符串的拼接操作时(str1 += str2),Python 首先会检测 str1 还有没有其他的引用。如果没有的话,就会尝试原地扩充字符串 buffer 的大小,而不是重新分配一块内存来创建新的字符串并拷贝。这样的话,上述例子中的时间复杂度就仅为 O(n) 了

字符串分隔

  1. split
    • split
    • rsplit
    • splitlines
  2. partition
    • partition(sep)
    • rpartition(sep)

字符串大小写转换

  • upper()
  • lower()
  • swapcase()

字符串修改

  • replace(old,new[,count])
  • strip([chars])

字符串查找

  • find(sub[,start[,end]])
    • [start,end) 区间从左到右查看子串 sub
    • 找到返回索引,没找到返回 - 1
    • rfind
  • index(sub[,start[,end]])
    • [start,end) 区间从左到右查看子串 sub
    • 找到返回索引,没找到抛出 ValueError 异常
    • rindex
  • count(sub[,start[,end]])
    • [start,end) 区间从左到右统计子串 sub 出现的次数

字符串长度

  • len()

字符串判断

  • endswith(substr,[,start[,end]])
    • 在区间 [start,end),字符串是否是 substr 结尾
    • 返回 bool
  • startswith(substr,[,start[,end]])
    • 在区间 [start,end),字符串是否是 substr 开头
  • is 系列
    • isalnum() -> bool 是否是字母和数字组成
    • isalpha() 是否是字母
    • isdecimal() 是否只包含十进制数字
    • isdigit() 是否全部数字 (0~9)
    • isidentifier() 是不是字母和下划线开头,其他都是字母、数字、下划线
    • islower() 是否都是小写
    • isupper() 是否全部大写
    • isspace() 是否只包含空白字符

字符串格式化

  • %-formatting:c 风格格式化
  • str.format
    • "{}{kwargs}".format(*args,**kwargs)
    "{} {name} {} {}".format(1, 2, 'a', name='monkey')
    "{0} {1} {2}".format([1,2],3,'a')
    
    • 返回 str
  • f-Strings格式化
    • py3.6+,pep498
    • 更简洁,以 f 或 F 开头的字符串,其中以 {} 包含的表达式会进行值替换
    def test(name: str):
        return name.upper()
    
    class Test:
        def __init__(self, name):
            self.name = name
    
        def __str__(self):
            return f"hello {self.name}"
    
        def __repr__(self):
            return f"haha, hello {self.name}"
    
    name = "jerry"
    j = Test(name)
    print(f"hello {name}") # hello jerry
    print(F"hello {name}") # hello jerry
    print(f'{2 * 3 + 1}') # 7
    print(f'hello {test(name)}') # hello JERRY
    print(f"{j}")  # hello jerry
    print(f"{repr(j)}") # haha, hello jerry
    print(f"{j!r}") # haha, hello jerry
    print(f"You are very \"handsome\"") # You are very "handsome" 可以用反斜杠进行转义字符
    # print(f"{You are very \"handsome\"}")  # 反斜杠不能在 f-string 表达式中使用
    

参考


  • magedu