一、函数的递归
1、定义: 函数在调用阶段直接或间接的又调用自身
2、形式
def func(n): # print('from func',n) # func(n+1) # # func(1)
#可以返回998行
3、import sys 模块
获取的递归的限制不是很精确
import sys # print(sys.getrecursionlimit()) # 不是很精确
还可以通过 sys.setrecursionlimit(2000)
来修改递归的次数,但是这样是没有意义的,不应该无限制的递归下去
4、递归的应用场景
分为另两个阶段
1、回溯:就是一次次重复的过程,但是这个重复的过程建立在每一个重复 问题的复杂程度应该下降,直到有一个最终的结束条件
2、递推:一次次往回推导的过程
5、应用
1、猜年龄游戏
‘’’
age(5) = age(4) + 2 age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 18
‘’’
# 已知age(1),求age(5),由上式,可以总结出 当 n >1时 age(n) = age(n-1)+2
当n= 1时 age(1)= 18
#代码
def age(n):
if n == 1: # 必须要有结束条件
return 18
return age(n-1) + 2
res = age(5)
print(res)
#
2、将列表的数字打印出来
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13]]]]]]]]]]]]] #将列表中的数字依次答应出来
#第一种方式 用for 循环可以写,但是如果层数太多的话 代码就会冗余。
for i in l: 推导思路
if type(i) is int:
print(i)
else:
for item in i:
if type(item) is int:
print(item)
else:
for j in item:
if type(item) is int:
print(item)
else:
...
#第二种方式,用递归函数写
def get_num(l):
for i in l:
if type(i) is int:
print(i)
else:
get_num(i)
# get_num(l)
l1 = []
for i in l1:
print(i)
#递归函数不要考虑循环的次数 只需要把握结束的条件即可
3、算法之二分法
算法的定义:解决问题的高效率的方法
二分法的定义:就是先找到容器类型中的中间值,然后拿需要比的值和中间值比较。大于中间值就选右边,小于就取左边。然后继续取中间值,直到取到为止。且容器类型里面的数字必须有大小顺序。
l = [1,3,5,12,57,89,101,123,146,167,179,189,345] target_num = 666 def get_num(l,target_num): if not l: 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) else: print('find it',target_num) get_num(l,target_num)
四、三元表达式
应用场景 :
当某个条件成立做一件事情,不成立做另一件事情。
形式
x = 99999 y = 9898898 res = x if x > y else y # 如果if后面的条件成立返回if前面的值 否则返回else后面的值
print(res)
固定格式:
值1 if 条件 else 值2
条件成立 值1
条件不成立 值2
使用规范
三元表达式的应用场景只推荐只有两种的情况的可能下,因为写太多就不容易看清楚
五、列表生成式
l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB'] # 列表生成式
res = [name for name in l if name.endswith('_sb')] # 后面不支持再加else的情况
# 先for循环依次取出列表里面的每一个元素
# 然后交由if判断 条件成立才会交给for前面的代码
# 如果条件不成立 当前的元素 直接舍弃
六、字典生成式
和列表生成式差不多,就是把中括号改成大括号
res = {i for i in range(10) if i != 4} print(res) res1 = (i for i in range(10) if i != 4) # 这样写不是元组生成式 而是生成器表达式
七、匿名函数
定义:没有名字的函数
特点:临时存在用完就没了
关键字: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)) # :左边的相当于函数的形参 # :右边的相当于函数的返回值 # 匿名函数通常不会单独使用,是配合内置函数一起使用
八、常用的内置函数
max map zip
max 求最大值
map 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
zip 将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
filter 用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。