递归调用
引入 (函数的递归调用)
调用一个函数的过程中,直接或者间接的调用自己
直接调用
def foo():
print('1111')
foo()
foo()
死递归直接报错 , 但是while 死循环不会抛出异常???
间接调用自己
def bar():
print('bar')
foo()
def foo():
print('foo')
bar()
foo()
每一次函数的调用在循环过程中,上一次的函数没有运行结束,那么再次调用的时候,又要申请内存空间放名称空间,
所以如果不加以限制,那么申请的名称空间也会无限的申请下去,最后造成内存的溢出,为了防止内存的溢出,设置了递归的最大层1000层。
如何验证一下 最大层数
set 设置层数
import sys
#
# res = sys.getrecursionlimit()
res = sys.setrecursionlimit(2000)
# print(res)
递归 :想象成 挖井的概念 ,一层一层的挖,必须在1000次之前满足条件,跳出递归,不应该无限递归下去。
二 函数的递归调用
递归调用分为2个阶段
挖井的阶段 --> 回溯
返回的阶段 --> 递推 : 满足回溯条件的情况下,回退的过程
需求: A的年龄是多少,A说 A的年龄比B 大10岁, B的年龄比C大10岁,C的年龄是10岁。 A的年龄是多少
def salary(n):
if n == 1:
return 18
return salary(n - 1) + 10
res = salary(5)
print(res)
递归的实际使用, 不知道这件事调用多少次,但是知道符合条件后会停止。
nums = [1111,[22222,[33333,[44444,[55555,[66666]]]]]]
def func(l):
for x in l:
if type(x) is list: # 根据数据的类型,或者状态进行区分判断
func(x)
else:
print(x)
func(nums)
nums = [i for i in range(20)]
print(nums)
nums = [ 0,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
def func(list_name,find_number):
if len(list_name)==0:
print('not find ')
return
# print(list_name)
res = len(list_name)//2 # 地板除
print(res)
if find_number > list_name[res]:
rhiht_list= list_name[res+1:] # 列表的切片 右侧 中间值已经比过了,所以索引往后移一位
func(rhiht_list,find_number)
elif find_number <list_name[res]:
left_list = list_name[:res] # 列表的切片 左侧 根据列表的顾头不顾尾特性,最后一个值会丢弃,所以不需要额外的往前移一位
func(left_list,find_number)
elif find_number == list_name[res]: # 取中间的值,判断是否相等,
print('找到了')
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
10
[11, 12, 13, 14, 15, 16, 17, 18, 19]
4
[16, 17, 18, 19]
2
[19]
0
func(nums,20)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 20
10
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5
[0, 1, 2, 3, 4]
2
[0, 1]
1
[0]
0
找到了
匿名函数
匿名函数 只能用一次
临时用一次的场景
res = (lambda x,y:x+y)(1,3)
print(res)
跟其他函数进行配合使用
需求: 有 张三,李四,王五三人,每人的月薪分别是 10000 20000 30000
打印 薪资最高的人名,打印 薪资最低的人名,薪资从低到高排序
正常做法是
salaries = {
'zhangsan':1000,
'lisi':2000,
'wangwu':3000,
}
for i in salaries:
# print(i)
print(i,salaries[i])
可以使用函数递归的方式依次对比
取第一个k的vlue 和第二个K的vlue 对比,大的数继续和第三个数对比,return 最大的数
print(max(salaries,key=lambda k : salaries[k] )) # 最大值
白话:使用max 把salaries的值 迭代出来2列或者N列,end 指定要比较的列数,max比完后,把vlue所代表的k名字 返回出去
严谨: max把迭代出来的元素作为参数传给key,key根据参数k,取出vlue,作为比较的值
print(min(salaries,key=lambda k : salaries[k] )) # 最大值
print(sorted(salaries,key=lambda k : salaries[k],reverse=True )) # 从小到大值
sorted 参数reverse 是反转的意思 默认从小到大,== True 是从大到小
三元表达式
三元表达式
替代的格式
例子判断
def max(a, b):
if a > b:
return a
else:
return b
res = max(1, 2)
print(res)
# 简写
a = 1
b = 2
res = a if a > b else b