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. advanced base-scripting guide in chinese(高级Bash脚本编程指南-10)

    <高级Bash脚本编程指南>Revision 10中文版 github上链接地址: https://github.com/LinuxStory/Advanced-Bash-Scriptin ...

  2. usb设备无法识别

    之前用飞线用旧板子飞线连接了一个wifi模块到usb0口上,调试ok的,现在新设计的板子回来了,wifi模块是连接在usb2口上的,系统起来后发现wlan0不存在,用lsusb查看wifi模块的usb ...

  3. linux job

    通常运行的进程 ctrl-z之后会暂停到后台 bash test.sh Linux-4.15.0-36-generic-x86_64-with-Ubuntu-16.04-xenial #39~16.0 ...

  4. 13.G1垃圾收集器

    G1收集器是一款面向服务器的垃圾收集器,也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命.为什么对G1收集器给予如此高的期望呢?既然对G1收集器寄予了如此高的期望,那么他一定是有其 ...

  5. Git使用教程之初级入门命令行(二)

    一.Git 操作流程图 1.git --help 查看帮助 Administrator@PC-xiaobing MINGW64 /d/Git (master) $ git --help usage: ...

  6. springmvc学习笔记(全)

    SpringMVC简介 什么是MVC MVC是一种软件架构的思想,将软件按照模型.视图.控制器来划分 M: Model:模型层,指工程中的JavaBean,作用是处理数据.JavaBean分为两类: ...

  7. 权限控制-RBAC(Role-Based Access Control)

    RBAC是基于角色的权限访问控制,在RBAC中角色与权限相连,用户通过成为某个角色而得到角色的权限,这就极大的简化了权限的管理,用户和角色多对多,角色和权限多对多,由此产生用户表.角色表.权限表,用户 ...

  8. [noi795]保镖

    容易证明,最终方案一定是某一个排列无限循环,那么就要满足$\sum ai<=max(bi+ai)$,对所有数按照ai+bi排序后,枚举最大值,用权值线段树维护之前的ai最少要选几个 1 #inc ...

  9. 关于 RocketMQ ClientID 相同引发的消息堆积的问题

    首先,造成这个问题的 BUG RocketMQ 官方已经在 3月16号 的这个提交中修复了,这里只是探讨一下在修复之前造成问题的具体细节,更多的上下文可以参考我之前写的 <RocketMQ Co ...

  10. Abp Vnext Blazor替换UI组件 集成BootstrapBlazor(详细过程)

    Abp Vnext自带的blazor项目使用的是 Blazorise,但是试用后发现不支持多标签.于是想替换为BootstrapBlazor. 过程比较复杂,本人已经把模块写好了只需要替换掉即可. 点 ...