一.递归
递归就是函数地递归调用,在函数调用地过程中直接或间接地调用了本身
递归分为两个阶段
回溯
一层一层往下找,是一个重复地过程,每一次重复,问题地规模应该逐渐减少,直到接近最终地结果
注意:一定要满足某种条件下进行回溯,否则就是无限递归
递推
就是一层一层往回推出结果
结论:
1.递归一定要有一个明确地结束条件
2.每进行一次递归,问题地规模也要相应地减少
3.在python中没有尾递归优化
例子一
items=[1,[2,[3,[4,[5,[6,[7,[8,[9,[10]]]]]]]]]]
def tell(l):
for item in l:
if type(item) is not list:
print(item)
else:
tell(item)
tell(items)
列子二
算法:是如何高效率地解决某一个问题地方法/套路
二分法
nums=[11,22,34,56,65,76,77,86,89,90,97,101,105,135,146,178,201]
find_num=100
def func(nums,find_num):
print(nums)
if len(l) == 0:
print('not exists')
return
mid_index=len(nums)//2
if find_num>nums[mid_index]:
nums=nums[mid_index:]
func(nums,find_num)
elif find_num<nums[mid_index]:
nums=nums[0:mid_index]
func(nums, find_num)
else:
print('find it')
func(nums,find_num)
二.匿名函数
匿名函数lambda 就是没有函数名地函数,并且是一次性的,除了没有名字其他都与有名函数一样调用
总结:
1.匿名函数的目的就是一次性使用,是没有名字,如果赋值给一个变量名那就没有意义了
2.匿名函数的参数规则,作用域关系与有名函数一样的
3.匿名函数的函数体通常是一个表达式,必须要有一个返回值,可以不用写return ,自带return效果
4.匿名函数通常不单独使用,而是与各种内置函数一起使用,如max,min,sorted,map,reduce,filter
dic={'tom':2000,
'bob':4000,
'may':8000,
'mary':5000}
print(max(dic,key= lambda x:dic[x]))
#因为是字典,所以取最大值取出的是键,而不是对应的值
# max(key=)改变max函数比较依据
print(min(dic,key= lambda x:dic[x]))
print(sorted(dic,key= lambda x:dic[x],reverse=True))
sorted(reverse=False)#默认是False 就是升序 reverse=True就是降序
map(函数,值) 映射
l=[1,2,3,4,5]
res = map(lambda x:x**2,l)
print(list(res))
reduce()合并
from functools import reduce
res=reduce(lambda x,y:x+y,range(1,101),0)
print(res)
filter()过滤
相当于for循环取出每一个人名,然后传给匿名函数,将调用匿名函数返回值为True地那个人名给留下来
三.三元表达式,列表生成式,字典生成式
一.三元表达式
仅用于:
1.条件成立返回一个值
2.条件不成立返回一个值
def max2(x,y):
return x if x>y else y
print(max2(10,2))
列表表达式
l=[i for i in range(100)]
print(l)
l=['alex','lqz','yyh']
l=[i+'_DSB' for i in l]
print(l)
字典生成式
keys=['name','age','sex']
vals=['tom',18,'male']
dic={k:vals[i] for i,k in enumerate(keys)}
print(dic)