python递归,二分法以及生成式
目录
- 递归函数
- 算法之二分法
- 三元表达式
- 列表生成式
- 字典生成式
递归函数
# 递归:在函数运行的过程中,直接或者间接调用了自身
官网表示:python默认最大递归深度为1000次
更改默认设置:
# import sys
# print(sys.getrecursionlimit())
# print(sys.setrecursionlimit(2000))
'''
递归
1.递推:一层一层往下推导答案(每次递归之后复杂度相较于上一次一定要有所下降)
2.回溯:依据最后的结论推导出最初需要的答案
递归一定要有结束条件.
'''
伪代码:可能无法运行,但是可以表述逻辑
# age(5) = age(4) + 2
# age(4) = age(3) + 2
# age(3) = age(2) + 2
# age(2) = age(1) + 2
# age(1) = 18
使用递归推导
def data(n):
if n == 1:
return 18
return data(n - 1) + 2
print(data(5))
再列举:
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]]
将l列表中的数据依次打印出
def data(l):
for i in l:
if type(i) is int:
print(i)
else:
data(i)
data(l)
算法之二分法
什么是算法?
解决问题的搞笑方法
# 二分法(离入门级别的都还有一定的距离)
l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]
'''二分法使用的前提:数据集必须有序'''
l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]
def data(target, l):
if len(l) == 0:
print('取得值不再列表中')
return
centre = len(l) // 2
if target > l[centre]:
right = l[centre + 1:]
print(right)
data(target, right)
elif target < l[centre]:
real_right = l[:centre]
print(real_right)
data(target, real_right)
else:
print('在了', target)
data(321, l )
# 如果要好的元素在开头,效率没有依次查找高
三元表达式
'''当功能需求仅仅是二选一的情况,推荐使用三元表达式'''
# 条件成立采用if前面的值 if 条件 else 条件不成立采用else后面的值
# 值 if 条件 else 值
res = '学习' if 1 < 2 else '周五通宵学python'
print(res)
res = '干饭' if 10 > 2 else ('不管饭' if 2 >5 else '写的啥!')
print(res)
# 实际应该
username = input('username>>>:')
res = 'NB' if username == 'jason' else 'SB'
print(res)
列表生成式
name_list = ['junjie', 'junjie1', 'junjie2']
# 给列表中的人名加上后缀 nb
# 传统做法
new_list = []
for name in name_list:
new_name = '%s_nb' % name
new_list.append(new_name)
print(new_list)
# 列表生成式
res = ['%s_nb' % name for name in name_list]
print(res)
# 1.定义一个空列表
# new_list = []
# # 2.for循环老列表
# for name in name_list:
# # 3.生成新的名字
# if name == 'jason':
# continue
# else:
# new_name = '%s_DSB'%name
# # 4.添加到新的列表中
# new_list.append(new_name)
# print(new_list)
'''列表生成式'''
# res = ['%s_DSB' % name for name in name_list if name != 'jason']
# print(res)
字典生成式
l1 = ['name', 'age', 'hobby']
l2 = ['jason', 18, 'read']
new_dict = {}
new_list = {j: l2[i] for i, j in enumerate(l1)}
print(new_list)
# 将两个列表合并成一个字典.
枚举
'''
enumerate()
针对这个方法使用for循环,每次会产生两个结果
第一个是从0开始的数字
第二个是被循环对象里面的元素
还可以通过start参数控制起始位置
'''
for i, j in enumerate(l1, start=1):
print(i, j)
# eg:
name_list = ['jason', 'kevin', 'tony', 'jerry']
# res = {i: j for i, j in enumerate(name_list) if j != 'jason'}
# print(res)
{1: 'kevin', 2: 'tony', 3: 'jerry'}
溜了溜了