今日所得
函数递归
算法之二分法
三元表达式
列表生成式
字典生成式
匿名函数
常用的内置函数
函数的递归
是指在函数加括号调用的时候,会再次调用到自身的函数
不过需要一个条件来判断是否停止继续调用
#举个例子
deffunc():print('from func')
func()#当函数执行到这一步时又一次调用了函数自身
func()
上面这个列子实际是一个无限循环的,但是函数不应该无限循环下去,因为每一次调用函数都会产生一个属于它的名称空间,如果无限循环下去,那么就会尝试内存溢出的问题,于是python中有了一个递归层数的限制。
#我们通过改变上面的程序来查看这个限制是多少:
deffunc(n):print('from func',n) #将n的值打印出来
func(n+1) #每次递归让n加一
func(1) #从1开始
"""函数递归的深度为1000,但是不精准一般为998或者997左右
可以通过代码和模块来修改递归深度"""
importsysprint(sys.getrecursionlimit())
sys.setrecursionlimit(2000)
递归分为两个阶段
1.回溯:就是一次一次的调用自身的函数,但是调用的前提是每一次函数执行完毕之后,就会朝着最终答案向前一步,直到得到这个答案,达到结束函数的条件
2.递推:就是向回一步一步的反向推导出答案的过程
算法二分法:可以高效的从一个列表中找出你需要的元素是否在列表中
内部原理是使用函数的递归,从中间将列表一分为二,变成两个列表
判断你所需的元素与列表的中间值的大小,再从剩下的两个列表中找
****************前提是列表要有顺序*****************
三元表达式
是用来判断两个元素是否满足条件,满足条件则输出那个数
res = x if x > y elsey#如果if后面的条件成立返回if前面的值 否则返回else后面的值
"""三元表达式固定表达式
值1 if 条件 else 值2
条件成立 值1
条件不成立 值2"""
列表生成式
能够快速简单的对一个列表里的所有元素进行操作
列表生成式的内部原理:使用for循环先将列表里的元素一一拿出,交由if条件语句进行判断
如果满足if则会交给for之前的代码进行处理,如果不满足则会直接舍弃这个元素
匿名函数
所谓匿名函数,见名知意就是没有名字的函数
匿名函数的特点,执行完就自动销毁了,只是临时使用
res = (lambda x,y:x+y)(1,2)#:左边的相当于函数的形参#:右边的相当于函数的返回值#匿名函数通常不会单独使用,是配合内置函数一起使用
常用内置函数
map zip filter sorted reduce
#map 映射
l = [1,2,3,4,5,6]#print(list('hello'))
print(list(map(lambda x:x+5,l))) #基于for循环
#zip 拉链 # 基于for循环
l1 = [1,2,]
l2= ['jason','egon','tank'] #有几个元素能对应上就组合几个元素
l3 = ['a','b','c']print(list(zip(l1,l2,l3)))#filter 过滤 元素满足条件就过滤不要
l = [1,2,3,4,5,6]print(list(filter(lambda x:x != 3,l))) #基于for循环
#sorted 排序 将元素从小到大依次排序#reverse 反转将列表里的元素反过来排
l = ['jason','egon','nick','tank']print(sorted(l,reverse=True))from functools importreduce
l= [1,2,3,4,5,6]print(reduce(lambda x,y:x+y,l,19)) #19初始值 第一个参数#当初始值不存在的情况下 按照下面的规律#第一次先获取两个元素 相加#之后每次获取一个与上一次相加的结果再相加