今日内容
-
递归函数
-
二分法
-
三元表达式
-
列表生成式
-
字典生成式
-
匿名函数
-
常用的内置函数
一、递归函数
1、什么是递归函数
所谓递归函数就是一个函数在其内部调用该函数,反复的调用下去,直到函数执行到不满足条件是停止调用并输出结果
2、递归函数的两个阶段
递归函数的执行可以分为两个阶段,分别为回溯和递推。
回溯:就是一次次的重复的过程,这个重复过程必须建立在每一次重复问题的复杂度都在降低,直到有一个最终的结束条件。
递推:一次次往回推到的过程。
3、递归函数的使用
递归函数在使用时不需要考虑循环的次数,只需要把握结束的条件即可。
def age(n): if n == 1: # 必须要有结束条件n=1 return 18 return age(n-1) + 2 res = age(5) print(res) # 26
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]] def get_num(l): for i in l: if type(i) is int: print(i) else: get_num(i) get_num(l) # 循环打印l中的所有数字
二、算法之二分法
算法:虽未算法就是解决问题的高效率的方法
target_num = 666 l = [1,3,5,12,57,89,101,123,146,167,179,189,345] def get_num(l,target_num): if not l: print('你给的工资 这个任务怕是没法做') return # 获取列表中间的索引 print(l) middle_index = len(l) // 2 # 判断target_num跟middle_index对应的数字的大小 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)
三、三元表达式
x = 99999 y = 9898898 res = x if x > y else y # 如果if后面的条件成立返回if前面的值 否则返回else后面的值 print(res) # 9898898
三元表达式的固定表达式形式为:
res = 值1 if 条件 else 值2 (条件成立 值1 条件不成立 值2)
三元表达式的也可以嵌套多层判断:
res = x if x > y else (m if m >n else (...))
取值的判断与单层取值一样。
四、列表生成式
列表生成式:将满足条件的值放在一个列表中,生成一个新列表。
l = ['tank_sb', 'nick_sb', 'oscar_sb', res = [name for name in l if name.endswith('_sb')] # 后面不支持再加else的情况 # 先for循环依次取出列表里面的每一个元素 # 然后交由if判断 条件成立才会交给for前面的代码 # 如果条件不成立 当前的元素 直接舍弃 print(res) # ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']
五、字典生成式
字典表达式:将满足条件的值组成键值对的形式放在一个字典中,生成一个新的列表。
基本形式:基本形式:res = {满足条件的元素组成的健值对 for i,j in 容器类型的数据类型 if 条件判断}
l1 = ['name','password','hobby'] l2 = ['jason','123','DBJ','egon'] d = {j:l2[i] for i,j in enumerate(l1)} print(d) # {'name': 'jason', 'password': '123', 'hobby': 'DBJ'}
六、匿名函数
res = (lambda x,y:x+y)(1,2) print(res) # 3
匿名函数一般和内置函数一起使用
七、常用的内置函数
# map zip filter sorted reduce # map 映射 l = [1,2,3,4,5,6] print(list(map(lambda x:x+5,l))) # [6, 7, 8, 9, 10, 11] 基于for循环 # zip 拉链 # 基于for循环 l1 = [1,2,] l2 = ['jason','egon','tank'] l3 = ['a','b','c'] print(list(zip(l1,l2,l3))) # [(1, 'jason', 'a'), (2, 'egon', 'b')] # 当zip中的容器类型的元素个数不相同时,得到的结果的元素的个数为最少元素的容器类型数据的元素个数 l = [1,2,3,4,5,6] print(list(filter(lambda x:x != 3,l))) # [1, 2, 4, 5, 6] 基于for循环 # 按照条件过滤掉不满足条件的元素,返回满足条件的元素 l = ['jason','egon','nick','tank'] print(sorted(l,reverse=True)) # ['tank', 'nick', 'jason', 'egon'] # 当l中的元素是字符串的时候,比较每个字符串的首字符的ascii码值 # 当l中元素都是数字时,按照数字的大小做比较 # 当reverse的值为True时为从左往右,从小到大 # 当reverse的值为False时为从左往右,从大到小 from functools import reduce l = [1,2,3,4,5,6] print(reduce(lambda x,y:x+y,l,19)) # 40 # 19初始值,每次取一个参数做加法运算,算出所有数的和 # 当初始值不存在的情况下 按照下面的规律 # 第一次先获取两个元素 相加 # 之后每次获取一个与上一次相加的结果再相加