1.函数的递归
指一个函数在内部调用的阶段直接或者间接的调用了自身并且,return语句不能包含表达式。
递归分为两个阶段
1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降
直到有一个最终的结束条件
2.递推:一次次往回推导的过程
''' age(4)=age(3)+1 age(3)=age(2)+1 age(2)=age(1)+1 age(1)=1 可找出规律: age(n)=age(n-1)+1 n>1时成立 age(1)=1 ''' #递归函数 del age(n): if n == 1 #必须要有结束条件4 return 1 return age(n-1)+1 res = age(4) print(res) #递归函数不要考虑循环的次数 只需要把握结束的条件
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]],将列表中的数字依次打印出来 def num(l): for i in l: if type(l) is int: print(i) else: num(i) num(l) #用for循坏来打印的话,代码就比较繁琐 # 递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰,代码也不如递归的可读性高。
顶替方法:①第一种是pass,②第二种是...。推荐使用第一种。
2.算法之二分法
前提:容器里面的数组一定要是有顺序的。
基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。
l = [1,3,5,12,57,89,101,123,146,167,179,189,345] target_num = 666 #target_num 目标编号 def get_num(1,target_num): if not =1: print('该数字不存在!') return print(l) middle_number = len(l)//2 #中间索引 if target_num > l[middle_index] # 切取列表右半部分 num_right = l[middle_index + 1:] # 再递归调用get_num函数 get_num(num_right,target_num) elif target_num < l[middle_index]: # 切取列表左半部分 num_left = l[0:middle_index] # 再递归调用get_num函数 get_num(num_left, target_num) else: print('find it',target_num) get_num(l,target_num)
3.三元表达式
比较x和y的大小。 #用函数来表示 def my_max(x,y) if x > y: return:x else: return:y #当某个条件成立时做一件事,不成立时做例外一件事。 #比如当x大的时候返回x,当y大的时候返回y。 #用三元表达式来表达 res = x if x > y else y #如果if后面的条件成立返回if前面的值 否则返回else后面的值 三元表达式固定表达式 值1 if 条件 else 值2 条件成立 : 值1 条件不成立: 值2
补充:三元表达式的应用场景只推荐只有两种选择的情况下使用。
4.列表生成式
#往列表里面的内容增加一个尾注 #for循环添加方法 l=['1','2','3','4','5','6'] li=[] for name in l: li.append('%s_nb'%name) print(li) # 列表生成式 res = ['%s_nb'%i for i in l] print(res)
l = ['1_nb', '2_nb', '3_nb', '4_nb','6_dnb'],将含有‘_nb’的另外组成一个列表。 res=[name for name in l if name.endswith('_nb')] #后面不支持else,因为else可以与for,if都有关联。 print(res) #['1_nb', '2_nb', '3_nb', '4_nb', '5_nb'] # 先for循环依次取出列表里面的每一个元素 # 然后交由if判断 条件成立才会交给for前面的代码 # 如果条件不成立 当前的元素 直接舍弃
5.字典生成式
跟列表生成式一样,字典生成式用来快速生成字典,不同的是,字典需要两个值。
#d = {key: value for (key, value) in iterable} d1 = {'x': 1, 'y': 2, 'z': 3} d2 = {k: v for (k, v) in d1.items()} print(d2)
6.匿名函数
特点:一般都是临时存在,用完就没了。
def my_sum(x,y) return x + y lambad x,y : x+y # 注:其中左边的相当于函数的形参,右边的相当于函数的返回值。 # 匿名函数通常不会单独使用,是配合内置函数一起使用,也可以配合自己写的函数一起使用
7.内置函数
# map 映射 一一对应 l = [1,2,3,4,5,6] print(list(map(lambda x:x+1,l))) # 基于for循环 >>>:[6, 7, 8, 9, 10, 11] # zip 拉链 # 基于for循环,只顾及短的那一端 l1 = [1,2,] l2 = ['a','b','c'] print(list(zip(l1,l2))) >>>:[(1, 'a'), (2, 'b')] # filter l = [1,2,3,4,5,6] print(list(filter(lambda x:x != 3,l))) #>>>:[1, 2, 4, 5, 6] # 基于for循环,依次取出列表中的每一个值,取出来的值都放在lanbda中,其中(lambda)相当于一个条件,如果返回是false,那个值就不要。 # reduce from functools import reduce l = [1,2,3,4,5,6] print(reduce(lambda x,y:x+y,1)) #>>>:21 当初始值不存在时,先获取取两个元素相加值,之后每次获取一个与上一次相加的结果相加