递归函数、算法、生成器
目录
- 递归函数、算法、生成器
- 递归函数
- 算法
- 算法之二分法
- 三元表达式
- 列表生成式
- 字典生成式
递归函数、算法、生成器
递归函数
# 递归 :在函数运行过程中 直接或者间接的调用了自身
官方表示:python默认最大递归深度为1000次
import sys
print(sys.getrecursionlimit()) # 查看递归深度
print(sys.setrecursionlimit(2000)) # 设置递归深度
def func():
print('from func')
index()
def index():
print('from index')
func()
index()
'''
递归
1.递推
一层层往下推到答案(每次递推之后复杂度相较于上一次一定要有所下降)
2.回溯
依据最后的结论往后推导出最初需要的答案
故:递归一定要有结束条件!
'''
eg: 第一个人员年龄不确定往后人员比前一个人员大2岁 最后一名人员18岁 计算出最初人员的年龄
def get_age(n):
if n == 1:
return 18
return get_age(n - 1) + 2
print(get_age(5))
逻辑:
# age(5) = age(4) + 2
# age(4) = age(3) + 2
# age(3) = age(2) + 2
# age(2) = age(1) + 2
# age(1) = 18
eg2:
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]]
# 打印出列表中每一个元素(列表除外)
# 1.循环该列表 获取列表内每一个元素
# 2.判断该元素是否是数字 如果是数字 则直接打印
# 3.如果是列表 则循环该列表 获取列表内每一个元素
# 4.判断该元素是否是数字 如果是数字 则直接打印
# 5.如果是列表 则循环该列表 获取列表内每一个元素
# 6.判断该元素是否是数字 如果是数字 则直接打印
# 7.如果是列表 则循环该列表 获取列表内每一个元素
def get_num(lis):
for i in lis:
if type(i) is int:
print(i)
else:
# 也是for循环 然后判断
get_num(i)
get_num(l)
# 循环到空列表后 循环自动停止不打印任何东西 所以不需要停止
算法
什么是算法:
解决问题的高效方法
算法之二分法
# 二分法为最入门级别的算发
# 二分法使用场景:数据必须为有序的
l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]
def my_par(get,lis):
if len(lis) == 0:
print('对不起无法找到')
return
# 先获取中间位置的索引值
mid = len(lis) // 2
# 判断中间索引对应的值比目标值大还是小
if get > lis[mid]:
# 说明要找的元素只可能出现在列表的右侧
l_right = lis[mid + 1:] # lis(中间位置索引值 : )
print(l_right)
my_par(get,l_right)
elif get < lis[mid]:
# 说明要找的元素只可能出现在列表的左侧
l_left = lis[:mid]
print(l_left)
my_par(get,l_left)
else:
print('找到了%s'%get)
my_par(222,l)
my_par(222,l) # 找不到 需要添加结束条件
my_par(11,l) # 如果要找的元素在开头 那么还没有依次查找的效率高
三元表达式
def my_max(a,b):
if a > b
return a
else:
return b
# 如果功能需求仅仅是二选一的情况下 那么推荐使用三元表达式
def my_max(a, b):
return a if a>b else b
# 格式:条件成立则采用if前面的值 if 条件 else 条件不成立采用else后面的值
# 三元表达式尽可能不要嵌套使用
res = '对了' if 1 > 2 else '错了'
print(res)
res = '对了' if 1 > 2 else ('又对了' if 2 > 1 else '又错了')
print(res)
eg:
is_free = input('电影是否收费(y/n)>>>>').strip()
if is_free == 'y':
print('收费')
else:
print('免费')
三元表达式:
print('收费' if is_free == 'y' else '免费')
列表生成式
name_list = ['jason', 'kevin', 'tony', 'jerry']
# 实现给列表中每一个元素增加_ddd后缀
'''传统方式'''
1. 定义一个空列表
new_list = []
# for循环旧列表
for i in name_list:
new_name = '%s_ddd'%i
new_list.append(new_name)
print(new_list)
'''列表生成器方法'''
res = ['%s_ddd'% name for name in name_list]
print(res)
字典生成式
# 将两个列表组合成字典的形成表现出来
l1 = ['name', 'age', 'hobby']
l2 = ['jason', 18, 'read']
new_dict = {}
for i in range(len(l1)):
new_dict[l1[i]] = l2[i]
print(new_dict)
# 把l1列表表现出索引加元素值
count = 0
for i in l1:
print(count,i)
count += 1
# 枚举
'''
enumerate(l1)
针对该方法使用for循环取值 每次会产生两个结果
第一个是从0开始
第二个是被循环对象里面的元素
还可以通过start参数控制起始位置
'''
for i, j in enumerate (l1, start=1):
print(i,j)
name_list = ['jason', 'kevin', 'tony', 'jerry']
res = {i: j for i, j in enumerate(name_list) if j != 'jason'}
print(res) # 如果有if判断则先判断 正确才执行for循环
# res1 = {i for i,j in enumerate(name_list)}
# print(res1,type(res1))