嵌套&匿名&高阶&内置函数和函数的递归
嵌套函数
函数里的变量是互相独立的,变量的查找顺序也是从当前层依次往上层找,因此函数里面还可以写函数,所以称为嵌套函数。
name = "孙悟空"
def change():
name = "孙悟空,自学编程"
def change2():
name = "孙悟空,自学编程,学习的语言为python"
print("第3层打印", name)
change2() # 调用内层函数change2,打印第三层
print("第2层打印", name)
change()#调用change,打印第二层
print("最1层打印", name)
#执行结果
# 第3层打印 孙悟空,自学编程,学习的语言为python
# 第2层打印 孙悟空,自学编程
# 最1层打印 孙悟空
匿名函数
匿名函数就是不需要显式的指定函数名,匿名函数需要lambda申明,匿名函数本身作用不大,需要其他函数搭配使用,从而简化代码。
例如lambda x,y:x*y
冒号前面为匿名函数的形参,冒号后面为传入的值
#下面就是将三元表达式和匿名函数以及map函数在一起运用
res=map(lambda x:x**2 if x<10 else x-5 ,[1,2,3,4,6,9,15,20])
print(res)
for i in res:
print(i)
#运行结果
# <map object at 0x000001EEB1E53198>
# 1
# 4
# 9
# 16
# 36
# 81
# 10
# 15
高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
def abs1(n):#求绝对值
if n<0:
n=int(str(n).strip('-'))
return n
def qiuhe(x,y,f):#形参f为传入一个函数
sum=f(x)+f(y)
return sum
res=qiuhe(-2,-3,abs1)
print(res)
#执行结果
#5
函数的递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自已本身,这个函数就叫做递归函数。
递归特性:
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
用递归实现2分查找的算法
while True:
res=False
def erfenfa(a,b,x,l):
k=int((a+b)/2)
if a<b:
if x==l[k]:
global res
res=True
elif x<l[k]:
b=k-1
erfenfa(a,b,x,l)
elif x>l[k]:
a=k+1
erfenfa(a,b,x,l)
l=[1,5,9,10,12,13,14,15,16,17,20,23,25,28,29,33,35,44,55]
a=0
b=len(l)-1
print('输入你所查找的值:')
x=int(input().strip())
erfenfa(a,b,x,l)
if res:
print('该值在l中')
else:
print('该值不在l中')
#执行例子
# 输入你所查找的值:
# 9
# 该值在l中
# 输入你所查找的值:
# 10
# 该值不在l中
# 输入你所查找的值:
# 66
# 该值不在l中