八、函数的递归调用
一、 什么是函数递归调用
函数的递归调用是函数嵌套调用的一种特殊形式,在调用一个函数的过程中又直接或者间接地调用该函数
本身,称之为函数的递归调用
递归调用必须有两个明确的阶段:
1. 回溯: 一次次递归调用下去,说白了就一个重复的过程,但需要注意的是每一次重复问题的规模都应该有所减少,直到逼近一个最终的结果,即回溯阶段一定要有一个明确的结束条件
2. 递推: 往回一层一层推算出结果
importsysprint(sys.getrecursionlimit())sys.setrecursionlimit(2048)
deffoo(n):print('fromfoo',n)foo(n+1)foo(0)
defbar():print('frombar')foo()deffoo():print('fromfoo')bar()foo()
age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=18age(n)=age(n-1)+2#n>1age(n)=18#n=1
# 递归调用就是一个重复的过程,但是每一次重复问题的规模都应该有所减少,并且应该在满足某种条件的情况下结束重复,开始进入递推阶段
defage(n):ifn==1:return10returnage(n-1)+2print(age(5))-------------------------------------------18
l=[1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,]]]]]]]]]]]defsearch(l):foriteminl:iftype(item)isnotlist:#不是列表直接打印print(item)else:#判断是列表则继续循环,判断...search(item)search(l)----------------------------------------------------------1234567891011
算法:是如何高效率地解决某一个问题的方法/套路
# 二分法
nums=[13,15,17,23,31,53,74,81,93,102,103,201,303,403,503,777]find_num=503defbinary_search(nums,find_num):print(nums)iflen(nums)==0:print('notexists')returnmid_index=len(nums)//2iffind_num>nums[mid_index]:#intherightnums=nums[mid_index+1:]#切一半#重新执行二分的逻辑binary_search(nums,find_num)eliffind_num<nums[mid_index]:#intheleftnums=nums[0:mid_index]#重新执行二分的逻辑binary_search(nums,find_num)else:print('findit')#binary_search(nums,find_num)binary_search(nums,94)--------------------------------------------------------------------[13,15,17,23,31,53,74,81,93,102,103,201,303,403,503,777][102,103,201,303,403,503,777][102,103,201][102][]notexists
#####################################################################
l=[0,1,2,3,4,5,6,7,8,9]defsearch(l,num):print(l)iflen(l)==0:print("not")returnmy_index=len(l)//2#10/2=5##//地板除,取整数ifnum>l[my_index]:l=l[my_index+1:]#5+1search(l,num)elifnum<l[my_index]:l=l[0:my_index]search(l,num)else:print("findit")search(l,3)---------------------------------------------------------------------------------------------------------------[0,1,2,3,4,5,6,7,8,9][0,1,2,3,4][3,4][3]findit
二、三元表达式
defmax2(x,y):#ifx>y:#returnx#else:#returnyreturnxifx>yelsey#三元表达式实现的效果就是:条件成立的情况下返回一个值,不成立的情况下返回另外一种值#res=条件成立情况下返回的值if条件else条件不成立情况下返回的值name=input('yourname:').strip()res="SB"ifname=='lqz'else"NB"print(res)
三、列表生成式、字典生成式
names=['alex','lqz','yyh','fm']l=[]fornameinnames:res=name+'_DSB'l.append(res)print(l)l=[name+'_DSB'fornameinnames]print(l)---------------------------------------------------['alex_DSB','lqz_DSB','yyh_DSB','fm_DSB']['alex_DSB','lqz_DSB','yyh_DSB','fm_DSB']
names=['alex_sb','lqz_sb','yyh_sb','fm_sb','egon']l=[]fornameinnames:ifname.endswith('sb'):l.append(name)print(l)l=[namefornameinnamesifname.endswith('sb')]print(l)--------------------------------------------------------['alex_sb','lqz_sb','yyh_sb','fm_sb']['alex_sb','lqz_sb','yyh_sb','fm_sb']
items=[('name','egon'),('age',18),('sex','male'),]dic=dict(items)print(dic)------------------------------------{'name':'egon','age':18,'sex':'male'}
# 补充
l=['a','b','c','d']fori,vinenumerate(l):print(i,v)-------------------------------------------0a1b2c3d
keys=['name','age','sex']vals=['egon',18,'male']dic={}fori,kinenumerate(keys):#print(i,k)dic[k]=vals[i]print(dic)dic={k:vals[i]fori,kinenumerate(keys)}print(dic)dic={k:vals[i]fori,kinenumerate(keys)ifi>0}print(dic)----------------------------------------------------------{'name':'egon','age':18,'sex':'male'}{'name':'egon','age':18,'sex':'male'}{'age':18,'sex':'male'}
print({i:iforiinrange(10)})print({iforiinrange(10)})print({iforiin'hello'})-------------------------------------------{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}{0,1,2,3,4,5,6,7,8,9}{'l','h','o','e'}
四、匿名函数
1 匿名函数:就是没有名字的函数
2 为何要用:
用于仅仅临时使用一次的场景,没有重复使用的需求
defsum2(x,y):returnx+yprint(lambdax,y:x+y)print((lambdax,y:x+y)(1,2))---------------------------------------<function<lambda>at0x0000022BFE155510>3
# 匿名函数的精髓就是没有名字,为其绑定名字是没有意义的
f=lambdax,y:x+yprint(f)print(f(1,2))--------------------------------------<function<lambda>at0x000002E84DFB2EA0>3
# 匿名函数与内置函数结合使用
# max,min,sorted,map,filter,reduce
salaries={'egon':300000,'alex':100000000,'wupeiqi':10000,'yuanhao':2000}#求薪资最高的那个人名:即比较的是value,但取结果是keyres=max(salaries)print(res)-----------------------------------------------------------yuanhao
# 可以通过max函数的key参数来改变max函数的比较依据,运行原理:
# max函数会“for循环”出一个值,然后将该值传给key指定的函数
# 调用key指定的函数,将拿到的返回值当作比较依据
salaries={'egon':300000,'alex':100000000,'wupeiqi':10000,'yuanhao':2000}deffunc(name):#返回一个人的薪资returnsalaries[name]res=max(salaries,key=func)#'egon'print(res)------------------------------------------------------alex
d={"a":1,"b":2,'c':3}print(max(d))deffunc(k):returnd[k]print(func("a"))#函数根据key取对应的valueres=max(d,key=func)print(res)#匿名函数写法print(max(d,key=lambdas:d[s]))--------------------------------------------c1cc
# 求最大值
salaries={'egon':300000,'alex':100000000,'wupeiqi':10000,'yuanhao':2000}res=max(salaries,key=lambdaname:salaries[name])#'egon'print(res)-----------------------------------------------------alex
# 求最小值
salaries={'egon':300000,'alex':100000000,'wupeiqi':10000,'yuanhao':2000}res=min(salaries,key=lambdaname:salaries[name])#'egon'print(res)-------------------------------------------------------yuanhao
# sorted排序
nums=[11,33,22,9,31]res=sorted(nums,reverse=True)print(nums)print(res)salaries={'egon':300000,'alex':100000000,'wupeiqi':10000,'yuanhao':2000}forvinsalaries.values():print(v)res=sorted(salaries.values())print(res)res=sorted(salaries,key=lambdaname:salaries[name],reverse=True)print(res)------------------------------------------------------------------------[11,33,22,9,31][33,31,22,11,9]300000100000000100002000[2000,10000,300000,100000000]['alex','egon','wupeiqi','yuanhao']
map:把一个列表按照我们自定义的映射规则映射成一个新的列表
names=['alex','lxx','wxx','yxx']res=map(lambdaname:name+"dSB",names)print(list(res))----------------------------------------------['alexdSB','lxxdSB','wxxdSB','yxxdSB']
filter: 从一个列表中过滤出符合我们过滤规则的值
运行原理:相当于for循环取出每一个人名,然后传给匿名函数,将调用匿名函数返回值为True的那个人名给留下来
names=['alex_sb','lxx_sb','wxx_sb','egon','yxx']res=filter(lambdaname:name.endswith('sb'),names)print(list(res))print([namefornameinnamesifname.endswith('sb')])------------------------------------------------------------['alex_sb','lxx_sb','wxx_sb']['alex_sb','lxx_sb','wxx_sb']
# reduce: 把多个值合并成一个结果
fromfunctoolsimportreducel=['a','b','c','d']res=reduce(lambdax,y:x+y,l,'A')#'A','a'=>'Aa'#'Aa','b'=>'Aab'#'Aab','c'=>'Aabc'#'Aabc','d'=>'Aabcd'print(res)---------------------------------------Aabcd
------------------------------------------------------------------------------------------------------------------------------
fromfunctoolsimportreducel=['a','b','c','d']res=reduce(lambdax,y:x+y,l)#'a','b'=>'ab'print(res)res=reduce(lambdax,y:x+y,range(1,101))#1,2=>3#3,3=>6print(res)----------------------------------------------------------------------------abcd5050
作业:
作业:1使用递归打印斐波那契数列(前两个数的和得到第三个数,如:0112347...)2一个嵌套很多层的列表,如l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]],用递归取出所有的值3编写用户登录装饰器,在登录成功后无需重新登录,同一账号重复输错三次密码则锁定5分钟4、求文件a.txt中总共包含的字符个数?思考为何在第一次之后的n次sum求和得到的结果为0?(需要使用sum函数)5、文件shopping.txt内容如下mac,20000,3lenovo,3000,10tesla,1000000,10chicken,200,1求总共花了多少钱?打印出所有商品的信息,格式为[{'name':'xxx','price':333,'count':3},...]求单价大于10000的商品信息,格式同上明日默写:二分查找
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。