python入门day16——函数的递归调用、二分法、三元表达式、匿名函数

函数的递归调用

       函数的递归调用:就是在调用一个函数的过程中又直接或间接地调用自己

示例1:直接调用自己
def foo():
    print('hello')
    foo()
foo()

示例:间接调用自己
def bar():
    print('from bar')
    foo()
def foo():
    print('from foo')
    bar()
foo()

       为何死递归会抛出异常???
       因为无限的递归会导致内存溢出,所以python设定了最大的递归层数
       所以:不应该无限递归调用下去,应该在满足某种条件下结束递归调用,然后返回

import sys
# print(sys.getrecursionlimit())  # 默认无限递归限制1000次 ,因为占内存,一种保护机制
# print(sys.setrecursionlimit(2000))

递归调用应该分为两个阶段

       1、回溯(挖井) :一层一层地递归调用下去
       2、递推(从井里往外跳):在满足某一条件的情况下结束回溯,然后开始向上一层层返回

# salary(5) = salary(4) + 10         丨向
# salary(4) = salary(3) + 10         丨下
# salary(3) = salary(2) + 10         丨挖
# salary(2) = salary(1) + 10         丨回
# salary(1) = 18                     ↓溯
#
# n=1 salary(n) = 18								递
# n!= salary(n) = salary(n-1)+10    推


def salary(n):
    if n == 1:
        return 18
    return salary(n-1)+10
res = salary(5)
print(res)

应用:列表中取值不取列表

nums=[111,[222,[333,[444,[555,[666,[777]]]]]]]

def func(l):
    for x in l:
        if type(x) is list:
            # 把自身的代码重新再调用一次
            func(x)  # 第二层列表开始运行func()
        else:
            print(x,end=',')  #比如第一次x是111 所以输出 第二次是[222,33……)列表 所以进行if语句
func(nums)
# 111,222,333,444,555,666,777,

二分法

       从小到大排列的一个数字列表,需要从该数字列表中找到我们想要的那个一个数字

nums=[-3,4,7,10,13,21,43,77,89,111,123,222,234,333]
find_num=21
def binary_search(find_num,l):
    print(l)
    if len(l) == 0:
        print('找的值不存在')
        return
    mid_index=len(l) // 2  # 去中间索引值

    if find_num > l[mid_index]:
        # 接下来的查找应该是在列表的右半部分
        l=l[mid_index+1:]  # 排除左边内容 取右半部分
        binary_search(find_num,l)  # 重新执行binary_search()函数
    elif find_num < l[mid_index]:
        # 接下来的查找应该是在列表的左半部分
        l=l[:mid_index]  # 排除右边内容  取左半部分
        binary_search(find_num,l)
    else:
        print('find it')

binary_search(find_num,nums)
# [-3, 4, 7, 10, 13, 21, 43]
# [13, 21, 43]
# find it

binary_search(55,nums)
# [-3, 4, 7, 10, 13, 21, 43, 77, 89, 111, 123, 222, 234, 333]
# [-3, 4, 7, 10, 13, 21, 43]
# [13, 21, 43]
# [43]
# []
# 找的值不存在

三元表达式

       return x if x > y else y # 上面的多行 一行代码就能实现
       三元表达式:表达式1 if 条件 else 表达式2
       语法格式: 条件成立时要返回的值 if 条件 else 条件不成立时要返回的值

def max2(x,y):
    if x>y:
        return x
    else:
        return y
res = max2(111,222)
print(res)

# 上面的多行 一行代码就能实现
x = 111
y =222
res = x if x>y else y
print(res)

匿名函数

       def用于定义有名函数
       匿名函数即没有名字的函数

res=(lambda x,y:x+y)(1,2)
print(res)

       在{}内用逗号分隔开多个key:value,其中value可以是任意类型, 而key必须是不可变的类型,通常是字符串类型

# 调用匿名函数
# 方式一:
res=(lambda x,y:x+y)(1,2)
print(res)

# 方式二:
func=lambda x,y:x+y
res=func(1,2)
print(res)

       匿名用于临时调用一次的场景:更多的是将匿名与其他函数配合使用

# 匿名用于临时调用一次的场景:更多的是将匿名与其他函数配合使用
# from functools import reduce
# res=reduce(lambda x,y:x+y,[1,2,3],10) # 16
# print(res)
#
# res=reduce(lambda x,y:x+y,['a','b','c']) # 'a','b'
# print(res)


salaries = {
    'egon':4.4,
    'lqz':3.3,
    'yj':2.2
}

print(max([11,22,33]))
print(max(salaries))  # yj  比较的是salaries的key

def func(k):
    return salaries[k]
print(max(salaries,key=func))  # egon  比较的是薪资 返回的是薪资对应的人名


# 简化成匿名
print(max(salaries,key=lambda k:salaries[k]))
print(min(salaries,key=lambda k:salaries[k]))
# 比较salaries字典  key里的k指的是salaries的没一个key值
# 所以比较依据是每个key对应的value值的话 是salaries[k]来比较


list_info = [{'name': 'egon', 'sex': 'male', 'age': '18', 'salary': '3000'},
{'name': 'alex', 'sex': 'male', 'age': '38', 'salary': '30000'},
{'name': 'wupeiqi', 'sex': 'female', 'age': '28', 'salary': '20000'},
{'name': 'yuanhao', 'sex': 'female', 'age': '28', 'salary': '10000'}]
print(max(list_info, key=lambda l: l['salary']))
# 比较list_info列表, key里的l指的是list_info的每一行列表值
# 所以比较依据是salary的话 是每一行列表l['salary']来比较

# 根据薪资排序
print(sorted(salaries,key=lambda k:salaries[k],reverse=True))
# ['egon', 'lqz', 'yj']



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值