一.函数的递归调用
1.函数的递归调用:
就是在调用一个函数的过程中又直接或间接地调用自己
案例1:
def foo():
print('hello')
foo()
foo()
案例2:间接调用自己
def bar():
print('from bar')
foo()
def foo():
print('hello')
foo()
从案例1,2的运行结果来看,这2个案例相当于死递归,会抛出异常:
这是因为无限的递归会导致内存溢出,所以python设定了最大的递归层数
#
(调用时会开辟一个名称空间,死递归会一直开辟名称空间,导致内存溢出,所以抛出异常)
# python 设定了最大的递归层数,可以自己修改
# import sys
# print(sys.getrecursionlimit())
# print(sys.setrecursionlimit(2000))
所以:不应该无限递归调用下去,应该在满足某种条件下结束递归调用,然后返回
2.递归调用应该分为2个阶段
回溯: 一层层地递归调用下去
递归: 在满足某一条件的情况下结束回溯,然后开始向上一层层返回
案例1:
# 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!=1 salary(n) = salary(n-1) + 10
def salary(n):
if n == 1:
return 18
return salary(n-1) + 10
res = salary(5)
print(res)
案例2:
nums=[111,[222,[333,[444,[555,[666,[777,[888]]]]]]]]
def func(l):
for x in l:
if type(x) is list:
func(x)
else:
print(x)
func(nums)
案例3:
# 从小到大排列的一个数字列表
nums=[11,22,33,44,55,60,67,89]
def search_num(l,find_num):
print(l)
if len(l) == 0:
print('数字不存在')
return
mid_index = len(l) // 2
if find_num > l[mid_index]:
new_nums=l[mid_index+1:]
search_num(new_nums,find_num)
elif find_num < l[mid_index]:
new_nums=l[:mid_index]
search_num(new_nums,find_num)
else:
print('找到了')
search_num(nums,33)
二.三元表达式
基本语法:
表达式1 if 条件 else 表达式2
# 普通写法
def max2(x,y):
if x > y:
return x
else:
return y
# 三元表达式改写
x = 111
y = 222
res = x if x > y else y
print(res)
三.匿名函数
匿名函数就是没有名字的函数
特点:没有名字意味着只能用一次,用完之后就是垃圾,所以匿名函数只用于临时使用一次的场景
案例1:
res = (lambda x,y:x+y)(1,2)
print(res)
# 此方式过于鸡肋
f = lambda x,y: x+y
print(f)
f(1,2)
案例2:
salaries={
'egon':4.4,
'lqz':3.3,
'yj':2.2
}
# def func(k):
# return salaries[k]
#
# print(max(salaries,key=func)) # key=func是max函数中规定好的
print(max(salaries,key=lambda k:salaries[k]))
print(min(salaries,key=lambda k:salaries[k]))
print(sorted(salaries,key=lambda k:salaries[k]),reverse=True)