day14函数递归调用

1、装饰器叠加

def deco1(func1):
def wrapper1(*args,**kwargs):
print('=====>wrapper1 ')
res1 =func1(*args,**kwargs)
return res1
return wrapper1
def deco2(func2):
def wrapper2(*args,**kwargs):
print('=======>wrapper2')
res2 = func2(*args,**kwargs)
return res2
return wrapper2
def deco3(func3):
def wrapper3(*args,**kwargs):
print('=====>wrapper3')
res3 =func3(*args,**kwargs)
return res3
return wrapper3
@deco1 # deco1(函数wrapper2的内存地址)->函数wrapper1的内存地址
@deco2 # deco2(函数wrapper3的内存地址)->函数wrapper2的内存地址
@deco3 # deco3(最原始那个index函数的内存地址)->函数wrapper3的内存地址
def index():
print('====>index')
return 123
res =index()
print(res)
输出结果:
=====>wrapper1
=======>wrapper2
=====>wrapper3
====>index
123

2、函数递归调用

1、什么是函数递归调用
函数递归调用是函数嵌套调用的一种特殊格式,具体是指在调用一个函数的过程中。
又直接或者间接的调用自己
函数递归调用不应该无限递归调用下去,应该在满足某种条件下结束递归调用
所以,函数递归调用应该分为两个阶段:
1.回溯
2.递推
案例1:
def age(n): #5,4,3,2,1 #2,3,4,5,
if n == 1:
return 30
return age(n-1)+10 #一层层推进,一层层反过来加上来
res=age(5)
print(res)
输出结果:70
案例2:
l = [1,[2,[3,[4,[5,[6,[7]]]]]]]
def foo(l):
for item in l:
if type(item) is not list:# 判断是列表不打印
print(item)
else:
foo(item)
foo(l)
输出结果:1 2 3 4 5 6 7 2、基于递归实现二分法:
nums = [-3, 5, 7, 11, 21, 31, 41, 53, 67, 77, 83, 99, 101]
find_num = 67 # 需要找的值
print(len(nums)) # 列表有13个值
def srarch(nums,find_num):
print(nums)
if len(nums) == 0:
print('不存在')
return
mid_index = len(nums)//2 # 列表长度整除2赋值给变量名,13//2=6
if find_num > nums[mid_index]: # 67 > 41,取6的索引对应值
srarch(nums[mid_index+1:],find_num) # 在右半部分
elif find_num < nums[mid_index]: # 变量名(传值)大于列表(值)
srarch(nums[:mid_index],find_num) #在 左半部分
else:
print('找到了')
srarch(nums,67)

3、生成器

    a = [i for i in range(1,6)]
l = [i**2 for i in range(1,6)]
c = [i/2 for i in range(1,8)]
print(a,l,c)
输出结果:[1, 2, 3, 4, 5] [1, 4, 9, 16, 25] [0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5]
l = [i for i in range(1,10) if i < 10]
print(l)
输出结果:[1, 2, 3, 4, 5, 6, 7, 8, 9] 1.列表生成器:找出dsb
names = ['liusir_dsb', 'housir_dsb', 'egon', 'wusir_dsb']
res = [i for i in names if i.endswith('dsb')] #找出关键词dsb
print(res)
输出结果:['liusir_dsb', 'housir_dsb', 'wusir_dsb'] 2.字典生成式
res = {k:v for k,v in [('name','meng'),('age',18)]}
print(res)
输出结果:{'name': 'meng', 'age': 18} 3.集合生成器
res = {i for i in range(5)}
print(res,type(res))
输出结果:{0, 1, 2, 3, 4} <class 'set'> 4.生成器表达式
l = [i for i in range(1,6)]
print(l)
print(next(l))

4、匿名函数

调用匿名函数方式一   # 不推荐使用
f=lambda x,y:x+y
print(f(1,2)) 调用匿名函数方式二 #推荐使用
res = (lambda x,y:x+y)(1,2) #调用函数传值
print(res)

day14函数递归调用的更多相关文章

  1. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  2. gcc O2优化选项对内嵌汇编以及函数递归调用的影响

    学习和使用c这些年来,很多方面都未深入研究过,就如脱离了IDE后,我可能连编译一个c文件的命令都写不出来. 最近需要在c中内嵌汇编解决问题,参考网上相关的资料写了一段汇编代码,在测试的时候时好时坏,找 ...

  3. Python函数递归调用

    函数的递归调用: 是函数嵌套调用的一种特殊形式 具体是指: 在调用一个函数的过程中又直接或间接地调用到了本身 # 直接调用本身 def func(): print('我是func') func() f ...

  4. SQL SERVER树型数据处理时,函数递归调用问题,查询根节点,子节点函数

    /* 标题:查询指定节点及其所有子节点的函数 作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 时间:2008-05-12 地点:广东深圳 */ ) , pid ) , name )) ' , n ...

  5. python 关于函数递归调用自己

    爬取b站博人传 每页短评20个,页数超过1000页, 代码如下 import requests import json import csv def main(start_url): headers ...

  6. 你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用

    5.1.5 函数的递归调用 在函数调用中,通常我们都是在一个函数中调用另外一个函数,以此来完成其中的某部分功能.例如,我们在main()主函数中调用PowerSum()函数来计算两个数的平方和,而在P ...

  7. JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法

    函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...

  8. python之函数递归

    函数递归调用 在函数内部,可以调用其它函数,如果一个函数在内部调用自身,即是递归调用 为防止无限递归类似于死循环,需要如下: 1.必须要有一个明确的返回值: 2.每次进入更深一层递归时,问题规模应该比 ...

  9. python 函数递归与匿名函数

    1.什么是函数递归? 函数递归调用(是一种特殊的嵌套调用):在调用的函数过程中,又直接或者间接的调用了该函数本身 递归必须要有两个明确的阶段: 递推:一层一层递归调用下去,强调每进入下一层递归问题的规 ...

随机推荐

  1. poj 3020 Antenna Placement(二分图最大匹配)

    题意: N行M列的矩阵,每个格子里不是 * 就是 O . * :是一个利益点. O:是一个空白点. 每次可以用一个圈覆盖相邻的两个*.(左右相邻或上下相邻). 问最少需要多少个圈可以覆盖所有的*. 思 ...

  2. 第01课 OpenGL窗口(1)

    教程的这一节在2000年一月彻底重写了一遍.将会教您如何设置一个 OpenGL窗口.它可以只是一个窗口或是全屏幕的.可以任意 大小.任意色彩深度.此处的代码很稳定且很强大,您可以在您所有的OpenGL ...

  3. (三)FastDFS 高可用集群架构学习---Client 接口开发

    一.Python3 与 FastDFS 交互 1.安装 py3fdfs模块 # pip3 install py3Fdfs 2.测试使用 py3Fdfs 与 Fastdfs 集群交互(上传文件) fro ...

  4. shell 脚本控制命令的执行顺序

    &&,||,(),{},& 五个符号的运用shell脚本执行命令的时候,有时候会依赖于前一个命令是否执行成功.而&&和||就是用来判断前一个命令执行效果的. 也 ...

  5. es6实现继承详解

    ES6中通过class关键字,定义类 class Parent { constructor(name,age){ this.name = name; this.age = age; } speakSo ...

  6. spark搭建

    1.上传解压,配置环境变量 配置bin目录 2.修改配置文件 conf cp spark-env.sh.template spark-env.sh 增加配置 export SPARK_MASTER_I ...

  7. Java之JNDI注入

    Java之JNDI注入 About JNDI 0x01 简介 JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口,JND ...

  8. windows下端口占用

    1,netstat -ano | findstr 1235 2,taskkill /pid 9772 /f

  9. celery kill task

    from celery.task.control import revokerevoke(task_id, terminate=True) https://stackoverflow.com/ques ...

  10. dotNET开发之MVC中Controller返回值类型ActionResult方法总结

    1.返回ViewResult视图结果,将视图呈现给网页 2. 返回PartialViewResult部分视图结果,主要用于返回部分视图内容 3. 返回ContentResult用户定义的内容类型 4. ...