内容概要
- 递归函数
- 算法之二分法
- 三元表达式
- 列表生成器
- 字典生成器
- 枚举
- 匿名函数
内容详细
一、递归函数
'''递归:函数在运行的过程中,直接或者间接调用了自身'''
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 get_age(n):
if n == 1:
return 18
return get_age(n - 1) + 2
print(get_age(5)) # 26
# 打印列表里的所有数字
l = [1, [2, [3, [4, [5, [6, [7, [8, [9, ]]]]]]]]]
# 1、循环列表里面的值,如果是数字则打印,不是数字则再次循环
# 2、注意这是个重复循环,而且每次循环的对象都不一样,所以用函数
# 3、当for循环循环一个空列表的时候会自动正常结束,相当于递归函数的结束条件
def get_int(l):
for i in l:
if type(i) is int:
print(i)
else:
get_int(i)
get_int(l)
# 官网表示:python默认的最大递归深度为1000次
# import sys
# print(sys.getrecursionlimit())
# print(sys.setrecursionlimit(2000))
二、算法之二分法
# 什么是算法?
解决问题的高效方法
# 在一个元素极多的有序列表里面判断一个数字是否存在
# 正常做法,for循环整个列表,比对数字,知道找到为止,但如果数据太庞大,会导致代码运行过久
# 使用二分法,利用索引找到列表中间的数字,与要找的数字比对大小,如果小了,目标数字则在中间数字的右边,切片获取右边的列表元素,再次用中间值比对,依次类推,知道找到目标数字
list1 = [1, 3, 4, 5, 6, 7, 8, 9, 11, 22, 24, 35, 55, 66, 77, 88, 99, 100, 233, 566, 788, 888]
def get_num(target_number, list):
index = len(list) // 2
if list1[index] > target_number:
l_left = list1[:index] # 注意这里是取mid_num中间数的索引值
get_num(target_number, l_left)
elif list1[index] < target_number:
l_right = list1[index + 1:]
get_num(target_number, l_right)
else:
print('找到了', target_number)
get_num(7, list1)
'''
二分法的缺陷:如果要查找的元素在开头,那么还没有依次查找的效率高
'''
三、三元表达式
# 当一段代码的输出只有两种结果的时候可以用三元表达式精简代码
def func(a, b):
if a > b:
print(a)
else:
print(b)
def func1(a, b):
print(a if a > b else b)
func1(5, 8) # 8
'''
条件成立采用if前面的值 if 条件 else 条件不成立采用else后面的值
'''
四、列表生成式
# 为列表中的每个字符串加上'_DSB'
list = ['elijah', 'jason', 'kevin', 'tony']
# list1['%s_DSB' % i for i in list if i != 'jason'] # 错误示范
res = ['%s_DSB' % i for i in list] # 注意不要用错列表生成器的赋值方式
print(res) # ['elijah_DSB', 'jason_DSB', 'kevin_DSB', 'tony_DSB']
# 在生成的过程中去掉jason
res1 = [f'{i}_DSB' for i in list if i != 'jason'] # if 后的语句如果条件成立则添加进列表
print(res1) # ['elijah_DSB', 'kevin_DSB', 'tony_DSB']
五、枚举
# enumerate
list = ['elijah', 'switch', 'zelda']
# enumerate(list) --> [(0, 'elijah'), (1, 'switch'), (2, 'zelda')]
for i, j in enumerate(list):
print(i, j)
'''
enumerate(list)
针对该方法使用for循环取值,每次会产生两个结果
第一个是从0开始的数字
第二个是被循环对象里面的元素
还可以通过start来控制起始位置
'''
六、字典生成器
# 把下面两个列表生成一个字典
list1 = ['elijah', 'switch', 'zelda']
list2 = [2000000, 4500, 500]
res = {j: list2[i] for i, j in enumerate(list1)}
print(res)
七、匿名函数
# 匿名函数关键字 lambda
'''
语法格式
lambda 形参:返回值
'''
lambda x(形参):x**2(返回值)
# 使用
print((lambda x:x**2)(8)) # 64
# 或者把匿名函数赋值给一个变量名
res = lambda x:x**2
res(3)
# 匿名函数一般只是配合其他函数一起使用,没有函数名
# map() 映射
list1 = [1, 3, 4, 5, 6, 7]
print(map(lambda x: x ** 2, list1)) # <map object at 0x00000265145DA588>
print(list(map(lambda x: x ** 2, list1))) # [1, 9, 16, 25, 36, 49]