十一、函数递归,算法二分法,三元表达式,列表字典生成式,匿名函数,内置函数
一、函数递归:
函数的递归:函数在调用阶段直接或间接的又调用自身
递归分为两个阶段
1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降
直到有一个最终的结束条件
2.递推:一次次往回推导的过程
3.递归函数在运行过程中一定要有出口,否则会无限循环下去
# 1.求4以内的和: def sum_numbers(num): if num == 1: return 1 return num + sum_numbers(num - 1) # 递归特点:函数内部自己调用自己:必须要有出口 nums = sum_numbers(4) print(nums)
2.求age(1)=18,求age(5) 2 def age(n): 3 if n == 1: # 必须要有结束条件 4 return 18 5 return age(n-1) + 2 6 res = age(5) 7 print(res)
二、算法二分法
先将一个容器类型,分割一半看是否大于或者小于,然后分割出来,进行运算
# 算法:解决问题的高效率的方法 l = [1,3,5,12,57,89,101,123,146,167,179,189,345] # num = 345 # for i in l: # if num == i: # print('find it') # 二分法:容器类型里面的数字必须有大小顺序 target_num = 666 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)
三、三元表达式
如:a=5 ,b =6,比较两个数大小 res = a if a>b else b 等同于 if a>b: print(a) else: print(b)
四、列表生成式
需求:把列表l里面字符串都添加_sb 1. 第一种方法: l = ['tank','nick','oscar','sean'] # l1 = [] # for name in l: # l1.append('%s_sb'%name) # # l1.append(name + '_sb') # 不推荐使用 # print(1) #['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb'] 2.第二种方法: res =[%s_sb %name for name in l ] print(l)
#需求:将尾号有_sb都打印出来 l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB'] res =[name for name in l if endswith("_sb")]
# ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']
五.字典生成式
需求将下面两个列表合成字典 第一种方法: l1 = ['name', 'password', 'hobby'] l2 = ['jason', '123', 'DBJ', 'egon'] d = {} for i, j in enumerate(l1): d[j] = l2[i] # i 是索引编号,j是l1列表所有值,然后添加到字典 print(d)
字典生成式方法: l1 = ['jason','123','read'] d = {i:j for i,j in enumerate(l1) if j != '123'} print(d)
六.匿名函数
# 匿名函数 """没有名字的函数 匿名函数的特点:临时存在用完就没了 """ def my_sum(x,y): return x + y # res = (lambda x,y:x+y)(1,2) # print(res) # func = lambda x,y:x+y # print(func(1,2)) # :左边的相当于函数的形参 # :右边的相当于函数的返回值 # 匿名函数通常不会单独使用,是配合内置函数一起使用,并且只能适合单一函数
七、内置函数
1.max(a,key)通常计算容器类型里面值大小
l = [1,2,3,4,5]
print(max(l)) # 内部是基于for循环的 最大值
d = { 'egon':30000, 'jason':88888888888, 'nick':3000, 'tank':1000 } print(max(d,key=lambda name:d[name])) max(参数,key键) 当输入key是比较的是字典值大小
比较薪资 返回人名
print(min(d,key=lambda name:d[name]))
2.常用内置函数
map zip filter sorted reduce
# 1.map 映射 将某个函数功能逐一添加到容器里面 l = [1,2,3,4,5,6] # print(list('hello')) print(list(map(lambda x:x+5,l))) # 基于for循环
#2. 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')]
3. filter(func,lst)函数用于过滤序列,过滤掉不符合条件的元素,返回一个filter对象。如果需要转换成列表,则可以使用list()来转换 # 需求: 求1-10之间的奇数 lis1t1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # .定义函数求奇数 def func(x): return x % 2 == 1 # .调用filter()函数 result = filter(func, lis1t1) print(list(result))
# [1, 3, 5, 7, 9]
4. reduce(func,lst),其中func必须要有两个参数。每次func计算的结果继续和序列的下一个元素做累积计算。 list1 = [1, 2, 3, 4, 5, 6] # .导入模块 import functools # .定义函数功能 def func(a, b): return a + b result = functools.reduce(func, list1) print(result) # 21
# 5.sorted(self,reverse = True或False) 正常是升序 l = [1,2,3,4,5,6,7] print(sorted(l,reverse=True)# 4.sorted(self,reverse = True或False) 正常是升序 reverse=False 是逆置