递归函数与生成式
Posted night-rain
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归函数与生成式相关的知识,希望对你有一定的参考价值。
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 = 666
def 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))
以上是关于递归函数与生成式的主要内容,如果未能解决你的问题,请参考以下文章
函数的递归,二分法,三元表达式,列表生成式,字典生成式,匿名函数,内置方法
递归/匿名函数/三元表达式/列表生成式/字典生成式/二分算法