Day6 String(字符串)

1 字符串定义

  • 字符串是python提供的容器型数据类型(序列), 不可变、有序
    • 不可变 - 不支持增删改;
    • 有序 - 支持下标操作
  • python中的字符串是用单引号或者双引号引起来的字符集;引号里面的每个基本单元叫字符

2 字符

  • python中只有字符概念,没有字符类型
  • 普通字符: 数字、字母、普通符号、中文、日语等
  • 转义字符:
    转移字符 说明 转移字符 说明
    \' 单引号 \" 双引号
    \n 换行 \r 回车
    \t tab \\ \
  • 在特定的符号前加\来表示特殊功能或者特殊意义的字符
  • 阻止转义: 在字符串的最前面加r/R,能够阻止字符串中所有的转义
str3 = '\t12\'3\na\"bc \\none 001'
print(str3)
str4 = R'\thow\nare\nyou\"'
print(str4)
  • 注意字符长度

    • '\tabc\n123' # 长度:8
    • r'\tabc\n123' # 长度:10
  • 编码字符: 在字符串中用'\u四位的十六进制数'来表示一个字符

str5 = '123\u4e11'
print(str5)

3 字符编码

  • 计算机本身只有直接存储数字的能力(存数字的二进制的补码),为了能够存储数字以外的符号,
    开发人员给每个字符对应一个固定的数字用来对字符进行存储。每个字符对应的固定的数字就是字符的编码值。

  • 每个字符和数字的一一对应关系就是字符编码表,常见的编码表有: ASCII码表、Unicode编码表

    • ASCII码表采用一个字节对字符进行编码:0-127
    • Unicode编码表采用2个字节对字符进行编码, 包含了ASCII码
  • chr函数: chr(编码值) - 获取编码值对应的字符

  • ord函数: ord(字符) - 获取指定字符对应的编码

print(chr(100), chr(0x5e00))
print(ord('a'), ord("A"))
  • 练习: 查看易经六十四卦符号
for code in range(0x4dc0, 0x4dff):
    print(chr(code))

4 字符串操作

4.1 获取单个字符

  • 语法: 字符串[下标] - 获取指定下标对应的字符
    • 字符串 - 结果是字符串的表达式(字符串值、字符串变量、运算结果是字符串)
    • [] - 固定写法
    • 下标 - 又叫索引,值是整数;字符串确定后,字符串中的没有字符都有一个确定的下标/索引表示这个字符在字符串中的位置。
  • python中下标有两种,位置从往后是 0 ~ 字符串长度-1; 位置从后往前是 -1 ~ -字符串长度
  • 注意: 获取单个字符的时候下标不能越界
str1 = 'hello'
print(str1[0], str1[3])     # h  l
print(str1[-1])    #   获取最右边字符o 
str2 = '\tabc 123'
print(str2[2], str2[5])     # b  1
# print(str2[100])     # 下标越界 IndexError: string index out of range
# print(str2[-20])     # 下标越界IndexError: string index out of range
print('hello'[2])

4.2 获取部分字符(字符串切片)

  • 语法: 字符串[开始下标:结束下标:步长] - 从开始下标开始获取,每次增加步长取下一个值;取到结束下标前为止(结束下标对应的值取不到)

    • 字符串 - 结果是字符串的表达式(字符串值、字符串变量、运算结果是字符串)
    • []/: - 固定写法
    • 开始下标 - 下标,整数。能取到对应的字符
    • 结束下标 - 下标,整数。对应的字符取不到
    • 步长 - 整数。如果步长是正数,从前往后取;如果步长是负数,从后往前取
  • 切片注意事项

    • 字符串切片的结果都是字符串
    • 如果步长是正数,那么开始下标对应字符要在结束下标对应的字符的前面,才能取到值
    • 如果步长是负数,那么开始下标对应的字符要在结束下标对应的字符的后面,才能取到值
    • 切片的时候下标可以越界
str3 = 'abc+123'
print(str3[0:3:2])   # 'abc'  'ac'

print(str3[2:-2:1])     # 'c+1'
print('结果:', str3[2:-2:-1])    # ''

print(str3[0:-1:1])   # abc+12
print(str3[-1:2:-1])  # 321+
print(str3[-1:1:-2])  # 31c
print(str3[-100:100:1])    # abc+123

4.3 获取部分字符的简写

  • 省略步长 - 步长为1 :
    • 语法:字符串[开始下标:结束下标] <===> 符串[开始下标:结束下标:1]
str4 = 'hello world'
print(str4[3:-2])     # lo wor
  • 省略开始下标 - 步长为正从字符串开头往后获取;步长为负从字符串最后往前获取
    • 语法: 字符串[:结束下标:步长] 、字符串[:结束下标]
print(str4[:5])   # hello
print(str4[:5:-1])     # dlrow
  • 省略结束下标 - 步长为正,取到字符串最后一个字符为止; 步长为负取到第一个字符为止
    • 语法: 字符串[开始下标::步长]、 字符串[开始下标:]
str4 = 'hello world'
print(str4[1:])    # ello world
print(str4[1::-1])  # eh

print(str4[:])    # 'hello world'

print(str4[::-1])  # dlrow olleh 字符串倒序

4.3 遍历字符串 - 将字符串中的字符一个一个的取出来

  • 直接遍历, 变量取到的就是字符
str4 = 'hello world'
for char in str4:
    print(char)
  • 简介遍历, 通过遍历下标遍历字符
str4 = 'hello world'
for index in range(-1, -11, -1):
    print(index, str4[index])
  • 练习: 统计输入的字符串中,字母'a'出现的次数
value = input('请输入一个字符串:')
count = 0
for char in value:
    if char == 'a':
        count += 1
print(count)

4.4 字符串的运算

4.1 数学运算符: +, *

  • 字符串1+字符串2: 两个字符串相加 -> 将两个字符串拼接产生一个新的字符串
  str1 = 'abc' + 'hello'
  print(str1)    # abchello
  • 字符串相加两边都要是字符串
str2 = 'abc' + 123   # TypeError: must be str, not int
  • 字符串正整数/ 正整数字符串: 字符串重复指定次数产生一个新的字符串
str2 = 3 * 'abc'
print(str2)

4.2 比较运算:针对两个字符串进行比较 >, <, >=, <=, ==, !=

  • 字符串比较大小: 按位置从前往后一对一对的比较,找出第一对不相等的字符,看它们的编码值谁大,那个字符串就大
print('bbZ' > 'abaa')   # True
print('你好' > 'hello')  # True
  • 字符串比较大小应用:

    • 判断一个字符是否是小写字母: 'a'<=char<='z'
    • 判断一个字符是否是大写字母: 'A'<=char<='Z'
    • 判断一个字符是否是字母: 'a'<=char<='z' or 'A'<=char<='Z'
    • 判断一个字符是否是数字字符: '0'<=char<='9'
    • 判断一个字符是否是中文(4e00-9fa5): '\ue400'<=char<='\u9fa5', '一'<=char<='龥'
  • 练习: 统计一个字符串中大写字母的个数

str4 = 'How Are You!'
count = 0
for char in str4:
    if 'A' <= char <= 'Z':
        count += 1
print(count)

4.3 赋值运算: =, +=, *=

str5 = '你好'
str5 += 'hello'   # str5 = str5+'hello'
print(str5)
str5 *= 2
print(str5)

4.5 in 和 not in

  • 字符串1 in 字符串2 - 判断字符串2中是否包含字符串1
  print('abc' in 'a123abc')    # True
  print('abc' in '123ab1c')   # False

4.6 len函数

  • len(字符串) - 获取字符串长度(字符串中字符的个数)
print(len('\tabc'))   # 4
str6 = '    abc'
print(len(str6))    # 7
print(len('\u4e00abc'))   # 4

4.7 str函数

  • str(数据) - 将其他类型数据转换成字符串
  • 所有类型的数据都可以转换成字符串; 转换的时候直接数据的外面加引号
print(str(12.5))   # '12.5'
print(str(True))   # 'True'

4.8 格式字符串: 在字符串中用格式占位符代替字符串中变化的部分,然后再使用数据对变化的部分进行赋值

  • 语法: 包含格式占位符的字符串 % (数据1,数据2,...)
  • 说明: 数据的个数和类型要和前面字符串中格式占位的个数和类型保持一致
格式占位符 意义
%s 字符串
%d 整数
%.Nf 浮点数(N控制小数后小数的位数)
%c 字符、字符对应的编码值
name = input('姓名:')
age = int(input('请输入年龄:'))
money = 3.5
message = '我是%s, 今年%d岁, 薪资:%.1fK, 等级:%c' % (name, age, money, 66)
print(message) 

5 字符的对象方法 字符串.函数名()

5.1 字符串.capitalize() - 将字符串中的第一个字符转换成大写字母

str1 = 'hell world'
print(str1.capitalize())
print(str1)

5.2 设置对齐方式

  • 字符串.center(width, fillchar) - 让字符串在新字符串中居中,width控制新子串的宽度,fillchar是填充字符
  • 字符串.rjust(width, fillchar) - 让字符串在新字符串中居右,width控制新子串的宽度,fillchar是填充字符
  • 字符串.ljust(width, fillchar)- 让字符串在新字符串中居左,width控制新子串的宽度,fillchar是填充字符
  • 字符串.zfill(width) <==> 字符串.rjust(width, '0')- 让字符串在新字符串中居右,width控制新子串的宽度,其余以"0"填充
str1 = 'abc'
print(str1.center(7, '*'))
print(str1.ljust(7, '%'))
print(str1.rjust(7, '='))
num = 15   
print(str(num).rjust(3, '0')) #打印一个三位数,num靠右对齐,不够三位用0填充,
print(str(num).zfill(3))  # 相当于rjust filling char是"0"

5.3 字符串查找和替换

str1 = 'a fox jumped over the fence'

方法名 说明 示例
str.count(sub,start=0,end=len(string)) 查找子串sub出现的次数;start从指定下标开始查,end结束下标 str1.count('f')
str.find(str, beg=0, end=len(string)) 从左向右检测字符串中是否包含子字符串 str,如果包含返回下标,否则返回-1。beg和end是可选参数,指定查找范围 str1.find('fox')
str.rfind(sub[, start[, end]]) 从右向左检测字符串中是否包含sub子串,包含返回子串的下标,否则返回-1 str1.rfind('fox')
str.index(sub[, start[, end]]) 作用类似find,但子串sub不存在会报错ValueError str1.index('fox')
str.rindex(sub[, start[, end]]) 从右向左检测,类似rfind,会报ValueError str1.rindex('fox')
str.replace(old, new[, count]) 返回一个新字符串,原串中的old被替换为new,可选参数count指定替换次数。 str1.replace('a','many')

5.4 字符串分隔和组合

方法名 说明 示例
str.split([sep[, num=count(sep)]]) 将字符串拆分为以sep为分隔符的列表,如果指定num,则最多拆分num次 str1.split(' ')
str.rsplit([sep[, num=count(sep)]]) 从右向左拆分
str.partition(seq) 将字符串拆分为一个有三个元素的元组(seq前的字符串,seq,seq后的字符串)。
str.rpartion(seq) 同上
str.splitlines([keepends]) 拆分一个包含多行的字符串,以每行为一个元素返回一个列表。keepends是一个True字符或非零整数,表示保留行尾标志(即换行符)
str.join(seq) 以指定字符串str作为分隔符,将seq对象中所有的元素(字符串表示)合并为一个新的字符串;seq可以是字符串、列表等

5.5 字符串判断

方法 说明 示例
str.isalpha() 判断字符串是否由字母构成并且只包含字母,是返回True,否返回False str1.isalpha()
str.isalnum() 检测字符串是否由字母和数字组成,如果都是数字或字母返回True,否则返回False
str.isdigit() 检测字符串是否由数字构成,可检测byte类型
str.isdecimal() 检测字符串是否由数字构成
str.isnumeric() 检测字符串是否由数字构成, 可以检测汉字数字:十
str.isspace() 检测字符串是否只有空格或tab构成
str.islower() 检测字符串中的字母字符是否全部由小写字母组成
str.isupper() 检测字符串中的字母字符是否全部由大写写字母组成
str.startswith(suffix[, start[, end]]) 用于判断字符串是否以指定子字符串开头,如果是则返回True,否则返回False。
str.endswith(suffix[, start[, end]]) 用于判断字符串是否以指定子字符串 结尾,如果是则返回True,否则返回False。

5.6 字符串转换

方法 说明 示例
str.lower() 字符串转小写
str.upper() 字符串转大写
str.swapcase() 把字符串中的大小写字母互换,大写转换成小写,小写转换成大写。不去管非字母类字符。
str.capitalize() 将字符串的第一个字符转换为大写, 其余转换为小写
str.title() 字符串中每个单词的首字母大写,其余小写。
str1.center(width,[fillchar]) 用指定宽度居中显示字符串,如果字符串无法填满width,将用指定字符填充字符串,默认用空格填充 str1.center(80,'*')
str.ljust(width[, fillchar]) 用指定宽度居左显示字符串
str.rjust(width[, fillchar]) 用指定宽度居右显示字符串
str.lstrip([chars]) 去除字符串左边指定的字符,默认是去除空格
str.rstrip([chars]) 去除字符串左边指定的字符,默认是去除空格
str.strip([chars]) 去除字符串两边边指定的字符,默认是去除空格
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335