Python字符串
1. 字符串类型的表示
字符串是字符的序列表示,可以由一对单引号(')、双引号(")或三引号("') 构成。其中,单引号和双引号都可以表示单行字符串,两者作用相同。使用单引号 时,双引号可以作为字符串的一部分;使用双引号时,单引号可以作为字符串的部分。三引号可以表示单行或者多行字符串。3种表示方式如下。
单引号字符串:'单引号表示,可以使用"双引号"作为字符串的一部分'
双引号字符串:"双引号表示,可以使用'单引号;作为字符串的一部分"
三引号字符串:'''三引号表示可以使用"双引号"
'单引号'
也可以换行
'''
注意事项:一般单引号和双引号用于单行字符串;三引号用于多行字符串。如果引号是字符串的一部分,那么一定要换另一种引号作为定界符。
2. 访问字符串中的值
Python 不支持单字符类型,单字符在 Python 中也是作为一个字符串使用。
Python字符串有两种序号体系,分别是正向递增序列和反向递减序列。 如果字符串长度为 L,正向递增需要以最左侧字符序号为0,向右依次递增,最右侧字符序号为L-1;反向递减序号以最右侧字符序号为-1,向左依次递减,最左侧字符序号为-L。这两种索引字符的方法可以在一个表示中使用。
Python 访问子字符串,可以使用索引和切片操作。下面我们来看一下具体用法:
<字符串>[n] (取第n个字符。索引)
<字符串>[n:m] (取从n到m的子串,不包含m。n、m可缺省。切片)
<字符串>[start:stop:step](取从start步长为step到stop的子串,不包含stop,三者都可缺省。称为切片)
注意:
- 数字之间以冒号(:)分割,不要写成逗号(,)。
- 索引必须为整数(int)类型,不然会报错。
- 下面我们来看一下下面的操作是什么含义:
- [start:] 从start 提取到结尾
- [:stop] 从开头提取到stop - 1
- [:] 提取从开头(默认位置0)到结尾(默认位置-1)的整个字符串
- [start: stop] 从start 提取到stop - 1
- [start: stop :step] 从start 提取到stop - 1,每step 个字符提取一个
- [::-1] 反转字符串
Python习惯:
- 一个区间,包括起始值,但不包括终止值;
- 所有编序号的地方,从0开始,而不是从1开始
【实例】获取星期字符串:
程序读入一个表示星期几的数字(1~7),输出对应的星期字符串名称。
"""
程序读入一个表示星期几的数字(1~7),输出对应的星期字符串名称。
"""
week_str = "星期一星期二星期三星期四星期五星期六星期七"
week_id = eval(input("请输入星期数字(1-7):"))
pos = (week_id - 1) * 3 # 每天的起始位置
print(week_str[pos: pos + 3])
使用字符串作为查找表的缺点是,所剪切的子字符串长度必须相同。如果各缩写表示长度不同,还需要其他语句辅助。下面我们思考以下,该如何实现一个“获取月份字符串”呢?要求根据1~12的数字返回月份名称。
"""
程序读入一个表示几月的数字(1~12),输出对应的月份字符串名称。
"""
month_str = "一月二月三月四月五月六月七月八月九月十月十一月十二月"
month_id = eval(input("请输入月份数字(1-12):"))
if month_id <= 10:
pos = (month_id - 1) * 2 # 每月的起始位置
print(month_str[pos: pos + 2])
else:
pos = 20 + (month_id - 11) * 3 # 每月的起始位置
print(month_str[pos: pos + 3])
我们来分析一下思路,当月份不超过10时,每个月份长度为2,当月份超过10后,每个月份的长度为3,这时候我们需要使用if条件语句。
3. 转义字符
字符 | 含义 |
\’ | 单引号 |
\” | 双引号 |
\a | 蜂鸣,响铃 |
\b | 退格 |
\\ | 反斜杠 |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 水平制表符 |
\v | 垂直制表符 |
\0 | NULL,什么都不做 |
4. 字符串运算符
字符串 | 运算符 |
---|---|
x + y | 连接两个字符串x和y |
x * n 或 n * x | 复制n次字符串x |
x in(not in)s | 判断x是(不是)s的子串 |
r/R | 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母 r(可以大小写)以外,与普通字符串有着几乎完全相同的语法。 |
% | 格式化字符串 |
5. 字符串格式化
- 求圆的面积问题,想输出:“圆的面积为23.4平方米。”
- 判断水仙花数问题想输出:“153是水仙花数”
- 鸡兔同笼问题想输出“鸡有24只,兔有12只”
- “圆的面积为23.4平方米。” —— ”圆的面积为{}平方米。”.format(s)
- “153是水仙花数” —— “{}是水仙花数”.format(x)
- “鸡有24只,兔有11只” —— “鸡有{}只,兔有{}只”.format(a,b)
-
槽内格式: {<参数序号>:<格式控制标记>}A、参数序号的用法:• 没有序号,按顺序依次替换“鸡有 24 只,兔有 12 只” —— “鸡有{}只,兔有{}只”.format(24,11)• 有序号,按序号替换,序号从0开始编号“鸡有 24 只,兔有 12 只” —— “鸡有{1}只,兔有{0}只”.format(11,24)
【例】平方根格式化
获得用户输入的一个整数a,计算a的平方根,保留小数点后3位,并打印输出。
输出结果采用宽度30个字符、右对齐输出、多余字符采用加号(+)填充。
如果结果超过30个字符,则以结果宽度为准。
a = eval(input()) print("{:+>30.3f}".format(pow(a, 0.5)))
6. 内置函数
运算符 | 描述 |
len(x) | 返回字符串x的长度 |
str(x) | 将x转换成字符串 |
chr(x) | 返回Unicode编码x对应的字符 |
ord(x) | 返回字符x对应的Unicode编码 |
hex(x) | 返回整数x 对应的十六进制数的小写形式字符串 |
oct(x) | 返回整数x对应的八进制数的小写形式字符串 |
chr()和ord()是互逆的两个函数
len(x)返回宇符串x的长度,Python 3以 Unicode字符为计数基础,因此,字符串中英文字符和中文字符都是1不长度单位。str(x)返回x的字符串形式,其中,x可以是数字类型或其他类型。
每个字符在计算机中可以表示为一个数字,称为编码,字符串则以编码序列方式存储在计算机中。目前,计算机系统使用的一个重要编码是ASCII编码,该编码用数字0~127表示计算机键盘上的常见字符以及一些被称为控制代码的特殊值。例如,大写字母A~Z用65~90表示,小写字母a~z用97~122表示, ASCII编码针对英语字符设计,它没有覆盖其他语言存在的更广泛字符,因此, 现代计算机系统正逐步支持一个更大的编码标准 Unicode,它支持几乎所有书写语言的字符。Python字符串中每个字符都使用Unicode编码表示。 chr(x)和 ord(x)函数用于在单字符和 Unicode编码值之间进行转换。chr(x)函数返回 Unicode编码对应的字符,其中,Unicode编码x的取值范围是0到1 114 111 (即十六进制数0x10FFFF)。ord(x)函数返回单字符x对应的Unicode编码。
【实例】恺撒密码。
设想在某些情况下给朋友传递字条信息,但又不希望传递中途被第三方看懂这些信息,因此需要对字条信息进行加密处理。传统加密算法很多,这里介绍一种非常简单的加密算法——凯撒密码。凯撒密码是古罗马凯撒大帝用来对军事情报进行加密的算法,它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列中该字符后面第三个字符,对应关系如下。
原文: ABCDEFGHIJKLMNOPQRTUVWXYZ
密文: DEFGHIJKLMNOPQRTUVWXYZABС
原文字符P,其密文字符C满足如下条件:
C=(P+3) mod 26
解密方法反之,满足:
P=(C-3) mod 26
假设用户可能使用的信息仅包括小写字母a~z,则该实例对应的加密代码如下:
"""
测试用例:python is an excellent language.
输出结果:sbwkrq lv dq hafhoohqw odqjxdjh.
"""
plain_code = input("请输入明文:")
for p in plain_code:
if ord("a") <= ord(p) <= ord("z"): # ord(x)函数返回单字符x对应的Unicode编码。chr(x)函数返回 Unicode编码对应的字符。
print(chr(ord("a") + (ord(p) - ord("a") + 3) % 26), end='')
else:
print(p, end='')
测试结果为:
内置的字符串处理方法
方法 | 含义 |
<string>.upper()
| 字符串字母大写 |
<string>.lower() | 字符串字母小写 |
<string>.islower() | 判断字符串中字符是否全小写 |
<string>. isprintable() | 判断字符串中字符是否全部可打印 |
<string>.isnumeric() |
判断字符串中字符是否全为数
字
|
<string>.isspace() |
判断字符串中字符是否全为空
格
|
<string>.endswith()
| 判断字符串是否以某些字符结尾 |
<string>.startswith() | 判断字符串是否以某些字符开头 |
<string>.strip()
| 去除两边空格或去除指定字符 |
<string>.split() | 按指定字符分割字符串为数组 |
<string>.join() | 连接两个字符串序列 |
<string>.find() | 搜索指定字符串 |
<string>.replace() | 字符串替换 |
<string>.count() | 返回字符串中子串出现次数 |
<string>.center() | 字符串居中 |
<string>.format() | 字符串格式化 |
【例1】给定一个字符串,判断里面包含子串'110'的个数。
# 给定一个字符串,判断里面包含子串'110'的个数。
# 例如: string = '110010110',个数count = 2
s = '110010110'
count = s.count('110')
print(count)