首页 > 其他分享 >多参装饰器/多层语法糖/递归函数

多参装饰器/多层语法糖/递归函数

时间:2022-10-12 16:12:14浏览次数:57  
标签:return 递归函数 args 多层 多参 kwargs print 装饰 def

目录

今日内容概要

  • 多层语法糖
  • 有参装饰器
  • 装饰器模板
  • 装饰器修复技术
  • 递归函数
  • 练习题及答案

1.多层语法糖

"""
多层语法糖 加载顺序由下往上
每次执行之后如果上面还有语法糖 则直接将返回值函数名传给上面的语法糖
如果上面没有语法糖了 则变形 index = outter1(wrapper2)
"""
在我们正常使用语法糖的时候一般是@装饰器
这样的一个操作
我们先来看一下一层语法糖
我们先写一个装饰器
def outer(function):
    def inner(*args,**kwargs):
        res = function(*args,**kwargs)
        return res
    return inner
@outer  # 语法糖的作用就是帮我们优化了一下执行装饰器的代码 省掉了 变量名 赋值符号 函数名(函数名)
def func():
    print('我是Func')
func()
例子1:多层语法糖
def outter1(func1):
    print('加载了outter1')
    def wrapper1(*args, **kwargs):
        print('执行了wrapper1')
        res1 = func1(*args, **kwargs)
        return res1
    return wrapper1
def outter2(func2):
    print('加载了outter2')

    def wrapper2(*args, **kwargs):
        print('执行了wrapper2')
        res2 = func2(*args, **kwargs)
        return res2
    return wrapper2
def outter3(func3):
    print('加载了outter3')

    def wrapper3(*args, **kwargs):
        print('执行了wrapper3')
        res3 = func3(*args, **kwargs)
        return res3

    return wrapper3
@outter1
@outter2
@outter3
def index():
    print('from index')
index()

2.有参装饰器

# 校验用户是否登录装饰器
def outer(mode):
    def login_auth(func_name):
        def inner(*args,**kwargs)
        	username = input('username>>>>:').strip()
             password = input('password>>>>:').strip()
             if mode == '1':
                print('使用模式1')
             elif mode == '2':
            	print('使用模式2')
             elif mode == '3':
        		print('使用模式3')
             res = func_name(*args,**kwargs)
             return res
        return inner
     return login_auth
'''
当装饰器中需要额外的参数时,我们需要在给装饰器增加一层传参
在函数名加括号是执行优先级最高的
	我们应该先看函数名加括号的执行
	在看语法糖的操作
'''
# @outer('1')
def index():
    print('from index')
index()

# @outer('2')
def func():
    print('from func')
func()

3.装饰器模板

无参装饰器模板(常用)
def outer(function):
    def inner(*args,**kwargs):
    	res = function(*args,**kwargs)
        return res
    return inner
有参装饰器模板(不太用)
def outer_plus(x):
	def outer(function):
        def inner(*args,**kwargs)
        	res = function(*args,**kwargs)
            return res
        return inner
    return outer
@outer_plus('33')
def func():
    print('你好')
func()

4.装饰器修复技术

在介绍修复技术之前介绍一个函数方法:
help()
它可以帮助我们查看一些函数的具体注释内容
我们知道被装饰器装饰的函数其实已经不是它自己本身了,如果我们想要help()它,它显示的是装饰器部分的内容
所以我们如果想要让help()函数显示它自己本身的内容的话我们可以在
装饰器开头加上 
from functools import wraps
def outer(func_name):
    @wraps(func_name)
    def inner(*args,**kwargs):
        res = func_name(*args,**kwargs)
        return res
    return inner
# 通过这种方法我们就可让help()括号内填写被装饰器修饰的函数名,结果显示也是函数名内的信息,这样就可以对装饰器做到以假乱真,更方便用户去查看这个函数

5.递归函数

函数的递归调用
	函数直接或者间接调用了函数自身
例子:
直接调用
def index():
    print('from index')
    index()
index()
我们执行这个index() 但是会一直重复在这个函数里面,这样我们的函数内部名称空间就在不断的增加存储量
我们的Python解释器它会在一定次数后停止这个递归,是为了保护计算机放置爆掉内存
间接调用:
def index():
    print('123')
    func()
def func()
	print('456')
    index()
func()
这两个函数互相调用自己本身,也跟直接调用一样,如果python解释器没有干预的话我们的内存会被它们产生的信息填满
# 最大递归深度为:官方标注:1000
也就是我们最多是能执行1000次,我们的python解释器会自动帮我们停止操作

递归函数:
1.直接或间接调用自己(函数)
2.每次调用都必须比上一次简单,并且有一个需要明确的结束条件
	递推:一层层往下
    回溯:基于明确的结果一层层往上
 	 """
    get_age(5) = get_age(4) + 2
    get_age(4) = get_age(3) + 2
    get_age(3) = get_age(2) + 2
    get_age(2) = get_age(1) + 2
    get_age(1) = 18
    """
    def get_age(n):
        if n == 1:
            return 18
        return get_age(n-1) + 2
    res = get_age(5)
    print(res)
    

6.作业

1.利用递归函数依次打印列表中每一个数据值
	l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]
2.利用有参装饰器编写多种用户登录校验策略

标签:return,递归函数,args,多层,多参,kwargs,print,装饰,def
From: https://www.cnblogs.com/ddsuifeng/p/16784837.html

相关文章

  • ALV Header Item 多层显
    ​​​​​代码参考的​​http://blog.sina.com.cn/s/blog_5ccd375b0100bia3.html​​格式稍作整理:*&------------------------------......
  • 多层三目运算符
    参考:https://blog.csdn.net/qq_36138652/article/details/115789463......
  • 原始递归函数及模拟运行的优化
    看到网上一个题目,证明x开y次方是原始递归函数(primitiverecursivefunction)。这个问题并不难,只要把x开y次方实现出来即可。于是,正好把《递归论》相关内容补一补。【......
  • 用递归函数和栈操作逆序栈
    用递归函数和栈操作逆序栈作者:Grey原文地址:博客园:用递归函数和栈操作逆序栈CSDN:用递归函数和栈操作逆序栈题目描述请设计一个算法实现逆序栈的操作,但是只能用递归函......
  • Go基础编程:递归函数、函数类型、匿名函数与闭包
    1.递归函数递归指函数可以直接或间接的调用自身。递归函数通常有相同的结构:一个跳出条件和一个递归体。所谓跳出条件就是根据传入的参数判断是否需要停止递归,而递归体则是......
  • python接口测试3-使用递归函数
    递归函数,自己调用自己,达到某一条件时停止调用。我理解的是类似于两个正面对着的镜子,镜子中的画面不停重复,直到某一个时刻停止。1、使用场景:需要提取某个接口的返回数据,返......
  • pytorch 构建单/多层感知机
    One-HotEncode编码:主要用于解决神经网络用于分类的构建loss编码的方式super()super()函数是用于调用父类(超类)的一个方法。super()是用来解决多重继承问题的,直接......
  • 手写编程语言-递归函数是如何实现的?
    前言本篇文章主要是记录一下在GScript中实现递归调用时所遇到的坑,类似的问题在中文互联网上我几乎没有找到相关的内容,所以还是很有必要记录一下。在开始之前还是简单......
  • MyBatis——案例——查询-多条件查询(多参数接收的三种方法)
    查询-多条件查询  编写接口方法:Mapper接口      参数:所有条件查询List<Brand>selectByCondition(intstatus,StringcompanyName,StringbrandName);   ......
  • Vue2:$attrs多层传值
     在不用状态管理vuex的时候,如何让GrandFather与Son通信,我们可以用可以emit一层一层的传递:会显得冗余。vue2.4之后,提出$attrs、$listeners,可以实现跨级组件通信。$l......