1.什么是字符串(str)
- 字符串是python内置的一种容器型数字类型,不可变、有序 ;
不可变:指的是内容的值和顺序不可变
有序:一旦字符串确定,字符串中字符的位置就固定(每个字符串是第几个字符是确定的) - 将单引号或双引号作为容器,里面可以根据情况放多个字符
2.字符串中的内容 -- 字符
- python中只有字符的概念,没有字符对应的数据类型,比如:没有char(123)
- 字符串中字符串的基本单元是字符,又叫字符串的元素
a. 基本字符
数字、字母、常用符号、中文、日语、韩语等
'12'
'ash'
'-='
b. 转义字符
通过转义符号\后面跟不同的符号来表示特殊功能或特殊意义的字符
# \n -- 换行
# \' -- 表示一个单引号
# \" -- 表示一个双引号
# \\ -- 表示一个反斜杠
# \t -- 字表符(跳到下一个tab的位置)
str1 = '\ta\'bc\\n12\"3'
print(str1)
阻止转义:在字符串的最前面加r/R,可以阻止字符串中的转义字符转义(一般用于正则表达式)
str2 = r'\tabc\n123x\'\"z'
print(str2)
c.编码字符
\u 后面跟4位的十六进制数,来表示一个字符,这个4位的十六进制数对应的值是字符串的编码值
\u4位十六进制数(编码值)
str3 = 'abc+\u9fa5'
print(str3) #abc+龥
3.字符编码
- python中的字符采用的是unicode编码
- 计算机存储数据只能存数字,而且存的是数字的补码(是以一种二进制的格式进行存储的)
print(bin(100),0b1100100) #bin(数字) -是获取指定数字对应的二进制
print(oct(100),0o144) #oct(数字) -是获取指定数字对应的八进制
print(hex(100),0x64) #hex(数字) - 获取指定的数字对应的十六进制
print(0b1100100 * 10)
- 编码:每个字符在计算机中存储的时候都会对应一个固定且唯一的数字,这个数字就是这个字符的编码,每一个字符和数字的意义对应关系就是编码表,
常见的编码表:ASCII、unicode;
ASCII码表中只对数字字符、字母字符、英文符号进行编码
unicode编码表是对ASCII码表的扩充,能够对世界上所有符号进行编码 - chr(编码值) --获取编码值对应的字符 4e00-9fa5(汉字范围)
- ord(字符) -- 获取字符对应的编码值,注意:字符值就是长度为1的字符串
print(chr(100))
print(chr(0x64))
print(ord('巫'),ord('苗'))
# 打印所有汉字
num = 0
for code in range(0x4e00,0x9fa5):
print(chr(code),end = ' ')
num = num + 1
if num % 20 == 0:
print()
print()
print(num)
str3 = '\u4fff\u5faa\u00c8'
print(str3)
print('a' > 'Z')
4.获取字符 - 取字符串的内容
4.1 获取单个字符
- 语法:字符串[下标] - 根据下标获取字符串中对应的字符
- 说明
字符串 - 可以是字符串值,也可以是字符串变量,可以是字符串的表达式
[ ] : - 固定写法
下标: - 又叫索引,一旦字符串确定,那么字符串中的每个字符都会对应一个下标,表示这个字符在字符串中的位置
下标的范围是0开始到字符串的长度减1
0表示第一个字符,1表示第二个,以此类推。(通用)
下标范围还可以是 -1~ -字符串长度减1,-1表示倒数第一个 - 注意:转义字符代表一个字符;获取单个字符的时候下标不能越界
str1= 'python' # 'p' : 0/-6
print(str1[0],str1[-6],str1[-2])
str2 = 'py\nthon'
print(str2[4])
# print(str1[100]) # IndexError: string index out of range
4.2 获取部分字符(字符串切片)
a.语法:字符串[开始下标:结束下标:步长] -从开始下标开始,获取到结束下标前为止,每次下标值增加步长
b.要求
- 字符串 - 可以是字符串值,也可以是字符串变量,结果是字符串的表达式
- [] - 固定写法
- : - 固定写法
- 开始下标、结束下标
下标值,开始下标对应的字符可以取到,结束下标对应的字符一定取不到
步长是整数,可以是正的,也可以是负的
c.注意:
- 下标可以越界;
- 如果步长为正,(从前往后获取),开始下标对应的字符要在结束下标对应的字符前,才能获取到值
- 如果步长为负,(从后往前获取),开始下标对应的字符要在结束下标对应字符的后面,才能获取到值
str4 = 'abcdef123456'
print(str4[0:4:1])
print(str4[-2:-3:-1])
print(str4[0:100:1]) # 下标可以越界 'abcdef123456'
print('hello python'[1:-2:3]) # eoy -2 写成9 也行 有个空格,所以没有取到t
- 步长为正就是从前往后去,为负就是从后往前取
- 切片的语法中可以对步长,开始下标和结束下标进行省略:
省略步长(步长默认为1)
字符串[开始下标:结束下标] == 字符串[开始下标:结束下标:1]
省略下标
字符串[:结束下标:结束] -如果步长为正,从字符串开头往后取;如果步长为负,从字符串最后一个字符往前取
字符串[开始下标:步长] -如果步长为正,取到最后一个字符为止,如果步长为负,取到第一个字符为止
str4 = 'abcdef123456'
print(str4[:3:1]) # abc
print(str4[:3:-1]) # 654321fe
print(str4[2:]) # cdef123456
print(str4[2::-1]) # cba
print(str4[::-1]) # 654321fedcba
练习:1234 -> 4321
num = 1234
num = int(str(num)[::-1]) # 先转换为字符串类型,再切片,然后转换为int类型
print(num)
4.3 遍历字符串 - 一个一个的取出所有的字符
"""
方法一:直接遍历
for 变量 in 字符串:
循环体
方法二:通过遍历下标,来遍历字符串
for 下标 in range(字符串长度):
字符串[变量]
"""
for char in 'maggie':
print(char)
str3 = 'when I was young'
len()
# len(字符串) - 获取字符串长度,返回一个数字
for i in range(len(str3)):
print(i,str3[i])
5.字符串相关运算
a.数学运算:字符串支持加法运算和乘法运算
加法运算
- 语法:b.字符串1 + 字符串2 -将两个字符串拼接在一起,产生一个新的字符串
new_str = 'abc' + '123'
print(new_str)
new_str += '你好!' # new_str = new+str + '你好!'
- 注意:加法两边都必须是数字,或都是字符串,不能混合相加
# new_str = 'abc' + 123
print(new_str+'=====')
乘法运算
- 语法:字符串 * 正整数 ; 正整数 * 字符串 - 指定的字符串重复指定次数,产生一个新的字符串
print('abc' * 3)
print('*' * 10)
b.比较运算:字符串支持所有的比较运算符
字符串1 == 字符串2,字符串1!== 字符串2 - 判断两个字符串是否相等
print('abc' == 'abc')
print('abc' == 'acb')
print('abc' != 'abc')
字符串比较大小:让两个字符串中相同位置的字符一一比较(从前往后),找到第一对儿不相等的字符判断编码值的大小
print('abc'>'abz') # false
应用:
char = 9
# 判断一个字符是否是字母:'a'<=char<='z' or 'A'<=char<='Z'
# 判断一个字符是否是数字:'0'<=char<='9'
# 判断一个字符是否是中文:
# '\u4e00'<=char<='0x9fa5'
# 0x4e00<=ord(char)<=0x9fa5
练习:输入一个任意字符串,统计输入的内容中字母的个数
new_str = input('输入一个字符串:')
count = 0
for i in new_str:
if 'a'<=i<='z' or 'A'<=i<='Z':
count +=1
print('字母有 %d个'% count)
c. in 和 not in 操作
- 字符串1 in 字符串2 - 判断字符串1是否在字符串2中(判断字符串2中是否包含字符串1)
- 字符串1 not in 字符串2 - 判断字符串1是否不在字符串2中(判断字符串2中是否不包含字符串1)
print('abc' in 'abc123') # True
print('abc' in 'a12bc') # False
print('abc' not in 'a12bc') # True
d.常用内置函数
- len(字符串) - 求字符串长度
- str(数据) - 将其他数据转换成字符,所有的数据都能转换为字符串,转换时直接在数据外面加引号
print(int('123')) #只有去掉引号后,本身就是一个整数的字符串才能转换成整型
print(float('12.4')) # 只有去掉引号后,本身就是一个数字的字符串才能转换成浮点型
print(bool('abc')) # 除了空串会转换为False,其他的都是True
练习:判断str2是否为空串
str2 = ''
if str2:
print('不是空串')
e.字符串的对象方法:字符串.方法()
字符串.capitalize() - 将字符串首字母大写
str4 = 'hello'
new_str = str4.capitalize()
print(new_str) # Hello
字符串.center(width,fillchar)
产生一个长度为width的新字符串,新字符串中,原字符串居中显示,剩余的部分用fillchar填充
str4 = 'hello'
new_str = str4.center(11,'*')
print(new_str) # ***hello***
字符串.ljust(width,fillchar)
new_str = str4.ljust(11,'=')
print(new_str)
字符串.rjust(width,fillchar)
num = 1 # 001
num = 10 # 010
student_id = str(num).rjust(3,'0')
print(student_id)
字符串.zfill(width) -产生一个宽度是width的字符串,原字符串在右边,前用0填充
student_id = str(num).zfill(4)
print(student_id)
字符串1.count(字符串2)
统计字符串2在字符串1中出现的次数
str1= 'and you? how are you!'
print(str1.count('a')) # 2
练习:打印字符串中出现最多的字符和对应的次数
'how are you?oh~' 打印o 3次
str4 = 'how are you?oh~'
max_count = 0 # 保存当前最大次数
max_char ='' # 保存当前最大次数对应的字符
for i in str4:
# 获取每个字符出现的次数
count = str1.count(i)
# 如果获取的字符的次数,比最大的次数还打,说明这次次数才是最新的最大次数,对应的字符就是最新的最大次数的字符
if count > max_count:
max_count = count
max_char = i
print('%s出现%d次' %(max_char,max_count))
字符串1.find(字符串2)
在字符串1中查找字符串2第一次出现的位置,如果找不到返回-1
格式2:字符串1.find(字符串2,开始下标,结束下标) - 在字符串1中开始下标到解读下标的范围内查到字符串2第一次出现的位置(不包含结束下标)
print(str1.find('you')) # 4
print(str1.find('you2')) # -1
print(str1.find('you',-8,-1)) # 17
练习:在字符串'and you? how are you! you'中,找到所有’you‘出现的下标
打印 4,17,22
# 思路:先找出you第一次出现的位置,然后 再从第一次出现位置之后开始找第二个
str1 = 'and you? how are you! you'
str2 = 'you'
start_index = 0
while True:
index = str1.find(str2,start_index) # 从第0开始找
if index == -1: # 如果没有找到find返回值是-1
break
else:
print(index,end=',')
# 更新下标
start_index = index + len(str2)
print()
index的功能和find一样,只是如果字符串2不存在的时候会报错
print(str1.index('you')) # 4
# print(str1.index('you2')) # substring not found
字符串1.isdigit() - 判断字符串1中是否只有数字字符串
print('12'.isdigit())
字符串1.isnumeric() - 判断字符串1中是否只有数字字符串(可以检查中文数字)
print('壹仟'.isnumeric())
字符串1.join(序列) - 将序列中的元素用字符串1连接在一起,产生一个新的字符串,结果是字符串
print('*'.join('abc'))
print('+'.join(['abc','vv','hhhh']))
练习:自己实现join的功能,给字符串1和字符串2,用字符串1将字符串2中的所有字符连接起来
例如:str1 = ’aaa‘,str2='123',输出:'1aaa2aaa3'
# 思路:循环123 每循环一次 空串就加上str1
# 方法一
str1 = 'aaa'
str2 = '123'
str3 = ''
for i in str2:
str3 += i + str1
print(str3[:-len(str1)])
# 方法二
# 思路:如果 i 小于str长度-1,就不加aaa只需要加i对应的字符,
str3 = ''
for i in range(len(str2)):
if i == len(str2) -1:
str3 += str2[i]
else:
str3 += str2[i]+str1
print(str3)
"""
i = (0,1,2)
i = 0, i !=3-1 false str3 = str2[0] + str1 str3 = 1+aaa
i = 1, i !=3-1 false str3 = str2[1] + str1 str3 = 1+aaa+2+aaa
i = 2, i == 3-1 true str3 = str2[2] str3 = 1+aaa+2+aaa+3
"""
max(序列),min(序列) - 求序列元素的最大值和最小值
print(max('adsfefwefz'))
print(min('adsfefwefz'))
print(max([123,2,3,-10]))
练习: str1='ab12cd34ed56',str2 = '+' ——> '1+2+3+4+5+6'
str1 = 'ab12cd34ed56'
str2 = '+'
str3 = ''
new_str = ''
for i in str1:
if '0'<=i<='9':
str3 += i
for index in str3:
new_str += index + str2
print(new_str[:-len(str2)])
字符串1.split(字符串2) - 在字符串1把2作为切点
6.格式字符串: 在字符串中通过格式占位符来表示字符串中变化的部分
语法:包含格式占位符的字符 % (给格式占位符赋值的数据列表)
说明:
格式占位符:
%s:表示变化的字符串 %d:变化的整数
%f:变化的浮点数(%.Nf:N可以约束小数点后面的小数位数)
%c:表示字符(可以将整数转为字符)
%x\X:
练习:
name = input('姓名:')
age = int(input('年龄:'))
salary = float(input('薪水:'))
print('%s今年%d岁,月薪:%.2f,等级:%c' %(name,age,salary,65))
message = name + '今年' + str(age) + '岁'
print(message)
练习:输入学生姓名、年龄和性别,以'XX今年,性别:X'
name = input('姓名:')
age = int(input('年龄:'))
gender = input('性别:')
print('%s今年%d岁,性别:%s' %(name,age,gender))