递归函数与生成式

mac2022-06-30  72

1.函数递归 # 函数在调用阶段直接或间接的又调用自身# import sys# print(sys.getrecursionlimit()) # 不是很精确 默认1000左右递归次数限制 一般为997或998# sys.setrecursionlimit(2000) # 指定次数

# 函数不应该无限制的递归下去

# 递归"""递归分为两个阶段 1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降 直到有一个最终的结束条件 2.递推:一次次往回推导的过程"""

# 第一个人年龄为18其后依次加2 求取第5个人的年龄# 递归函数# def age(n):# if n == 1: # 必须要有结束条件# return 18# return age(n-1) + 2# res = age(5)# print(res)

# def index(): # pass # 第一种顶替方式(推荐使用pass) # ... # 第二种顶替方式# index()

# 递归函数不要考虑循环的次数 只需要把握结束的条件即可

2.算法之二分法# 算法:解决问题的高效率的方法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 = 666def get_num(l,target_num): if not l: # 处理不能无限切分列表的bug 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) # elif target_num == l[middle_index]: # print('find it',target_num) 此为最后一种情况等同于下面else代码 # 一般情况下尽量多用elif穷举出所有的情况 else: print('find it',target_num)

get_num(l,target_num)

3.三元表达式"""三元表达式固定表达式 值1 if 条件 else 值2 条件成立 值1 条件不成立 值2"""方法一def my_max(x,y): if x > y: return x else: return y

方案二res = x if x > y else y # 三元 1元为值x 2元为if条件 3元为else条件

4.列表生成式# l = ['tank','nick','oscar','sean']# l1 = []# for name in l:# l1.append('%s_sb'%name)# # l1.append(name + '_sb') # 不推荐使用# print(l1)

l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB']# 列表生成式# res = ['%s_DSB'%name for name in l]# print(res)

res = [name for name in l if name.endswith('_sb')] # 后面不支持再加else的情况# 先for循环依次取出列表里面的每一个元素# 然后交由if判断 条件成立才会交给for前面的代码# 如果条件不成立 当前的元素 直接舍弃

print(res)

5.字典生成式# l1 = ['name','password','hobby']# l2 = ['jason','123','DBJ','egon']## d = {}# for i,j in enumerate(l1):# enumerate 枚举# d[j] = l2[i]# print(d)

## l1 = ['jason','123','read']# d = {i:j for i,j in enumerate(l1) if j != '123'}# print(d)

res = {i for i in range(10) if i != 4}print(res)res1 = (i for i in range(10) if i != 4) # 这样写不是元组生成式 而是生成器表达式# print(res1)# for i in res1:# print(i)

6.匿名函数 lambda"""没有名字的函数

匿名函数的特点 临时存在用完就没了"""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))

 

# :左边的相当于函数的形参# :右边的相当于函数的返回值# 匿名函数通常不会单独使用,是配合内置函数一起使用

7.常用内置函数# l = [1,2,3,4,5]# print(max(l)) # 内部是基于for循环的### """# A-Z 65 90# a-z 97 122 # 二进制转换10进制后对应ascll码# """# print(chr(97))# d = {# 'egon':30000,# 'jason':88888888888,# 'nick':3000,# 'tank':1000# }# def index(name):# return d[name]

# print(max(d,key=lambda name:d[name]))# 比较薪资 返回人名# print(min(d,key=lambda name:d[name]))

# 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)))

# l = [1,2,3,4,5,6]# print(list(filter(lambda x:x != 3,l))) # 基于for循环

 

# l = ['jason','egon','nick','tank']# print(sorted(l,reverse=True))

转载于:https://www.cnblogs.com/night-rain/p/11192360.html

最新回复(0)