字符串是python中最常使用的数据类型之一,用来记录文本信息
python 字符串表示方法 回目录
- 单引号 '
- 双引号 "
- 三单引号 ‘’'
- 三双引号 “”"
>>> a = "Hello world!" >>> b = """你好! ... 世界!""" >>> print(a, b) Hello world! 你好! 世界! >>> name = "python" '小' """demo""" >>> print(name) python小demo
特别说明:
- 所有非注释内容中用引号括起来的都是字符串,如果引号内没有内容,则代表空字符串,如:‘’、“”, 空字符串在python中认为是假值(即bool(“”)返回为False)
- 单引号内可以包含双引号,双引号内可以包含单引号,如:“It’s”、‘A is “a”’
- 三引号内可以包含单双引号,如:“”“a is ‘b’”“”、
- 三引号内的换行会自动转换成换行符号 “\n”
- python中多个字符串赋值给一个变量时会形成隐式拼接, 如:name = “python” ‘小’ “”“demo”“”,在赋值时会先将python、小、demo拼成“python小demo”后在赋值给neam变量
字符串的运算 回目录
-
+ 字符串拼接(除了隐式拼接,可以使用+进行字符串拼接,提高代码可读性)
>>> name = "python" + "小" + "demo" >>> print(name) python小demo
-
* 重复拼接字符串
>>> "a" * 3 'aaa' >>> five_a = "a" * 5 >>> print(five_a) aaaaa
-
+= 拼接赋值
>>> name = "python" >>> name += "小demo" >>> name 'python小demo' >>> name_2 = "python" >>> name_2 += "小" + "demo" >>> name_2 'python小demo'
-
*= 重复拼接赋值
注意:等号右边必须为正整数,如果是非整数,则触发异常,如果是负整数或者是0,则会给变量赋值空字符串>>> a = "a" >>> a *= 5 >>> a 'aaaaa' >>> a *= 0 >>> a '' >>> a = "abc" >>> a *= -1 >>> a '' >>> a = "a" >>> a *= 3.0 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can't multiply sequence by non-int of type 'float'
-
in 判断给定的字符或者字符串是否在目标字符串中,如果在则返回True,否则返回False
>>> "python" in "python小demo" True >>> "a" in "python小demo" False
-
not in 判断给定的字符或者字符串是否在目标字符串中,如果在则返回False,否则返回True
>>> "python" not in "python小demo" False >>> "a" not in "python小demo" True
字符串的比较 回目录
python字符串跟数字类型一样,支持大小的比较,但与数据类型不一样的是,数据类型比较的是值大小,而字符串比较的是字符Unicode 编码
比较符:
>、>=、<、<=、==、!=
>>> "a" > "b"
False
>>> "a" <= "b"
True
>>> "a" == "a"
True
字符串的编码(encode)的转换函数
- ord© 返回一个字符Unicode的值
- chr(i) 返回i值对应的字符
可以用这两个内置方法来看看上述例子中a、b的大小
>>> ord("a")
97
>>> ord("b")
98
>>> chr(97)
'a'
结果返回a的Unicode是97,b的Unicode是98,所以a > b
思考?
上面我们已经知道字符的大小比较,那么字符串中的大小如何比较呢?“abc” 跟 “ac” 谁比较大呢?
>>> "abc" > "ac"
False
>>> "abc" > "ab"
True
进入交互模式下,发现 “abc” 是小于 “ac” 的,这是因为字符串比较时,会从左往右开始对应比较每个字符的Unicode值,当发现有一个Unicode不相等时,根据比较符返回结果
字符串的索引 回目录
表达式: 字符串[index]
index 是字符串的下标,必须是整数类型。从左往右时,下标从0开始,如果index大于len(string) - 1 会触发异常;从右往左时,下标从-1开始,如果index 小于-len(string)会触发异常
>>> name = "python小demo"
>>> name[0]
'p'
>>> name[5]
'n'
>>> name[-1]
'o'
>>> name[-5]
'小'
>>> len(name)
11
>>> name[15]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>> name[-12]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
字符串切片 回目录
字符串截取其中一段字符组成新的字符串,遵循左闭右开的原则
表达式:字符串[start: end: step]
- start、end、step均可省略
- 默认step为1,step为正整数时,代表从左往右截取;step为负整数时代表从右往左截取;step不能为0
- step为正整数时,默认start为0, end为len(string)
- step为负整数时,默认start为-1,end为-(len(string) + 1)
- start、end可以越界(即字符串长度限制)
>>> name = 'python小demo'
>>> name[::]
'python小demo'
>>> name[0:6]
'python'
>>> name[::-1]
'omed小nohtyp'
>>> name[::3]
'ph小m'
>>> name[-4: len(name)]
'demo'
>>> name[:1000]
'python小demo'
>>> name[-1000:5]
'pytho'
利用切片进行字符串反转
>>> a = "abc"
>>> a[::-1]
'cba'
字符串的转义 回目录
-
’ 单引号
>>> print('It\'s "python小demo"') It's "python小demo"
-
" 双引号
>>> print("It's \"python小demo\"") It's "python小demo"
-
\\ 反斜杠 如:“This answer is ab\ac?”
>>> print("This answer is ab\ac?") This answer is abc? >>> print("This answer is ab\\ac?") This answer is ab\ac?
-
\a 铃响 执行print(“\a”) 会有铃响
-
\b 退格
-
\000 空
>>> print("a\000cd") acd
-
\n 换行
>>> print("微信搜索公众号:python小demo\n一起学python3") 微信搜索公众号:python小demo 一起学python3
-
\v 纵向制表符; \t 横向制表符
>>> print("a\tb\vc\td") a b c d
-
\r 返回光标至行首
-
\f 换页
raw 字符串,让转义符号失效
表达式:
- r’字符串内容’
- r"字符串内容"
- r’‘‘字符串内容’’’
- r"““字符串内容””"
>>> print(r'\a \n \t \v')
\a \n \t \v
字符串格式化输出 回目录
生成一定格式的字符串
表达式:
- 格式化字符串 % 参值
- 格式化字符串 % (参值1,参值2,…)
- 字符串中的%号为占位符,参值会替换到字符的占位中
>>> "这是微信公众号:%s" % "python小demo"
'这是微信公众号:python小demo'
>>> print("1 + %d = 6 \n10 %s 5 = 5" % (5, "-"))
1 + 5 = 6
10 - 5 = 5
格式化符号:
- %c 格式化字符及其ASCII码, ASII码会自动转成字符
>>> "%c" % 97 'a' >>> "%c" % "a" 'a' >>> "%c" % "中" '中'
- %s 格式化字符串,参值会使用str转换后替换
>>> "%s %s %s" % (1, 1/3, "中文") '1 0.3333333333333333 中文'
- %d 格式化整数
>>> "整数:%d 小数:%d" % (10 , 1 / 3) '整数:10 小数:0'
- %u 格式化无符号整型
- %o 八进制数
- %x 十六进制
- %X 十六进制(大写)
- %f 格式化浮点数,可以指定小数点后精度
>>> "默认:%f 保留两位小数: %.2f 保留十位小数:%.10f" % (1/3, 1/3, 1/3) '默认:0.333333 保留两位小数: 0.33 保留十位小数:0.3333333333'
- %e 、 %E 用科学计数法格式化浮点数
>>> "%e %E" % (1/3, 1/3) '3.333333e-01 3.333333E-01'
- %g %f 和 %g的简写
- %G %f 和 %G的简写
- %p 用十六进制数格式化变量的地址
三引号字符串输出格式字符串
上面格式化字符串虽然可以达到预想效果,但用起来还是很麻烦,使用三引号可以很轻松的输出想要的字符串格式,举个例子,比如想输出下面样式的字符串:
±---------------------+
| python小demo |
±---------------------+
可以直接用三引号括起来就可以
>>> out_str = """
... +----------------------+
... | python小demo |
... +----------------------+
... """
>>> print(out_str)
+----------------------+
| python小demo |
+----------------------+
f-string 是python3.6+版本新功能,后面接字符串,需要传入的变量可用"{}"括起来,变量可以是python的任何数据类型
>>> name = "python小demo"
>>> study = "python"
>>> f"微信搜索公众号:{name} ,一起学{study}"
'微信搜索公众号:python小demo ,一起学python'
字符串中常用的内建函数(此处我只列举了我常用的方法) 回目录
-
str.format(*args, **kwargs) 执行字符串格式化操作(在f-string还没有之前,我更喜欢三引号配合这个输出格式化字符串)
>>> name = "python小demo" >>> study = "python" >>> out_str = """ ... 一起学{} ... 关注{} ... """.format(study, name) >>> out_str '\n一起学python\n关注python小demo\n' >>> print(out_str) 一起学python 关注python小demo
"{}"内可以传入任何python数据类型
-
str.encode(encoding=‘utf-8’, errors=‘strict’) 返回对应字符集编码后的字节串对象,encoding指定字符集;errors设置错误处理方案,默认情况下不会进行检测
-
bytes.decode(encoding=“utf-8”, errors=“strict”),用来解码str.encode返回的对象
>>> name = "python小demo" >>> name_utf8 = name.encode('utf-8') >>> name_gbk = name.encode("GBK") >>> print(name_utf8, "======", name_gbk) b'python\xe5\xb0\x8fdemo' ====== b'python\xd0\xa1demo' >>> print("utf8解码:", name_utf8.decode("utf-8")) utf8解码: python小demo >>> print("GBK解码:", name_gbk.decode("GBK")) GBK解码: python小demo
编码和解码字符集必须一致,否则会出现乱码,如下:
>>> print("utf8编码GBK解码:", name_utf8.decode("GBK")) utf8编码GBK解码: python灏廳emo
-
str.startswith(prefix[, start[, end]]) 如果字符串以指定的 prefix 开始则返回 True,否则返回 False。 如果有可选项start,将从所指定位置开始检查。 如果有可选项end,将在所指定位置停止比较
-
str.endswith(suffix[, start[, end]]) 如果字符串以指定的 suffix 结束返回 True,否则返回 False。如果有可选项 start,将从所指定位置开始检查。 如果有可选项 end,将在所指定位置停止比较
>>> name = "python小demo" >>> name.startswith("py") True >>> name.startswith("python") True >>> name.startswith("n") False >>> name.startswith("n", 5) True >>> name.endswith("demo") True >>> name.endswith("demo", 1) True >>> name.endswith("demo", 1, 3) False
-
str.find(sub[, start[, end]]) 检测字符串中是否有包含的sub字符串,如果有,返回最先开始的下标,没u有则返回-1,如果有start, end,将在stat、end范围内查找
>>> name = "python小demo" >>> name.find("py") 0 >>> name.find("o") 4 >>> name.find("o", 5) 10 >>> name.find("56", 5) -1
-
len(string) 返回字符串字符个数
>>> len("abc") 3 >>> len("") 0 >>> len("a") 1
-
str.join(iterable) 返回一个由 iterable 中的字符串拼接而成的字符串,iterable里面元素必须都是字符或者字符串类型,bytes对象都不可以
>>> "".join(["python", "小", "demo"]) 'python小demo' >>> " - ".join("abc") 'a - b - c'