标签:字典 必须 app 一个 nbsp 函数 style 场景 就会
1.什么是函数递归。
函数在调用阶段直接或间接的又调用自身
2.怎么用递归
例子:
直接递归:
def func(n): print(‘from func‘,n) func(n+1) func(1)
补充:
import sys sys.setrecursionlimit(2000)#能够让递归深度变得更大
递归深度一般为 997 或者 998 之间
间接递归:
def index(): print(‘from index‘) login() def login(): print(‘from index‘) index() login()
函数递归,跟使用for 循环 ,while 循环有些形式上差不多,但是递归能做一些循环语句做不了的事情
有一个重要的一点:函数递归,每次调用自身都会在内存空间开辟出一个额外的内存空间,因此当函数无限制的递归下去,就会非常的浪费内存。而for,while循环时,他们的无限循环仅仅在自身开辟出的空间里执行,不会浪费非常多的空间。因此函数递归就会有递归深度限制出现,防止内存爆炸。
递归分为两个阶段
1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降,直到有一个最终的结束条件
2.递推:一次次往回推到的过程
下面举两个具体的例子:
一:知道第一个人的年龄为18,每一个人是比前一个人年龄大两岁,用递归写出第五个人的年龄:
def age(n) if n == 1: #必须要有结束条件 return 18 return age(n-1) + 2 res = age(5) print(res)
二:l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]
将列表中的数字依次打印出来(循环的层数是你必须要考虑的点)
def get_num(l): for i in l: if type(i) is int : print(i) else: return get_num(i) get_num(l)
def fun(l): print(l[0]) if len(l) > 1: fun(l[1]
现在有一个列表 l = [1,3,5,12,57,89,101,123,146,167,179,189,345]
我想找出其中有没有189这个数,我们会怎么做。
1.循环判断
for i in l: if i == 189: print(‘find it‘)
那么如果这个列表特别长,而且我要判断的数在最后面,那我们是不是要把这个列表所有数都要遍历一遍这样太浪费时间了。那么为了节省时间我们就可以用二分查找算法来做。
首先:二分查找算法有个特定的要求 , 查找的内容必须是有顺序的
target_num = 189 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)
三元表达式固定的表达式格式
值1 if条件 else 值2
条件成立 值1
条件不成立 值2
1.普通写法:
def my_max(x,y): if x > y: return x else: return y
2.三元表达式写法:
res = x if x > y else y
三元表达式的应用场景只推荐只有两种的情况的可能下
现在有一个列表 l =[‘tank‘,‘nick‘,‘oscar‘,‘sean‘] 在列表中每个元素的后面加上_sb
l1 = [] for name in l: l1.append(‘%s_sb‘5name) print(l1)
列表生成式的写法:
res = [‘%s_sb‘%name for name in l] print(res)
若现在有列表l = [‘tank_sb‘, ‘nick_sb‘, ‘oscar_sb‘, ‘sean_sb‘,‘jason_NB‘],取出元素后有_sb的元素
res = [name for name in l if name.endswith(‘_sb‘)]
l1 = [‘name‘,‘password‘,‘hobby‘] l2 = [‘jason‘,‘123‘,‘DBJ‘] dic = {l1[i]:l2[i] for i in range(len(l1))} print(dic) #{‘name‘: ‘jason‘, ‘password‘: ‘123‘, ‘hobby‘: ‘DBJ‘}
见名思意就是没有名字的函数,其特点:l临时存在用完就没了
def my_sum(x,y): return x+y #匿名函数写法 res = (lambda x,y:x+y)
匿名函数中 :左边的相当于函数的形参
:右边的相当于函数的返回值
匿名函数通常不会单独使用,是配合内置函数一起使用
标签:字典 必须 app 一个 nbsp 函数 style 场景 就会
原文地址:https://www.cnblogs.com/s686zhou/p/11176296.html