持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
字符串
字符串:在Python中字符串时基本数据类型,是一个不可变的字符序列
字符串的驻留机制:仅保留一份相同且不可变字符串的方法,不同的值被存放字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后序创建相同的字符串时,不会开辟新空间,而是把该字符串的地址赋给新建的变量
驻留机制的几种情况(交互模式)
- 字符串的长度为0或1时
- 符合标识符的字符串(只包含数字,字母,下划线)
- 字符串只在编译时进行驻留(如果调用函数的话就会开辟一个新的空间)
- [-5,256]之间的1整数数字
sys中的intern方法强制2个字符串指向同一个对象
PyCharm对字符串进行了优化处理(原本不驻留的在pycharm里面就驻留了)
字符串驻留机制的优缺点
- 当需要值相同的字符串时,可以直接从字符串池里拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串时会比较影响性能的
- 在需要进行字符串拼接时建议使用str类型和join方法,而非“+”,因为join()方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率要比“+”效率高
字符串的查询操作的方法
- index():查找子串substr第一次出现的位置,如果查找的子串不存在时,则抛出ValueError
- rindex():查找子串substr最后一次出现的位置,如果查找的子串不存在时,则抛出ValueError
- find():查找子串substr第一次出现的位置,如果查找的子串不存在时,则返回-1
- rfind():查找子串substr最后一次出现的位置,如果查找的子串不存在时,则返回-1
样例
s = 'hello,hello'
print(s.index('lo'))
print(s.find('lo'))
print(s.rindex('lo'))
print(s.rfind('lo'))
print(s.index('k'))
print(s.find('k'))
print(s.rindex('k'))
print(s.rfind('k'))
"""
3
3
9
9
ValueError: substring not found
-1
-1
ValueError: substring not found
"""
字符串的大小写转换操作的方法
- upper():把字符串中所有的字符都转成大写字母,并且产生一个新的字符对象
- lower():把字符串中所有的字符都转成小写字母,也会产生一个新的字符对象
- swapcase():把字符串中所有大写字母转成小写字母,把所有小写字母转成大写字母
- capitalize():把第一个字符转换为大写,其余字符转换为小写
- title():把每个单词的第一个字符转化为大写,把每个单词的剩余字符转换为小写
字符串内容对其操作的方法
- center():居中对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符串
- ljust():左对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符串
- rjust():右对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符串
- zfill():右对齐,左边用0填充,该方法只接受一个参数用于指定字符串的宽度,如果指定的宽度小于等于字符串的长度1,返回字符串本身
实现样例
s = 'hello,Python'
print(s.center(20,'*'))
print(s.center(10))
print(s.rjust(20,'*'))
print(s.rjust(20))
print(s.ljust(20,'*'))
print(s.zfill(20))
"""
****hello,Python****
hello,Python
********hello,Python
hello,Python
hello,Python********
00000000hello,Python
"""
字符串劈分操作的方法
split()
- 从字符串左边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表
- 以通过参数sep指定劈分字符串的劈分符
- 通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大劈分之后,剩余的子串会单独作为一部分
rsplit()
- 从字符串的右边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表
- 以通过参数sep指定劈分字符串的劈分符
- 通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大劈分之后,剩余的子串会单独作为一部分
实现样例
s = 'hello world Python'
lst = s.split()
print(lst)
s1 = 'hello|world|Python'
print(s1.split(sep='|'))
print(s1.split(sep='|', maxsplit=1))
"""
['hello', 'world', 'Python']
['hello', 'world', 'Python']
['hello', 'world|Python']
"""
判断字符串操作的方法
方法名称 | 作用 |
---|---|
isidentifier() | 判断指定的字符串是不是合法标识的字符串 |
isspace() | 判断指定的字符串是否全部由空白字符组成(回车,换行,水平制表符) |
isalpha() | 判断指定的字符串是否全部由字母组成 |
isdecimal() | 判断指定的字符串是否全部由十进制的数字组成 |
isnumeric() | 判断指定字符串是否全部由数字组成 |
isalnum() | 判断指定字符串是否全部由字母和数字组成 |
replace() | 第一个参数指定被替换的子串,第二个参数指定替换子串的字符串,该方法返回替换后得到的字符串,替换前的字符串不发生变化,调用该方法时可以通过第三个参数指定最大替换次数 |
join() | 将列表或元组中的字符串合并成一个字符串 |
字符串是不可变类型不具备增删改等操作,切片操作将产生新的对象
格式化字符串
name = 'xz'
age = 23
print('我叫%s,今年%d岁' % (name, age))
print('我叫{0},今年{1}岁'.format(name, age))
print(f'我叫{name},今年{age}岁')
"""
我叫xz,今年23岁
我叫xz,今年23岁
我叫xz,今年23岁
"""
函数
函数的创建和调用
什么是函数
函数就是执行特定任务以完成特定功能的一段代码
为什么需要函数
- 复用代码
- 隐藏实现细节
- 提高可维护性
- 提高可读性便于调试
函数的创建
def 函数名 ([输入参数]):
函数体
[return xxx]
函数的返回值
- 如果函数没有返回值【函数执行完毕之后,不需要给调用处提供数据】return可以省略不写
- 函数的返回值好,如果是1个,直接返回类型
- 函数的返回值,如果是多个,返回结果为元组
函数参数的定义
个数可变的位置参数
- 定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置函数
- 使用*定义个数可变的位置参数
- 结果为一个元组
实现样例:
def fun(*args):
print(args)
fun(10)
fun(10, 20)
fun(10, 20, 30)
"""
(10,)
(10, 20)
(10, 20, 30)
"""
个数可变的关键字形参
- 定义函数时,无法事先确定传递的关键字实参个数时,使用可变的关键字形参
- 使用**定义个数的可变的关键字形参
- 结果为一个字典
实现样例:
def fun(**args):
print(args)
fun(a=10)
fun(a=10, b=20)
fun(a=10, b=20, c=30)
"""
{'a': 10}
{'a': 10, 'b': 20}
{'a': 10, 'b': 20, 'c': 30}
"""
在一个函数定义过程中,既有个数可变的关键字形参,也有个数可变的位置形参,要求个数可变位置形参,放在个数可变的关键字形参之前