首页 > 编程语言 >Python之递归函数与装饰器

Python之递归函数与装饰器

时间:2022-11-13 17:33:43浏览次数:43  
标签:功能 函数 递归函数 Python 附加 func print 装饰 def


Python之递归函数与装饰器

文章目录

  • ​​Python之递归函数与装饰器​​
  • ​​递归的含义:​​
  • ​​python中的时间模块​​
  • ​​装饰器​​


递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

递归函数特性:

  1. 必须有一个明确的结束条件;
  2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
  3. 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
  4. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
递归的含义:

递归本身就是函数自己调自己,

举一个典型的例子:

计算1到100之间相加之和;通过递归两种方式实现

def sum(max):
if max <= 100 and max >= 0:
return max +sum(int(max) - 1)
else:
return 0
print(sum(100))

下面是通过文件和封装函数来实现递归

import os#需要#用os模块打开sys python系统
def func(path):#里面放的是参数-->变量
#打开这个文件夹-- 拿里面的文件的名字
lst=os.listdir('a')
for name in lst#拿到每个文件的名字
#判断name对应的文件是文件夹还是文件
#获取到文件所在的路径
real_path=os.path.join(path,name)
if os.path.isdir(real_path):#判断是否是文件夹,需要把文件路径扔进去
func(real_path)
else:
print(name)


func('a')#递归函数调用
python中的时间模块
Python 中有一个 time 模块可以用于获取当前时间戳:

import time
time1 = time.time() # 每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示,单位是秒
x = 10*10
time2 = time.time()
print(time2-time1) # 表示运行 x = 10*10 所用的时间
装饰器

要想了解装饰器,首先要了解什么是闭包,在函数中再嵌套一个函数,并且引用外部函数的变量,这就是一个闭包了。我们来举一个简单的例子:

def outer(x):
def inner(y):
return x + y
return inner # 这就是一个闭包函数
print(outer(6)(5)) # 第一个参数是传给outer函数的,第二个传给inner函数

执行结果:

11

如代码所示,在 outer 函数内,又定义了一个 inner 函数,并且 inner 函数又引用了外部函数 outer 的变量 x,这就是一个闭包了。

装饰器是闭包的一种应用,从字面上理解,就是装饰对象的器件,其实装饰器本质上就是一个函数,功能是为其他函数添加功能,可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出。

当我们不使用装饰器时:

def A(func):
def B():
print("我是附加功能1!") # 附加功能
func()
print("我是附加功能2!") # 附加功能
return B
def C():
print("我是函数原来的功能!")
res=A(C)
res()

执行结果:

我是附加功能1!
我是函数原来的功能!
我是附加功能2!

当我们使用装饰器时:

def A(func):     # func 表示一个函数
def B():
print("我是附加功能1!") # 附加功能
func() # 调用传入的函数
print("我是附加功能2!") # 附加功能
return B
@A # @函数名 表示使用装饰器
def C():
print("我是函数原来的功能!")
C()

执行结果:

我是附加功能1!
我是函数原来的功能!
我是附加功能2!

使用装饰器后,​​@A​​​等价于不使用装饰器代码中的​​res=A(C)​​。当被装饰的函数需要传入参数时,装饰器的嵌套函数就需要添加一个参数。

def A(func):
def B(x): # 添加一个参数
print("我是附加功能1!") #附加功能
func(x)
print("我是附加功能2!") #附加功能
return B
@A
def C(x):
print("我是函数原来的功能!%s"%x)
C('hello action!')

执行结果:

我是附加功能1!
我是函数原来的功能!hello action!
我是附加功能2!

除了被装饰的函数可以添加参数之外,装饰器也是可以添加参数的。

def A(x):
def B(func):
def C(y):
func(y)
print(x)
return C
return B
@A('hello')
def D(x):
print(x)
D('你好!')

执行结果:

你好!
hello


标签:功能,函数,递归函数,Python,附加,func,print,装饰,def
From: https://blog.51cto.com/u_15870497/5847874

相关文章

  • Python之selenium的打开浏览器的二种方式
    Python之selenium的打开浏览器的二种方式文章目录​​Python之selenium的打开浏览器的二种方式​​​​第一步我们要先按照selenium:​​​​第一种打开方式:​​​​第二种......
  • Python如何使用XPath对HTMl内容解析,,玩转XPath
    Python如何使用XPath对HTMl内容解析文章目录​​Python如何使用XPath对HTMl内容解析​​​​HTMl内容解析​​​​HTML基础:​​​​什么是XPath:​​​​lxml的安装​​​​......
  • (Python)简易通讯录
    问题描述:将用户输入用逗号分隔的一系列人名作为键,用户输入的逗号分隔的手机号作为值,创建字典MyDict,输入一个正整数n,你将被要求读入n个输入(输入形式如下所示),每得到一......
  • python元祖
    元祖里是数据是固定的,不能修改1str_tuple=('dew','','as')23int_tuple=(1,2,4,5,4)45float_tuple=(1.1,20.3,23.9)67bool_tuple=(True,Fals......
  • 【Python零基础入门篇 · 41】:内置模块的使用二:pyinstaller模块(打包py文件以及更换图
    pyinstaller模块pyinstaller是第三方模块,需要在Terminal输入命令安装:pipinstallpyinstaller步骤演示在Day18.py文件下写入代码在cmd或Terminal找到文件进行打包。......
  • 【Python零基础入门之终结篇】:虚拟机Linux命令、Vim编辑器、有趣的命令
    以下操作均在ubuntu虚拟机中的终端进行鼠标右键,点击“打开终端”ctrl+shift+"+":放大终端字体ctrl+"-":减小终端字体虚拟机Linux命令基本命令常用命令命令作......
  • Python开发人脸动态追踪
    Python开发人脸动态追踪导入库文件cv2通过pip命令安装pipinstallopencv-python或者在在设置里面找到+进行opencv-python你还要去下载文件:haarcascade_frontalface_alt.xm......
  • 网易云vip音乐免费下载方法(python爬虫)
    importosimportreimportjsonimportrequestsfromlxmlimportetreedefdownload_songs(url=None):  ifurlisNone:    url='https://music.......
  • Python3-异步协程
     importasyncioimporttimeasyncdefget_request(url):print('正在请求的url:',url)awaitasyncio.sleep(2)#支持异步模块代码print('请求结束:'......
  • python2 切换到 python3
    python2切换到python3Part.1:py3中不支持的py2用法1.1PrintIsAFunctionpy2中print为保留的关键字,在py3中,改为普通的函数。Old:print"Theansweris......