字符串(str)

字符串是 Python 中最常用的数据类型。

1. 什么是字符串

字符串是容器型数据类型, 将**’’""’’’’’’""""""** 作为容器标志,容器中的元素全是字符
不可变的(不支持增删改)、有序(支持下标操作)

str1 = 'hello, Python'
str2 = "你好"
str3 = '''thanks
123
456'''
str4 = """谢谢"""

2. 字符串中的元素 - 字符

python中只有字符的概念,没有对应的数据类型。引号中只有一个元素的字符串可以看成一个字符字符串又叫字符集。

2.1 字符串中的字符

原则上任何可以通过键盘输入或者从其他地方赋值粘贴的所有的符号都可以作为字符:

'和健身房'、'shuASSS'、'2378'、'+-===!@&*#@'、'♠'
  • 普通字符: 在字符串中能够代表符号本身的字符(没有特殊意义和特殊功能的符号)
str1 = 'abc'
str2 = '123'
str3 = '你好,Python!'

print(str1, str2, str3)
  • 转义字符: 在字符串中有特殊意义和特殊功能的符号的组合,一般是以\开头的,一下是程序中最常见的几种转义字符:
\n  - 换行
\'  - 表示'本身
\"  - 表示"本身
\t  - 表示一个缩进(tab键)
\\  - 表示一个\
注意: 所有的转义字符的长度都是1
str1 = '\t123'
str2 = 'abc\n123'
str3 = '\'你好\''
print(str1)		# /t先打印的时候不会打印\t而是打印一个缩进
print(str2)		# abc 换行后再打印 123
print(str3)		# '你好'
  • **编码字符:**编码字符其实也是转义字符中的一种,它是表示方式是 \u4位的16进制字符编码值
str1 = '\u4e00\u5609'
print(str1)		# 一嘉
2.2 阻止转义

在字符串的最前面加 r/R 可以让当前字符串中所有的转义字符失效(所有的符号在字符串中都表示这个符号本身)

str1 = r'\t123\nabc'
print(str1)		# \t123\nabc

str2 = R'\u4e00\u5609'
print(str2)		# \u4e00\u5609

3. 字符编码

计算机不能直接存储字符(符号),只能存储数字;
为了能够存储字符,把每一个字符关联了一个固定的数字(这个固定的数字就是对应的字符的编码)

字符和数字的一一对应关系就是编码表:ASCII码表,Unicode编码表(python)

  • ASCII - 在计算机中采用一个字节保存一个字符(总共128个字符), 字符包含了所有的字母、数字和美国常用符号
    0 ~ 9: 编码值从48开始依次增加
    大写字母的编码值 < 小写字母的编码值
    大写字母和小写字母不是紧挨着的
  • Unicode编码表 - 是ASCII码表的扩展, 包含了世界上所有的国家、所有的语言对应的符号(总共有65536个符号)
    ASCII码: 0 ~ 127
    中文编码值范围: 0x4e00 ~ 0x9fa5
3.1 编码字符 - \u4位16进制编码值
str1 = 'abc\u50ff'
print(str1)			# abc僿
3.2 chr(编码值) - 获取编码值对应的字符
print(chr(97))		# a

# 打印所有的中文字符,并统计个数
num = 0
for x in range(0x4e00, 0x9fa5+1):
    print(chr(x), end=' ')
    num += 1
    if num % 30 == 0:
        print()
        
print('个数:', num)

3.3 ord(字符) - 获取指定字符对应的编码值

print(hex(ord('余')))	# 0x4f59
print(hex(ord('婷')))	# 0x5a77

4. 字符串操作

4.1 获取字符

字符串是不可变的,所有不支持增删改的操作,只能获取元素。

  • 字符串[下标] - 获取指定下标对应的元素(这儿的下标和列表下标一样,从0字符串长度-1 或者 -1-字符串长度)
  • 字符串[开始下标:结束下标:步长] - 字符串切片(和列表切片一样)
  • 遍历字符串 - 用循环将字符串中的字符一个一个的取出来
str1 = '\thello Python!'
print(str1[-2])    # n
print(str1[2])     # e
# print(str1[100])   # IndexError: string index out of range(下标不能越界)

# 切片
print(str1[2:])     # ello Python!
print(str1[1:-1:2])  # hloPto
print(str1[:3:-1])   # !nohtyP ol

# 遍历
for x in str1:
    print('x:', x)

5. 格式字符串

5.1 格式占位符
  1. 语法: 包含格式占位符的字符串 % (值1, 值2, 值3,…)
  2. 说明:
    格式占位符 - 格式占位符有哪些是固定,使用的时候和字符串中变化的数据的类型相关
    %s - 字符串(任何类型都可以使用%s占位)
    %d - 整数;
    %-Nd - 整数; N约束数字最后的长度,如果不够后面补空格
    %Nd - 整数; N约束数字最后的长度,如果不够前面补空格
    %f - 浮点数;小数点后面保留6位小数
    %.Nf - 浮点数, N约束小数点N后的小数位数(会四舍五入)
    %c - 字符
    % - 固定写法
    () - 固定写法;如果值的个数是1可以省略
    - 任何有结果的表达式; 值的个数和类型和前面占位符的个数以及类型保持一致
name = input('请输入姓名:')
age = int(input('请输入年龄:'))
# 你好,我是xxx,今年x岁
# 方法一:
print('你好,我是'+name+',今年'+str(age)+'岁')
# 方法二:
print('你好,我是%s,今年%4d岁' % (name, age))
5.2 format

一个带有{}的字符串.format(值1, 值2, 值3,…)

  1. 用法1: 让空的{}个数和format中值的个数保持
print('我是{}, 今年{}岁'.format('余婷', 18))		# 我是余婷, 今年18岁
  1. 用法2: {N} - N从0开始依次增加,分别表示format中第0个值,第1个值,…
print('我是{0},年是:{1}, 今年{1}岁'.format('余婷', 18))		# 我是余婷,年是:18, 今年18岁
print('数据1:{1}, 数据2:{0}, 数据3:{1}'.format(10, 20))   	# 数据1:20, 数据2:10, 数据3:20
  1. 用法3:[key]
print('我是{name},年龄是:{age}, 今年{age}岁'.format(age=20, name='张三'))		# 我是张三,年龄是:20, 今年20
  1. 用法4: 用列表元素给占位符赋值(了解)
list1 = [10, 20, 30, 40]
print('{0[1]},{0[0]},{0[3]}'.format(list1))		# 20,10,40
print('{1[0]}, {1[1]}, {1[1]}, {0}'.format('张三', list1))	# 10, 20, 20, 张三
print('{list[1]},{list[2]},{list[3]}'.format(name='张三', list=list1))	# 20,30,40
  1. 其他的写法
# 约束小数位数
print('圆周率:{:.2f}'.format(3.1415926))   # 约束小数位数
# 约束整数宽度
print('整数:{:0>4d}。'.format(25))    # 整数:0025
print('整数:{:0<4d}。'.format(25))    # 整数:2500。
print('整数:{:+>4d}。'.format(25))    # 整数:++25。
# 分隔
print('大的整数:{:,}'.format(100000000))   # 大的整数:100,000,000
# 百分比
print('百分比:{:.2%}'.format(0.25))   # 百分比:25.00%

6. 字符串相关方法

序号

方法

描述

1

capitalize()

将字符串的第一个字符转换为大写

2

center(width, fillchar)

返回一个指定的宽度 width 居中的字符串,fillchar 为填充的字符,默认为空格

3

count(str)

返回 str 在 string 里面出现的次数

4

bytes.decode(encoding=“utf-8”, errors=“strict”)

Python3 中没有 decode 方法,但我们可以使用 bytes 对象的 decode() 方法来解码给定的 bytes 对象,这个 bytes 对象可以由 str.encode() 来编码返回。

5

encode(encoding=‘UTF-8’,errors=‘strict’)

以 encoding 指定的编码格式编码字符串,如果出错默认报一个ValueError 的异常,除非 errors 指定的是’ignore’或者’replace’

6

endswith(suffix)

检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.

7

expandtabs(tabsize=8)

把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8 。

8

find(str, beg=0 end=len(string))

检测 str 是否包含在字符串中,如果指定范围 beg 和 end ,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回-1

9

index(str, beg=0, end=len(string))

跟find()方法一样,只不过如果str不在字符串中会报一个异常.

10

isalnum()

如果字符串至少有一个字符并且所有字符都是字母或数字则返 回 True,否则返回 False

11

isalpha()

如果字符串至少有一个字符并且所有字符都是字母则返回 True, 否则返回 False

12

isdigit()

如果字符串只包含数字则返回 True 否则返回 False…

13

islower()

如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False

14

isnumeric()

如果字符串中只包含数字字符,则返回 True,否则返回 False(中文数字也可以)

15

isspace()

如果字符串中只包含空白,则返回 True,否则返回 False.

16

istitle()

如果字符串是标题化的(见 title())则返回 True,否则返回 False

17

isupper()

如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False

18

join(seq)

以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串

19

len(string)

返回字符串长度

20

ljust(width[, fillchar])

返回一个原字符串左对齐,并使用 fillchar 填充至长度 width 的新字符串,fillchar 默认为空格。

21

lower()

转换字符串中所有大写字符为小写.

22

lstrip()

截掉字符串左边的空格或指定字符。

23

maketrans()

创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。

24

max(str)

返回字符串 str 中最大的字母。

25

min(str)

返回字符串 str 中最小的字母。

26

replace(old, new [, max])

把 将字符串中的 str1 替换成 str2,如果 max 指定,则替换不超过 max 次。

27

rfind(str, beg=0,end=len(string))

类似于 find()函数,不过是从右边开始查找.

28

rindex( str, beg=0, end=len(string))

类似于 index(),不过是从右边开始.

29

rjust(width,[, fillchar])

返回一个原字符串右对齐,并使用fillchar(默认空格)填充至长度 width 的新字符串

30

rstrip()

删除字符串字符串末尾的空格.

31

split(str="", num=string.count(str))

num=string.count(str)) 以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num 个子字符串

32

splitlines([keepends])

按照行(’\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。

33

startswith(str, beg=0,end=len(string))

检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查。

34

strip([chars])

在字符串上执行 lstrip()和 rstrip()

35

swapcase()

将字符串中大写转换为小写,小写转换为大写

36

title()

返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())

37

translate(table, deletechars="")

根据 str 给出的表(包含 256 个字符)转换 string 的字符, 要过滤掉的字符放到 deletechars 参数中

38

upper()

转换字符串中的小写字母为大写

39

zfill (width)

返回长度为 width 的字符串,原字符串右对齐,前面填充0

Python为字符串提供的方法差不多有四十多个,以下是常见的一些方法的用法

# 1.字符串.capitalize()  - 将字符串的首字母变成大写字母
str1 = 'python'
new_str1 = str1.capitalize()
print(new_str1)

# 97 - 65  == 32; 98-66 == 32
char = 'j'
print(chr(ord(char)-32))

# 2.center/ljust/rjust/zfill
"""
字符串.center(宽度, 填充字符)   # xabcx
字符串.ljust(宽度, 填充字符)    # abcxx
字符串.rjust(宽度, 填充字符)    # xxabc
字符串.zfill(宽度) == 字符串.rjust(宽度, '0') 
"""
print('abc'.center(7, '+'))   # ++abc++
print('abc'.ljust(7, '+'))    # abc++++
print('abc'.rjust(7, '+'))    # ++++abc
print('abc'.zfill(7))         # 0000abc
# 001, 004, 009, 023, 045, 102
num = 21
print(str(num).zfill(3))

# 3.count
# 字符串1.count(字符串2)  -> 统计字符串1中字符串2出现的次数
# 字符串1.count(字符串2,开始下标,结束下标)  - 统计字符串1开始下标到结束下标范围内字符串2出现的次数
str2 = 'how are you? i am fine! thank you!'
print(str2.count('you'))   # 2
print(str2.count('a'))     # 3

print(str2.count('you', 0, 15))   # 1
print(str2.count('you', 0, 4))    # 0

# 4.
str1 = 'you'
str2 = 'how are you'
# 判断str2是否以str1结尾
print(str2.endswith(str1))
print(str2[-len(str1):] == str1)

# 5.字符串查找
"""
字符串1.find(字符串2) - 获取字符串2第一次在字符串1出现的位置(用大于等于0的下标值表示);
                      字符串2不存在结果是-1
字符串1.index(字符串2) - 获取字符串2第一次在字符串1出现的位置(用大于等于0的下标值表示);
                       字符串2不存在会报错
"""
str2 = 'how are you? i am fine! thank you!'
print(str2.index('you'))   # 8
print(str2.find('you123'))    # 8
print(str2.find('you123'))   # -1
# print(str2.index('you123'))  # ValueError: substring not found

# 6.join
"""
字符串.join(序列)  - 将序列中的元素用字符串连接在一起产生一个新的字符串;
                   序列中的元素是字符串
"""
str3 = '+'.join('abc')
print(str3)    # a+b+c

str4 = ''.join(['name', 'age', 'gender'])
print(str4)

str5 = ''.join({'a': 1, 'b': 1})
print(str5)    # ab

# 7.字符串替换
"""
1) 字符串1.replace(字符串2, 字符串3)   -> 将字符串1中所有的字符串2都替换成字符串3
2) 
字符串1.maketrans(字符串2,字符串3)  -> 创建字符串2和字符串3一一对应的映射表
字符串1.translate(替换的映射表) 
"""
str2 = 'how are you? i am fine! thank you!'
new_str2 = str2.replace('you', 'me')
print(new_str2)   # how are me? i am fine! thank me!

# 创建映射表
table = str.maketrans('a!', 'b+')
new_str2 = str2.translate(table)   # 将字符串str2中所有的a都替换成b, 所有的!都替换成+
print(new_str2)

# 8.字符串切割
"""
字符串1.split(字符串2)  -  将字符串1中所有的字符串2作为切割点切成多分
"""
str2 = 'how are you? i am fine! thank you!'
print(str2.split(' '))  # ['how', 'are', 'you?', 'i', 'am', 'fine!', 'thank', 'you!']