Python基础之字符串

强颜欢笑 提交于 2020-02-14 08:24:12

一:字符串

很多人初学编程时,总是担心自己数学不行,潜意识里认为数学好才能编程。实际上,大多数程序员打交道最多的是“字符串”而不是“数字”。因为,编程是用来解决现实问题的,因此逻辑思维的重要性远远超过数学能力。
字符串的本质是:字符序列。Python的字符串是不可变的,我们无法对原字符串做任何修改。但可以将字符串的一部分复制到新创建的字符串,以达到“看起来修改”的效果。

1.1 字符串的编码

Python3直接支持Unicode,可以表示世界上任何书面语言的字符。Python3的字符默认就是16位Unicode编码,ASCII码是Unicode编码的子集(ASCII码只能表示英文与数字,一个字节,每个字节8位)。
使用内置函数==ord()可以把字符转换成对应的Unicode码
使用内置函数
chr()==可以把十进制数字转换成对应的字符

print(ord('A'))			# 65
print(ord('高'))		# 39640
print(chr(65))			# A
print(chr(39640))		# 高

1.2 创建字符串

a = "I teach Chinese KongFu"
b = 'who are you?'
# 创建多行字符串
c = '''name="Bruce Lee"
company="sxt"
age = 32
lover = KongFu
'''
print(c)

多行字符串输出结果:

name="Bruce Lee"
company="sxt"
age = 32
lover = KongFu

1.3 字符串长度

使用len()函数计算字符串的长度

a = ''					# Python允许空字符串的存在
b = 'Bruce Lee 李小龙'
print(len(a))			# 0
print(len(b))			# 13 (包含空格,因为使用的是Unicode编码所以一个中文汉字就是一个字符)

1.4 replace()实现字符串替换

字符串是“不可改变的”,我们通过[]可以获取字符串指定位置的字符,但是我们不能改变字符串,当尝试改变字符串中某个字符,会报错:

a = 'see you again'
a[2] = 'a'
print(a)

报错信息如下:

TypeError: 'str' object does not support item assignment

当需要改变某些字符时,就可以使用replace()

a = 'see you again'
b = a.replace('s', 'l')
print(a)				# see you again
print(b)				# lee you again

整个过程中,实际上我们是创建了新的字符串对象,并赋值给了变量b,而变量a则无变化

1.5 slice切片

切片slice操作可以让我们快速的提取字符串,标准格式为:

[起始偏移量 start: 终止偏移量 end: 步长 step]

典型操作(三个量为正数)的情况:
Python字符串切片
其他操作(三个量为负数)的情况:
Python字符串切片

1.6 split()分割

split()可以基于指定分隔符将字符串分隔成多个子字符串(存储到列表中)。如果不指定分隔符,则默认使用空白字符(换行符/空格/制表符)。

a = 'to be or not to be'
b = a.split()
print(b)		# ['to', 'be', 'or', 'not', 'to', 'be']

指定分隔符进行分隔

a = 'to be or not to be'
b = a.split('be')
print(b)		# ['to ', ' or not to ', '']

1.7 join()合并

join()的作用与split()作用刚好相反,用于将一系列子字符串连接起来。

a = ['sxt', 'sxt100', 'sxt200']
b = '*'.join(a)		# 指定使用*号将列表中的元素连接起来(也可以不指定,为空)
print(b)			# sxt*sxt100*sxt200

使用字符串拼接符+,会生成新的字符串对象,因此不推荐使用+号来进行拼接字符串操作。
推荐使用join函数,因为join函数在拼接字符串之前会计算所有字符串的长度,然后逐一拷贝,仅新建一次对象。

1.8 字符串驻留机制

字符串驻留:仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中。
Python支持字符串驻留机制,对于符合标识符规则的字符串(仅包含下划线 _、字母和数字)会启用字符串驻留机制。

a = 'abd_33'
b = 'abd_33'
print(a is b)		# True (变量a和b都指向同一块内存地址)
# 下面使用的python版本为3.7.4,带特殊字符#号,也是符合标识符规则的字符串;早期版本下面为False,内存地址也不一样
c = 'dd#'
d = 'dd#'
print(c is d)		# True  (is 比较的是内存地址)
print(c == d)		# True	(== 比较的是value)
print(id(c))		# 1922673958320
print(id(d))		# 1922673958320

1.9 格式排版

center(), ljust(), rjust()这三个函数用于对字符串实现排版

a = 'tom'
print(a.center(10, '*'))		# ***tom****
print(a.center(10))				#    tom    
print(a.ljust(10, '*'))			# tom*******

1.10 字符串格式化

Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
基本语法是通过 {} 和 : 来代替以前的 % 。
format 函数可以接受不限个参数,位置可以不按顺序。

a = 'name is : {0}, age is : {1}'.format('Bruce Lee', 32)
b = 'name is : {}, age is : {}'.format('Jet Lee', 37)
c = 'name is: {0}, age is : {1}, {0} is a good guy'.format('Rambo', 22)
d = 'name is {name}, age is {age}'.format(name = 'Jacky', age = 33)
print(a)
print(b)
print(c)
print(d)

1.11 填充与对齐

填充常跟对齐一起使用
^、<、>分别是居中、左对齐、右对齐,后面带宽度
:号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充

a = "{:*>8}".format('234')
print(a)		# *****234
b = 'I am {0}, I love number {1:*^8}'.format('Bruce Lee', '666')
print(b)		# I am Bruce Lee, I love number **666***

1.12 数字格式化

浮点数通过 f,整数通过 d 进行需要的格式化。

a = "我是{0},我的存款有{1:.2f}".format('Bruce Lee', 3888.234234)
b = "我是{0},我的存款有{1:d}".format('Bruce Lee', 3888)
print(a)		# 我是Bruce Lee,我的存款有3888.23
print(b)		# 我是Bruce Lee,我的存款有3888

其他格式,供大家参考:

数字 格式 输出 描述
3.1415926 {:.2f} 3.14 保留小数点后两位
3.1415926 {:+.2f} 3.14 带符号保留小数点后两位
2.71828 {:.0f} 3 不带小数
5 {:.0>2d} 05 数字补零 (填充左边, 宽度为 2)
5 {:x<4d} 5xxx 数字补 x (填充右边, 宽度为 4)
10 {:x<4d} 10xx 数字补 x (填充右边, 宽度为 4)
1000000 {:,} 1,000,000 以逗号分隔的数字格式
0.25 {:.2%} 25.00% 百分比格式
1000000000 {:.2e} 1.00E+09 指数记法
13 {:10d} 13 右对齐 (默认, 宽度为 10)
13 {:<10d} 13 左对齐 (宽度为 10)
13 {:^10d} 13 中间对齐 (宽度为 10)

1.13 可变字符串

在 Python 中,字符串属于不可变对象,不支持原地修改,如果需要修改其中的值,智能创建新的字符串对象。但是,经常我们确实需要原地修改字符串,可以使用 io.StringIO对象或 array 模块。

import io

s = 'hello, man'
sio = io.StringIO(s)
print(sio)
print(sio.getvalue())
print(sio.seek(7))			# 将指针移动到索引7位置
print(sio.write('g'))		# 将索引为7的字符修改为g
print(sio.getvalue())		# hello, gan

1.14 其他常用方法

a = '''It's been a long day without you my friend,And I'll tell you all about it when I see you again,We've come a long way from where we began,Oh I'll tell you all about it when I see you again'''
print(len(a))					# 计算字符串长度
print(a.startswith('I'))		# 是否以什么开头
print(a.endswith('n'))			# 是否以什么结尾
print(a.find('long'))			# 从左边开始查找long第一次出现的位置
print(a.rfind('you'))			# 从右边开始查找you第一次出现的位置
print(a.count('see'))			# 统计字符串中see出现的次数
print(a.isalnum())				# 是否全部为数字或字母
print(a.capitalize())			# 将首字母大写
print(a.title())				# 将每个单词的首字母大写
print(a.upper())				# 全部转化为大写字母
print(a.lower())				# 全部转化为小写字母
print(a.swapcase())				# 将字符串中的大写字母转化为小写,小写转化为大写
print(a.isalpha())				# 检测字符串是否只由字母组成(含汉字)
print(a.isdigit())				# 是否只由数字组成
print(a.isspace())				# 是否为空白字符
print(a.isupper())
print(a.islower())
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!