递归函数:
递归定义:
递归就是在函数本身调用自己加上结束语句,在递归中递归最深可达997或998,是python从内存的角度考虑的设置,这个设置可以通过sys模块设置。
递归的定义:
1 # 年龄: 2 # a = b+2 3 # b = c+2 4 # c = d+2 5 # d = 40 6 # 问a多少岁 7 def func(n): # 传入第几个人的年龄 8 if n == 4: # 第四个人是年龄是40 9 return 40 10 elif n > 0 and n <4: # 人不能多不能少 11 return func(n+1) + 2 #找不到的时候问下一个所以n加一,并且上他比上一个人大的年龄 12 print(func(1))
递归函数设置递归深度:
sum = 0 def func(): global sum print(sum) sum+=1 func() func() ''' 993 994 995 996 Traceback (most recent call last): 997 File "F:/Test/day12/2.递归.py", line 20, in <module>''' import sys sys.setrecursionlimit(1200) sum = 0 def func(): global sum print(sum) sum+=1 func() func() ''' 1195 1196 1197Traceback (most recent call last): File "F:/Test/day12/2.递归.py", line 37, in func'''
注意:递归可以让代码变得简单可是占内存
算法:
为什么学算法:
计算方法:人脑复杂 计算机简单
查找:找数据
排序:最短路径排序
二分查找法:
特点:
必须处理有序的列表,不断的在中间位置进行比较
简单的二分查找代码:
l = [1,2,3,4,5,6,7,8,9,10,11,22,33,44,55,66,77,88,99] # 我们要找到66的索引并返回 def indexl(l,aim,min = 0,max = None): max = len(l) if max == None else max # 计算出中间值 inte = (max-min)//2 + min#这里用整除,避免有浮点数, if l[inte] < aim: return indexl(l,aim,inte+1,max = max) elif l[inte] > aim: return indexl(l,aim,min = min,max = inte) else: return inte print(indexl(l,66))
正则表达式:
正则表达式:--> 字符串匹配
正则表达式测试网站: tool.chinaz.com/regex
正则表达式的分类:
字符组:
[在同一位置可能出现子字符],可以是[开始-结束],
可以出现多个范围,如A-z可以,则a-Z不可以,大写的字母比小写的小,大写的Z是90,小写的a是97
元字符:
是和非放在一起就是全部能匹配字符,包括换行符
. 匹配任意字符,换行符除外
\w 匹配字母或数字或下划线(word的意思) 大写代表非
\s 匹配任意空白字符(spase) 大写代表非
\d 匹配数字(digit) 大写代表非
\n 匹配换行
\t 匹配制表符
(可以指定或使用.)\b匹配单词的结尾
^ 匹配字符串的开头
&匹配字符串的结尾
a|b 匹配字符a或b从左到右,如果匹配到了a就不会对b做比较
() 分组
[] 字符组
[^a] a除外都匹配
量词:
规则: 所有的来歌词都要用在元字符后边,量词后边加+能少匹配就少匹配(惰性)
* 重复零次或多次
+重复一次或多次
?重复零次或一次
{n} 重复N次
{n,} 重复n次或多次
{n,m} 重复n到m次
字符集:
字符[^和]*除了和都匹配,重复零次或多次
分组与或和[^]:
([][])+ 整体进行量词的约束
转义字符\:
在python的话使用r'\n'可以进行字符的转义
r是real
非贪婪匹配pattern:
*? 重复任意字符
+?重复一次货多次,但是尽可能减少重复
??重复0次或一次,但尽可能减少重复
{n,}?重复n次以上,但尽可能减少重复
.*?的用法:
. 任意字符
* 0到无限
? 是非贪婪模式
re模块:
三个重要的方法:
findall(查找全部)(表达式,字符串): 会返回所有满足条件的所有结果,放在列表中
search()寻找: 从前向后找,找到一个就返回,返回的结果的是对象,需要调用group(组)才能使用,如果找不到会报错,报错时返回的是None,客户使用if判断进行解决报错。
split() 分割:
sub('\d','H','str',个数)替换:
subn()替换: 全部替换,返回替换次数,
字符串正则的编译: 变量名 = compile编()字符串编译
变量.search()寻找: 反复使用字符串编译出来的正则表达式
finditer():
得到迭代器,for循环也是得到迭代器,需要.group才能拿到结果
findeall的取消优先级,(?:...)
split :分割如果有分组则会保留分割内容