字符串(str)类型详解

字符串详讲.png

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))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • 字符串 1.什么是字符串 序列:有序,不可变的。用单引号或者双引号括起来的任意字符(集)。 2.字符串中的字符 a...
    落幕丶丶阅读 782评论 0 0
  • 一.认识字符串 什么是字符串(str)字符串是python中一种常用的有序但是不可变的容器类的数据类型,可以同时存...
    2ez4ddf阅读 464评论 0 0
  • 字符串 1.什么是字符串(str) 字符串是Python内置的一种容器型数据类型(序列),不可变,有序; 将单引号...
    灬小鱼儿zzZ阅读 83评论 0 0
  • 一、获取字符 1.单个字符 原理:字符串中的每一个字符都会对应一个唯一的下标(索引)下标:用来表示字符在字符串中的...
    两只小猪呼噜噜_1539阅读 474评论 0 1
  • 觉察日记2017.3.10,刘莉-自保8。这段时间,每天都会安排的井然有序。自己定了目标在一步一步的实现。自信心找...
    绽放玫瑰成长九型阅读 136评论 0 1