一、递归函数
1、递归的定义
函数的递归调用:是函数嵌套调用的一种特殊形式
具体是指:
       在调用一个函数的过程中又直接或者间接地调用到本身
1.1 直接调用本身
def f1():print('是我是我还是我')f1()f1()
1.2 间接接调用本身
def f1():print('===>f1')f2()def f2():print('===>f2')f1()f1()
一段代码的循环运行的方案有两种
方式一:while、for循环
while True:
    print(1111)
    print(2222)
    print(3333)
方式二:递归的本质就是循环:
def f1():
    print(1111)
    print(2222)
    print(3333)
    f1()
f1()
2、需要强调的的一点是:
递归调用不应该无限地调用下去,必须在满足某种条件下结束递归调用
n=0while n < 10:print(n)n+=1def f1(n):if n == 10:returnprint(n)n+=1f1(n)f1(0)
3、递归的两个阶段
回溯:一层一层调用下去
递推:满足某种结束条件,结束递归调用,然后一层一层返回
age(5) = age(4) + 10age(4) = age(3) + 10age(3) = age(2) + 10age(2) = age(1) + 10age(1) = 18def age(n):if n == 1:return 18return age(n-1) + 10res=age(5)print(res)
4、递归的应用
l=[1,2,[3,[4,[5,[6,[7,[8,[9,10,11,[12,[13,]]]]]]]]]]def f1(list1):for x in list1:if type(x) is list:# 如果是列表,应该再循环、再判断,即重新运行本身的代码f1(x)else:print(x)f1(l)
二、二分法
算法:是高效解决问题的办法
算法之二分法
需求:有一个按照从小到大顺序排列的数字列表
     需要从该数字列表中找到我们想要的那个一个数字
     如何做更高效???
nums=[-3,4,7,10,13,21,43,77,89]
find_num=10
nums=[-3,4,13,10,-2,7,89]
nums.sort()
print(nums)
方案一:整体遍历效率太低
nums=[-3,4,7,10,13,21,43,77,89]find_num=10for num in nums:if num == find_num:print('find it')break
方案二:二分法
# def binary_search(find_num,列表):
#     mid_val=找列表中间的值
#     if find_num > mid_val:
#         # 接下来的查找应该是在列表的右半部分
#         列表=列表切片右半部分
#         binary_search(find_num,列表)
#     elif find_num < mid_val:
#         # 接下来的查找应该是在列表的左半部分
#         列表=列表切片左半部分
#         binary_search(find_num,列表)
#     else:
#         print(‘find it’)
nums=[-3,4,7,10,13,21,43,77,89]find_num=8def binary_search(find_num,l):print(l)if len(l) == 0:print('找的值不存在')returnmid_index=len(l) // 2if find_num > l[mid_index]:# 接下来的查找应该是在列表的右半部分l=l[mid_index+1:]binary_search(find_num,l)elif find_num < l[mid_index]:# 接下来的查找应该是在列表的左半部分l=l[:mid_index]binary_search(find_num,l)else:print('find it')binary_search(find_num,nums)
三、面相过程编程思想
编程思想/范式
面向过程的编程思想:
     核心是”过程”二字,过程即流程,指的是做事的步骤:先什么、再什么、后干什么
     基于该思想编写程序就好比在设计一条流水线
优点:复杂的问题流程化、进而简单化
缺点:扩展性非常差
面向过程的编程思想应用场景解析:
1、不是所有的软件都需要频繁更迭:比如编写脚本
2、即便是一个软件需要频繁更迭,也不并不代表这个软件所有的组成部分都需要一起更迭
四、匿名函数
1、def用于定义有名函数
func=函数的内存地址
def func(x,y):
    return x+y
2、lamdab用于定义匿名函数
print(lambda x,y:x+y)
3、调用匿名函数
方式一:
res=(lambda x,y:x+y)(1,2)
print(res)
方式二:
func=lambda x,y:x+y
res=func(1,2)
print(res)
4、匿名用于临时调用一次的场景:
更多的是将匿名与其他函数配合使用
5、应用场景
salaries={'siry':3000,'tom':7000,'lili':10000,'jack':2000}#需求1:找出薪资最高的那个人=》lilires=max([3,200,11,300,399])print(res)res=max(salaries)print(res)
salaries={'siry':3000,'tom':7000,'lili':10000,'jack':2000}# 迭代出的内容 比较的值# 'siry' 3000# 'tom' 7000# 'lili' 10000# 'jack' 2000# def func(k):# return salaries[k]# ========================max的应用res=max(salaries,key=func) # 返回值=func('siry')print(res)# res=max(salaries,key=lambda k:salaries[k])# print(res)# ========================min的应用# res=min(salaries,key=lambda k:salaries[k])# print(res)
# ========================sorted排序salaries={'siry':3000,'tom':7000,'lili':10000,'jack':2000}res=sorted(salaries,key=lambda k:salaries[k],reverse=True)print(res)
========================map的应用(了解)
l=['alex','lxx','wxx','薛贤妻']new_l=(name+'_dsb' for name in l)print(new_l)res=map(lambda name:name+'_dsb',l)print(res) # 生成器
========================filter的应用(了解)
l=['alex_sb','lxx_sb','wxx','薛贤妻']res=(name for name in l if name.endswith('sb'))print(res)res=filter(lambda name:name.endswith('sb'),l)print(res)
========================reduce的应用(了解)
from functools import reduceres=reduce(lambda x,y:x+y,[1,2,3],10) # 16print(res)res=reduce(lambda x,y:x+y,['a','b','c']) # 'a','b'print(res)
五、函数的类型提示
str int ('play','music')def register(name:str,age:int,hobbbies:tuple)->int:print(name)print(age)print(hobbbies)return 111# register(1,'aaa',[1,])res=register('egon',18,('play','music'))
def register(name:str='egon',age:int=18,hobbbies:tuple=(1,2))->int:print(name)print(age)print(hobbbies)return 111# register(1,'aaa',[1,])# res=register('egon',18,('play','music'))res=register()
def register(name:"必须传入名字傻叉",age:1111111,hobbbies:"必须传入爱好元组")->"返回的是整型":print(name)print(age)print(hobbbies)return 111# register(1,'aaa',[1,])# res=register('egon',18,('play','music'))# res=register('egon',19,(1,2,3))print(register.__annotations__)
