字符串
创建和驻留机制
在python中字符串是基本数据类型,是一个不可变的字符序列
什么叫字符串驻留机制:仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量
驻留机制的几种情况(交互模式)
- 字符串为0/1时
- 符合标识符的字符串
- 字符串只在编译时进行驻留,而非运行时
- [-5,256]之间的整数
![](https://img.haomeiwen.com/i9049859/472af4488c0188d4.png)
sys中的intern方法强制2个字符串指向同一个对象
字符串驻留机制的优缺点
- 当需要值相同的字符串,可以直接从字符串池里拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是比较影响性能的
- 在需要进行字符串拼接建议使用str类型的join方法,而不是+,因为join方法是先计算出所有字符串中的长度,然后再拷贝,只new一次对象
查询
- index
查找子串第一次出现的位置,如果不存在就会报错 - rindex
查找子串最后一次出现的位置,如果不存在就会报错 - find
查找子串第一次出现的位置,如果不存在不会报错 - rfind
查找子串最后一次出现的位置,如果不存在不会报错
大小转换
- upper
- lower
- swapcase
把字符串中所有大写字母都转成小写字母,把所有小写字母都转成大写字母
s = 'python,java'
print(s.capitalize())
- capitalize
把第一个字符转成大写,把其余字符转成小写 - title
把每个单词的第一个字符转换成大写,把每个单词的剩余字符转换成小写
内容对齐操作
- center
- ljust
- rjust
- zfill:右对齐,使用0来填充
劈分
- split
- rsplit:从右边切分
sep:用于指定分隔符,可以包含多个字符。此参数默认为 None,表示所有空字符,包括空格、换行符“\n”、制表符“\t”等
maxsplit:可选参数,用于指定分割的次数,最后列表中子串的个数最多为 maxsplit+1。如果不指定或者指定为 -1,则表示分割次数没有限制
s4 = 'java scala go'
print(s4.split())
s5 = 'java|scala|go'
print(s5.split(sep='|'))
s6 = 'java|scala|go'
print(s6.split(sep='|', maxsplit=1))
print(s6.rsplit(sep='|', maxsplit=1))
判断
python合法标识符的命名规范是:
1、标识符由英文字母、数字和下划线组成,但第一个字符不能是数字;
2、标识符不能和python中的保留字相同;
3、标识符中不能包含空格、@等特殊字符。
判断字符串操作的方法
- isidentifier
判断指定的字符串是不是合法的标识符 - isspace
判断指定的字符串是否全部由空白字符组成 - isalpha
判断指定的字符串是否全部由字母组成 - isdecimal
判断指定字符串是否全部由十进制的数字组成 - isnumeric
判断指定的字符串是否全部由数字组成 - isalnum
判断指定字符串是否全部由字母和数字组成
替换与合并
- replace
第一个参数指定被替换的子串,第二个参数指定替换子串的字符串,该方法替换前的字符串不发生变化,调用该方法可以通过第三个参数指定最大的替换次数 - join
该方法将列表或元组的字符串合并成一个字符串
s5 = 'java scala go go'
print(s5.replace('go', 'python'))
print(s5.replace('go', 'python', 2))
s6 = ('java', 'scala')
print('|'.join(s6))
s6 = ['java', 'scala']
print('|'.join(s6))
print("*".join('scala'))
比较
比较原理:两两字符比较,比较的是原始值,调用ord可以,得到指定字符的原始值.与内置函数ord对应的是内置函数chr,调用内置函数chr时可以得到其对应的字符
print('a' >= 'b')
print(ord('a'), ord('b'))
print(chr(ord('a')), chr(ord('b')))
== % is 的区别
==比较的是值,is比较的是id地址值
切片
熟练使用步长
s = 'hello scala'
print(s[:5]) # hello
print(s[6:]) # scala
print(s[::2]) # hlosaa
print(s[-5::1]) # scala
print(s[::-1]) # alacs olleh
格式化字符串
占位符
name = '小米'
age = 24
print('我叫%s 我今年%d岁' % (name, age))
print('我叫{0} 我今年{1}岁'.format(name, age))
print(f'我叫{name} 我今年{age}岁')
宽度和精度
print('%10d' % 100)
print('%f' % 3.11111)
print('%.3f' % 3.11111)
print('%10.3f' % 3.11111)
print('{0:.3}'.format(3.1111))
print('{0:.3f}'.format(3.1111))
编码和解码
s = '我是小米'
print(s.encode(encoding='GBK')) # 一个中文两个字符
print(s.encode(encoding='UTF-8')) # 一个中文三个字符
print(s.encode(encoding='GBK').decode(encoding='GBK'))
print(s.encode(encoding='UTF-8').decode(encoding='UTF-8'))
小结
![](https://img.haomeiwen.com/i9049859/74b3067542a17c47.png)
函数
定义和调用
什么是函数:
函数就是执行特定任何以完成特定功能的一段代码
为什么需要函数:
- 复用代码
- 隐藏实现细节
- 提高可维护性
- 提高可读性
函数的创建
参数传递
- 形参:在函数的定义处
- 实参:函数的调用处
def num_sum(a, b):
return a + b
print(num_sum(1, 10))
# 关键字传参
print(num_sum(b=10, a=1))
参数传递的内存分析
- 如果是不可变对象,在函数体的修改不会影响实参的值
- 如果是可变对象,在函数体的修改会影响实参的值
def f(num1, num2):
print(num1)
print(num2)
num1 = 100
num2.append('222')
print(num1)
print(num2)
s1 = 1
s2 = ['111']
f(s1, s2)
print(s1)
print(s2)
返回值
- 如果函数没有返回值,return可以不写
- 函数的返回值,如果是1个,直接返回类型
- 函数的返回值,如果是多个,返回的结果为元组
- return写不写视情况而定
def ff(num2):
s = []
s1 = []
for i in num2:
if i % 2 == 0:
s.append(i)
else:
s1.append(i)
return s, s1
num2 = [1, 2, 3, 4, 5]
re = ff(num2)
print(re)
参数定义_默认值参数
def f(num1, num2=10):
return num1 + num2
print(f(10))
print(f(10, 20))
参数定义_个数可变的位置形参和关键字形参
def f2(num, *args):
print(num)
print(args, type(args)) # 元组
f2(11, 12, 12, 34)
def f3(**kwargs):
print(kwargs, type(kwargs))
f3(name='xxx', id=123) # 字典
参数小结
![](https://img.haomeiwen.com/i9049859/669a7969015436ce.png)
注意如下的写法哈
def f3(a, b, c):
print(a)
print(b)
print(c)
lst = [1, 2, 3]
f3(*lst)
dic = {'a': 1, 'b': 123, 'c': 123} # 必须和形参一致
f3(**dic)
变量的作用域
- 局部变量
- 全局变量
递归函数
如果在一个函数体内调用了该函数本身,这个函数就称为递归函数
def f4(n):
if n == 1:
return 1
else:
return n * f4(n-1)
print(f4(10))
斐波那契数列
def f5(n):
if n == 1:
return 1
elif n == 2:
return 1
else:
return f5(n-1) + f5(n-2)
for i in range(1, 7):
print(f5(i))
异常
粗心导致的错误
- 漏写了末尾的冒号
- 缩进错误
- 把中文字符当成英文字符
- 字符串拼接中,把字符串和数据进行拼接
- 没有定义在结构中的变量
- 比较运算符的混用
错误点不熟悉导致的错误
思路不清晰导致的错误
被动掉坑 try except
try:
num1 = int(input('请数据数字'))
num2 = int(input('请数据数字'))
print(num1 / num2)
except ZeroDivisionError as a:
print("被除数应该不为0", a)
except ValueError as b:
print("只能输入数字", b)
else:
print('正确执行')
finally:
print('报异常也会执行')
网友评论