python之函数递归调用与函数式

Day07 -函数递归

函数递归调用:是函数嵌套调用的一种特殊形式

具体指的是:在调用一个函数的过程中有直接或间接地调用到本身

递归层级最大1000层,可以设置更大但不建议

import sys
sys.getrecursionlimit()#查看
sys.setrecursionlimit(num)#设置
#调用本身
def f1():
    print('是我是我还是我')
    f1()
f1()
#间接调用
def f1():
    print('f1>>>>')
    f2()
def f2():
    print('f2>>>>')
    f1()
f1()

需要的强调的是:尾递归优化(pyton没有)

递归不应该无限的调用,必须在满足某种条件下结束递归调用(用return)

1.递归的两个阶段

1.1 回溯

​ 一层一层调用下去

1.2 递推

​ 满足某种结束条件,结束递归调用,然后一层一层返回

def age(n):
    if n==1:
        return 18
    return age(n-1)+10
#递归的应用
l=[1,[2,[3,[4,[5,[6,[7,[8,[9,10,11]]]]]]]]]
def func(n):
    for x in n:
        if type(x) is list:
            func(x)
        else:
            print(x)       

func(l)

2.二分法(有序列表)

无序列表可以用num.sort()排序

#原始
num=[-3,4,5,30,13,42,53,65,77,98]
find_num=13
for nums in num:
	if nums==find_num:
		print('find it')
		break

def binarry_search(find_num,num):
	print(num)

	if len(num)==0:
		print('值不存在')
		return
	mid_index=len(num)//2
	mid_val=num[mid_index]
	if mid_val < find_num:
		num=num[mid_index+1:]
		binarry_search(find_num,num)
	elif mid_val > find_num:
		num=num[:mid_index]
		binarry_search(find_num,num)
	else:
		print('find it')
if __name__ == '__main__':
	num=[-3,4,5,30,13,42,53,65,77,98]
	find_num=9
	binarry_search(find_num,num)

3.面向过程的编程思想

核心是"过程"二字,指的是做事的步骤:先什么、在什么、后干什么

基于该思想就好比设计一条流水线

优点:

  • 复杂的问题流程化、进而简单化

缺点:

  • 扩展性差

1.不是所有的软件都需要频繁更迭。比如:编写脚本

2.即便是一个软件需要频繁更迭,也不代表这个软件所有组成部分都需要一起更迭

4.函数式

4.1匿名函数lambda

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

lambda x,y :  x+y#只是定义了
#调用匿名函数,内存地址加()
#方法一
res=(lambda x,y : x+y)(1,2)
print(res)
#方法二
f=(lambda x,y : x+y)
res=f(1,2)
print(res)
##########################################
#应用
salaries={
    'siry':3000,
    'tom':7000,
    'lili':10000,
    'jack':2000
}
#max和min(可迭代对象,key=函数式)和sorted()函数一样
res=min(salaries,key=lambda k:salaries[k])
print(res)
res=max(salaries,key=lambda k:salaries[k])
print(res)

4.2 map(映射)

map(函数,可迭代对象)
l=['alex','lxx','wxx','Lee']
new_l=[name+'_dsb' for name in l ]
print(new_l)
new_l=map(lambda name: name+'_dsb',l)
print(next(new_l))
print(next(new_l))
print(next(new_l))
print(next(new_l))

4.3 filter(过滤)

l=['alex_sb','lxx_sb','wxx','Lee']
new_l=[i for i in l if i.endswith('sb')]
print(new_l)
new_l=filter(lambda name:name.endswith('sb'),l)
print(new_l)

4.4 reduce

py2内置;py3在functools库中

累加操作

from functools import reduce
res=reduce(lambda x,y:x+y,[1,2,3,4,5,6],10)
print(res)
res=reduce(lambda x,y:x+y,l)
print(res)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值