基本类型:字符串
2020-07-02 本文已影响0人
大象信步走来
基本类型:字符串
文本的表示
字符串就是把一个个文字的字符“串 起来”的数据
- 字符串是容器型数据类型, 将单引号或者双引号作为容器的标志, 元素不需要用逗号隔开: '元素1元素2元素3...'
字符串是不可变的(不支持增删改);字符串是有序的(支持下标操作) - 字符串中的元素: 只能是文本符号(所有计算机能表达出来的符号都可以作为字符串的元素,包含有拉丁字母、数字、标点符号、 特殊符号,以及各种语言文字字符),一个符号对应一个元素
'内蒙', 'abxy','!@#$%', '↑♦', '123456' - 字符串中每一个独立的元素又叫:字符;python中只有字符的概念,但是没有字符对应的数据类型
表示字符串
- 用双引号或者单引号都可以表示字符串, 但必须成对
- 多行字符串用三个连续单引号表示
# 空串
str1 = ''
str2 = ""
str3 = ''''''
str4 = """"""
print(type(str1), type(str2), type(str3), type(str4))
# 非空字符串
str5 = 'abc'
str6 = "你好"
str7 = '''你好,hello'''
str8 = """123,hi"""
特殊字符用转义符号“\”表示
- 字符串中的字符分两种:普通字符、转义字符
- 普通字符 - 除了转义字符串以外的字符
- 转义字符 - 在指定符号前加\用来表示一些特殊功能和特殊意义的字符
转义字符 | 描述 |
---|---|
(在行尾时) | 续行符 |
\\ | 反斜杠符 |
\' | 单引号 |
\" | 双引号 |
\a | 响铃 |
\b | 退格(backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\r | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\0yy | 八进制yy的代表的字符,例如\012代表换行,数值参见ASCII码 |
\xyy | 十六进制yy的代表的字符,例如\x0a代表换行,数值参见ASCII码 |
\uyyyy | 十六进制yyyy代表的字符,例如\u4e00代表中文字符‘一’,参见Unicode编码 |
\other | 其他字符以普通格式输出 |
- 计算字符串长度的时候一个转义字符的长度是1.
- 阻止转义(r语法):在字符串的最前面,加上r/R,字符串中的所有的转义字符都会无效
-
应用1:windows路径
-
应用2:正则表达式
-
str1 = r'\tyytc\n3123\u4e00'
print(str1)
字符编码
- 计算机在存储数据的时候只能存数字,而且存的是数字的补码
- 为了能够让计算机存储文本数据,给每个字符关联了一个固定的数字,用来对这个字符进行存储。每个字符关联的那个数字就是这个字符的
编码值
。
编码表
ASCII表:用一个字节来对字符进行编码(编码范围:0~127)
- 常见ASCII码的大小规则:0~9 < A~Z < a~z。
- 数字比字母要小。如 “7”<“F”;
- 数字0比数字9要小,并按0到9顺序递增。如 “3”<“8” ;
- 字母A比字母Z要小,并按A到Z顺序递增。如“A”<“Z” ;
- 同个字母的大写字母比小写字母要小32。如“A”<“a” 。
- 几个常见字母的ASCII码大小: “A”为65;“a”为97;“0”为 48
Unicode编码表
- Unicode编码表是对ASCII表的扩展(Unicode编码表中包含了ASCII表中所有的符号)
- Unicode编码表中包含了世界上所有国家所有民族所有的语言的符号,总共65536个
中文范围:4e00 ~ 9fa5
-
chr函数:获取指定编码值对应的字符 chr(0x0F00)
# 打印所有的中文 count = 0 for x in range(0x4e00, 0x9fa5): print(chr(x), end=' ') count += 1 if count % 40 == 0: print() print()
-
ord函数 :获取指定字符对应的编码值 ord('大')
print(ord('大'), ord('力'))
- \uxxxx 由十六进制编码值获取对应字符
str1 = '\u0f00你好!'
print(str1)
字符串和名字的区别
字符串是数据本身
名字是数据的标签
名字和字符串是“名”和“值”之间 的关系
- 一个字符串数值可以关联多个名字 一个名字在同一时刻只能关联一个字符串数值
- 字符串数值只能是字符串类型 名字则可以关联任意类型的数值
字符串是一种序列
序列(sequence)
- 能够按照整数顺序排列的数据
序列的内部结构:
- 可以通过从0开始的连续整数来索引单个对象;
- 可以执行切片,获取序列的一部分;
- 可以通过len函数来获取序列中包含多少元素;
- 可以用加法“+”来连接为更长的序列;
- 可以用乘法“*”来重复多次,成为更长的序列;
- 可以用“in”来判断某个元素是否在序列中存在。
字符串操作
获取字符串中的元素(获取字符)
- 下标操作获取单个元素
- 切片(slice)操作获取多个元素 s[start :end :step]
- 遍历
str1 = 'how are you!'
# 获取单个元素
print(str1[2])
print(str1[-1])
# 切片
print(str1[1:5]) # 'ow a'
print(str1[-3::-1]) # 'oy era woh'
# 遍历
for x in str1:
print(x)
for index in range(len(str1)):
print(str1[index])
字符串相关运算符
- “加法”和“乘法”
- +:将两个字符串进行连接,得到新的字符串。
- *:将字符串重复若干次,生成新的字符串。
str1 = 'app'
str2 = 'le'
print(str1 + str2) # apple
print(str2 * 2) # lele
- 判断字符串内容是否相同(==,!=)
str3 = 'app'
print(str3 == 'app') # True
print(str3 == 'pap') # False
- 判断两个个字符串的大小
- 两个字符串比较大小: 比较的是第一组不相等的字符的编码值的大小
str3 = 'aXYZ'
str4 = 'Ax12'
print(str3 > str4) # True
- 应用:
- 判断是否是数字字符: '0' <= char <= '9'
- 判断是否是小写字母:'a' <= char <= 'z'
- 判断是否是大写字母:'A' <= char <= 'Z'
- 判断是否是字母:'a' <= char <= 'z' or 'A' <= char <= 'Z'
- 判断是否是中文字符: '\u4e00' <= char <= '\u9fa5'
# 练习1:输入一个字符串,统计字符串中字母和中文的个数
str6 = 'hello, 你好吗?'
count1 = 0
count2 = 0
for x in str6:
if 'a' <= x <= 'z' or 'A' <= x <= 'Z':
count1 += 1
elif '\u4e00' <= x <= '\u9fa5':
count2 += 1
print('字母的个数:', count1, '中文的个数:', count2)
# 练习2:判断输入的字符串是否是纯数字字符串
str7 = '728373'
for x in str7:
if not '0' <= x <= '9':
print('不是纯数字字符串')
break
else:
print('是纯数字字符串')
- 判断字符串中是否包含某个字符串(in/not in)
print('yyz' in 'zyy') # False # 顺序不一致
print('yyz' in 'yyzab') # True
print('a' in 'yyzab') # True
字符串相关函数
-
获取字符串的长度 len函数
-
max/min/sorted/reversed等,这些函数都适用于字符串
-
str(数据) - 将自定数据转换成字符串
- 所有的数据都能转换成字符串
- 将数据的打印值作为字符串的内容
a ='absjfh' print(sorted(a)) # ['a', 'b', 'f', 'h', 'j', 's'] print(a) # absjfh str1 = r'\tabc' print(len(str1)) # 5 num = 100 str(num) # '100' str([1, 2, 3]) # '[1, 2, 3]'
字符串方法
- split:分割
# 字符串1.split(字符串2) - 字符串1将字符串2为切割点
# 字符串1.split(字符串2,N) - 字符串1将字符串2为切割点,切N次
# 字符串1.rsplit(字符串2,N) - 字符串1将字符串2为切割点,从右往左切N次
str1 = 'how are you? --- I am fine. thank you! and you?'
str2 = str1.split(' ')
str3 = str1.split(' ',2)
str4 = str1.rsplit(' ',2)
print(str2) # ['how', 'are', 'you?', '---', 'I', 'am', 'fine.', 'thank', 'you!', 'and', 'you?']
print(str3) # ['how', 'are', 'you? --- I am fine. thank you! and you?']
print(str4) # ['how are you? --- I am fine. thank you!', 'and', 'you?']
- join:合并
# 字符串.join(序列) 序列中的字符元素会用字符串连接
list1 = ['ap','p','le']
new_str1 = ''.join(list1)
new_str2 = '+'.join(list1)
print(new_str1) # apple
print(new_str1) # ap+p+le
list2 = [1,2,3]
new_str = '+'.join(list2)
print(new_str) # TypeError: sequence item 0: expected str instance, int found
- upper/lower/swapcase:大小写相关
str1 = 'abc'
print(str1.upper())
print(str2) # ABC
- ljust/center/rjust/zfill:排版相关 左中右对齐
str1 = 'how are you?'
new_str0 = str1.center(20)
new_str1 = str1.center(20,"*")
new_str2 = str1.ljust(20,"*")
new_str3 = str1.rjust(20,"8")
new_str4 = str1.zfill(20) # zfill() takes exactly one argument
new_str5 = str1.rjust(20)
print(new_str0) # how are you?
print(new_str1) # ****how are you?****
print(new_str2) # how are you?********
print(new_str3) # ********how are you?
print(new_str4) # 00000000how are you?
print(new_str5) # how are you?
# 练习1: 给任意一个商品的数字编号值,转换成固定格式的商品编码: GDXXXX -> GD0001, GD0012,....
num = 2
num_str = 'GD'+str(num).zfill(4) # GD0002
- replace:替换子串
- 字符串1.replace(字符串2, 字符串3) - 将字符串1中所有的字符串2全部替换成字符3
- 字符串1.replace(字符串2, 字符串3, N) - 将字符串1中的前 N 个字符串2替换成字符串3
str1 = 'how are you? i am fine, Thank you!'
new_str = str1.replace('o', '*')
print(new_str) # h*w are y*u? i am fine, Thank y*u!
new_str = str1.replace('o', '+', 2)
print(new_str) # h+w are y+u? i am fine, Thank you!
new_str = str1.replace('you', 'me')
print(new_str) # how are me? i am fine, Thank me!
- find: 获取字符串2第一次在字符串1中出现的位置(用正的下标值表示),找不到返回 -1
str1 = 'How are you? - I am fine. Thank you!'
print(str1.find('you')) # 8
- count:统计字符串1出现字符串2的次数
-
字符串1.count(字符串2)
-
字符串1.count(字符串2,开始下标,结束下标)
str1 = 'how are you?'
print(str1.count('you')) # 1
print(str1.count('you',0,5)) # 0
- expandtab:
- 字符串1.expandtabs() - 将字符串中的制表符替换成8个空格
- 字符串1.expandtabs(N) - 将字符串中的制表符替换成N个空格
str2 = '\tabc\t123'
new_str2 = str2.expandtabs()
print(str2,len(str2))
print(new_str2,len(new_str2))
new_str3 = str2.expandtabs(2)
new_str4 = str2.expandtabs(3)
new_str5 = str2.expandtabs(4)
new_str6 = str2.expandtabs(5)
new_str7 = str2.expandtabs(6)
print(new_str3)
print(new_str4)
print(new_str5)
print(new_str6)
print(new_str7)
- strip 删除空白(空白包括空格 换行等)
- str.strip():去掉字符串前后的所有空白,内部的空白不受影响
- str.lstrip():去掉字符串前部(左部)的所有空白
- str.rstrip():去掉字符串后部(右部)的所有空白
- str.strip('*') :掉字符串前后的所有*,内部的空白不受影响
astr = ' How are you? - I am fine. Thank you! )
astr1 = astr.strip()
astr2 = astr.lstrip()
astr3 = astr.rstrip()
print(astr1)
print(astr2)
print(astr3)
- 判断字母数字
- str.isalpha:判断字符串是否全部由字母构成
- str.isdigit:判断字符串是否全部由数字构成
- str.isalnum:判断字符串是否仅包含字母和数字, 而不含特殊字符
格式化输出
格式占位符
- 包含格式占位符的字符串 % (数据1,数据2,数据3)
- 数据的个数与前面占位符的个数保持一致
- 格式占位符:
- %d 给整数站位
- %Nd / -Nd
- %f 给小数站位
- %.Nf 保留N位小数
- %s 给字符串站位
字符串中某一个或多个部分不确定就可以用格式字符串来实现功能
name = input('姓名:')
age = int(input('年龄:'))
salary = float(input('年薪:'))
message = '%s今年%d岁。年薪:%f元' % (name,age,salary)
message1 = '%s今年%5d岁。' % (name,age)
message2 = '%s今年%-5d岁。' % (name,age)
format
字符
在字符串中通过{}来占位表示字符串中变化的部分
- {}的个数和数据项数量保持一致
- 列表形式的format:下标
- key形式的format:{key}
- key形式format的变形
name = input('姓名:')
age = int(input('年龄:'))
# {}的个数和数据项数量保持一致
message = '{}今年{}岁。'.format(name,age)
print(message)
#列表形式的format
message1 = '你好,我是{0}。你多大了?--嗨,{0}你好,我{1}'.format(name,age)
print(message1)
# key形式的format:{key}
message2 = '我叫{name},今年{age}。'.format(name= 'ALLEN',age=18)
print(message2)
# key形式format的变形
message3 = f'那个{name},已经{age}了。'
print(message3)
数字格式化
- :.Nf - 显示小数点位数(N)
- :.x>Nd - 数字补x (填充右边, 宽度为4)
- :.x<Nd
- :, -
- :.N% - 以百分比的形式显示数据,保留N位小数
print('数字:{:.2f}'.format(1.23785648))
print('数字:{:x>5d}'.format(32))
print('数字:{:0<5d}'.format(32))
num = 1000000
print('数字:{:,}'.format(num))
num = 0.45
print(f'{num:.2%}')