函数的递归调用,三元表达式,匿名表达式

一.函数的递归调用

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)

猜你喜欢

转载自blog.csdn.net/yikenaoguazi/article/details/107534699