递归函数 算法之二分法 三元表达式 字典生成式 匿名函数 常用的内置函数(map、zip、reduce)
递归函数:
递归函数包括两个过程:
回溯:
就是一次次的重复的过程,但是在每次重复的过程中要让你的复杂度随着重复的次数一次次降低,还需要最终有一个结束的条件。
递推:
一次次回溯之后往回推导的过程。
递归函数:
age(5) = age(4) + 2
age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 18
用递归函数实现为:
def get_age(n):
if n == 1: #结束条件
return 18
age = get_age(n-1)+2
return age
age = get_age(5)
print(age)
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]
# 将列表中的数字依次打印出来(循环的层数是你必须要考虑的点)
1 def get_value(l):
2 for i in l :
3 if type(i) is int :
4 print(i)
5 else:
6 get_value(i)
7 get_value(l)
递归函数通常不需要考虑回溯的次数,但是结束条件必须考虑。
算法之二分法:
二分法的使用条件:容器类型中的数据必须是按顺序排列的
#二分法
l1 = [1,3,5,12,57,89,101,123,146,167,179,189,345]
def find_num(l,n):
res = len(l)
index_mid = res // 2
if n < l[index_mid]:
l_right = l[0:index_mid]
print(l_right)
find_num(l_right,n)
elif n > l[index_mid]:
l_left = l[index_mid:]
find_num(l_left,n)
print(l_left)
else:
print('find it',n)
find_num(l1,3)
三元表达式:
x = 3
y = 5
value = x if x > y else y
print(value)
if 条件成立则value=左边的值x,条件不成立,则value=右边的值y
python不推荐三元表达式中套三元表达式,只推荐在结果只有两种的条件下使用。
列表生成器:
1 l = ['zhao','qian','sun','li']
2 value = ['{}_yang'.format(name) for name in l]
3 #表示for循环列表l中的元素,按照for前面的格式存放到value列表中
4 print(value)
5 value1 = ['{}'.format(name) for name in value if name.endswith('_yang')]
6 #表示先for循环value类表中的元素,在进行后面的if判断,满足条件的元素按照for前面的格式进行输出
7 print(value1)
1 l = ['zhao','qian','sun','li']
2 value = ['{}_yang'.format(name) for name in l]
3 #表示for循环列表l中的元素,按照for前面的格式存放到value列表中
4 print(value)
5 value1 = ['{}'.format(name) for name in value if name.endswith('_yang')]
6 #表示先for循环value类表中的元素,在进行后面的if判断,满足条件的元素按照for前面的格式进行输出
7 print(value1)
字典生成式:
#进行一一对应生成字典
l1 = ['name','password','hobby']
l2 = ['jason','123','DBJ','egon']
d = {}
for i,j in enumerate(l1):
d[j] = l2[i]
print(d)
l = ['yang','zhao','qian']
#for循环i是列表l的索引,而j是列表l中的元素,满足if的条件之后,按照for前面的格式进行输出生成字典
res = {i:j for i,j in enumerate(l) if i!=1}
print(res)
l[1,2,3,4,5,6]
#这样写不是元组生成式,而是生成器表达式,得到的值是个“老母猪” res = (i for i in l ) print(res) #<generator object <genexpr> at 0x000001CBC215B200> for i in res: print(i)
匿名函数:
没有名字,临时存在用完就没了
#:前面存放的是形参x,y后面存放的是匿名函数的返回值 # 匿名函数通常不会单独使用,是配合内置函数一起使用 res = (lambda x,y:x+y)(1,2) print(res)
常用的内置函数:
d = { 'egon':30000, 'jason':88888888888, 'nick':3000, 'tank':1000 } print(max(d,key=lambda name:d[name])) #在不指定key的的情况下会按照字典d的key值进行for循环比较,在指定key后会按照匿名函数lambda得到的值进行for循环比较,本题中也即value值。但返回的是按值比较的到的d中key的值。 #也即按薪资比较返回人名
# map 映射 l = [1,2,3,4,5,6] print(list(map(lambda x:x*2,l))) # 通过for循环将l中的值传入匿名函数的形参中,最后形成列表 # zip 拉链 # 基于for循环 l1 = [1,2,3] l2 = ['jason','egon','tank'] l3 = ['a','b','c'] print(list(zip(l1,l2))) print(list(zip(l1,l2,l3))) # 基于for循环将l1,l2,l3将三个列表中的元素一一对应形成列表中套元组的形式 # reduce 模块 from functools import reduce l = [1,2,3,4,5,6] print(reduce(lambda x,y:x+y,l,19)) # 19是指定的初始值,然后按照for循环将l中的值传给匿名函数进行两两,若不指定初始值,会先从列表中取出两个值。