python2.082 函数的递归调用 +匿名函数 +三元表达式

递归调用

引入 (函数的递归调用)

调用一个函数的过程中,直接或者间接的调用自己

直接调用
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

posted @ 2022-01-24 08:50  mmszxc  阅读(54)  评论(0)    收藏  举报