首页 > 编程语言 >15、python函数篇 多层语法糖、装饰器和装饰器修复技术及递归函数

15、python函数篇 多层语法糖、装饰器和装饰器修复技术及递归函数

时间:2022-10-12 16:35:52浏览次数:49  
标签:15 python func kwargs print return 装饰 def

目录

一、多层语法糖

1、什么是多层语法糖:

​ 多层语法糖是指在单个源代码函数名上方添加了多个语法糖,使这段源代码函数体具备多个功能

2、多层语法糖用法:

​ 首先定义好装饰器功能,将需要添加功能的函数体代码放置在装饰器下方,将需要执行功能的装饰器语法糖按照执行的顺序防在原函数体函数名上方,多层语法糖加载顺序由下往上

  • 代码用法:
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')

二、有参装饰器

1、什么是有参装饰器:

​ 有参装饰器是指在无参装饰器的基础的函数体外层再加上一层函数

2、有参装饰器的作用:

​ 当无参函数体内需要局部名称需要外部传参时,我们就可以再有参装饰器函数名后方参数内进行传参

  • 有参装饰器模板:
def 有参装饰器(x,y,z):
    def outter(func):
        def wrapper(*args, **kwargs):
            res = func(*args, **kwargs)
            return res
        return wrapper
    return outter

@有参装饰器(1,y=2,z=3)
def 被装饰对象():
    pass
  • 有参装饰器实战用法:
def auth(db_type):
    def deco(func):
        def wrapper(*args, **kwargs):
            name = input('your name>>>: ').strip()
            pwd = input('your password>>>: ').strip()

            if db_type == 'file':
                print('基于文件的验证')
                if name == 'egon' and pwd == '123':
                    res = func(*args, **kwargs)  # index(1,2)
                    return res
                else:
                    print('user or password error')
            elif db_type == 'mysql':
                print('基于mysql的验证')
            elif db_type == 'ldap':
                print('基于ldap的验证')
            else:
                print('不支持该db_type')
        return wrapper
    return deco


@auth(db_type='file')  # @deco # index=deco(index) # index=wrapper
def index(x, y):
    print('index->>%s:%s' % (x, y))

@auth(db_type='mysql')  # @deco # home=deco(home) # home=wrapper
def home(name):
    print('home->>%s' % name)


@auth(db_type='ldap')  # 账号密码的来源是ldap
def transfer():
    print('transfer')

# index(1, 2)
# home('egon')
# transfer()

三、装饰器修复技术

1、什么是装饰器修复技术:

​ 装饰器修复技术是指,虽然我们再使用装饰器时,可以通过不改变源代码的调用方式和代码能够执行了新的功能,但我们调用的源代码函数名地址的用法并不是源代码的地址,这时我们就可以通过使用装饰件修复技术使调用的源文件地址和用法和源文件相同

  • 代码表现
1.首先全局中调用装饰器修饰模块
	from functools import wraps
2.再闭包函数或装饰器代码提中调用
	@warps 需要修复的函数名
  • 实战用法
from functools import wraps


def outer(func_name):
    @wraps(func_name)
    def inner(*args, **kwargs):
        res = func_name(*args, **kwargs)
        return res

    return inner


@outer
def func():
    print('我是func函数体代码')


func()
print(func)
help(func)
--------------------------------------------------------------------------
我是func函数体代码
<function func at 0x00000217883988B0>
Help on function func in module __main__:

func()

四、递归函数

1、什么是递归函数:

​ 1.函数体代码内部调用自己本身函数名

​ 2.两个函数体代码内部相互调用对方函数名

​ 3.每一次调用能得出一个新的数据值,并且明确了结束时间

注意事项:

​ 1.在递归函数未明确结束条件时,代码会进入死循环,这时会触发python保护机制,这段代码最多可运行1000次左右

  • 代码表现
1.直接调用自己本身
    count = 0


    def func():
        global count
        count += 1
        print(count)
        return func()


    func()



2.间接调用:
    count = 0


    def func():
        global count
        count += 1
        print(count)
        return func1()

    def func1():
        print(count)
        return func()



	func()

1、递归函数的作用:

​ 1.是一种计算过程,可以通过递归函数进行数学运算

  • 实战用法
'''
问:
    小明第一天做了20个俯卧撑
    以后每增加一天就会多做1个
求:
    小米第100做多少个俯卧撑
'''

def func(n):
    if n == 100:
        return 20
    return func(n + 1)+1

res = func(1)
print(res)
--------------------------------------------------------------------------
119

标签:15,python,func,kwargs,print,return,装饰,def
From: https://www.cnblogs.com/kangssssh/p/16784929.html

相关文章

  • python class 属性的<陷阱>
    class属性写法一classB(object):b=[]defadd(self,i):self.b.append(i)class属性写法二classB(object):def__init__(self):......
  • python学习:枚举定义和使用
    1.定义在某些情况下,一个类的对象是有限且固定的,比如季节类,它只有4个对象;再比如行星类,目前只有8个对象。这种实例有限且固定的类,在Python中被称为枚举类。程序有两......
  • 【Python】HTML中Base64存储的图片转为本地图片文件
    我用jupyternotebook写了笔记之后,想导出markdown,然后导出不了,我就只能导出html,结果导出的html存储图片用的base64的方式……于是我就要把导出的html文档里面的base64格式......
  • 多参装饰器/多层语法糖/递归函数
    目录今日内容概要1.多层语法糖2.有参装饰器3.装饰器模板4.装饰器修复技术5.递归函数6.作业今日内容概要多层语法糖有参装饰器装饰器模板装饰器修复技术递归函数练......
  • 【Python进阶】实战Python图形文件操作基本编程
    欢迎来到专栏《Python进阶》。在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件、数据的处理,Python各种好用的库如NumPy、Scipy、Matplotlib、Pandas的使用等等......
  • 单链表-Python实现-jupyter->markdown 格式测试
    单链表引入顺序表理解Python变量的本质:变量存储的不是值,是值的地址理解Python的"="表示的是指向关系案例:交换a,b的值,a=10,b=20a,b=20,10t0:a这块内存(也有id),......
  • Python基础 - 序列结构
    对内置的常用数据结构,列表,字典,元组,集合的基本点看书整理.有序序列:列表、元组、字符串无序序列:字典、集合可变序列:列表、字典、集合不可变......
  • Python基础 - 面向对象
    面向对象基础入门,理解概念为主,其妙用需要很长时间去领悟哦.引入Python既是面向过程,也能面向对象.初学来理解为啥要面向对象,不太可能,用处......
  • 【AI白身境】学AI必备的python基础
    今天是新专栏《AI白身境》的第三篇,所谓白身,就是什么都不会,还没有进入角色。上一篇给大家介绍了如何正确使用Linux,如何利用shell,vim,git这三大神器。相信大家也掌握的差不多了......
  • 【AI白身境】只会用Python?g++,CMake和Makefile了解一下
    今天是新专栏《AI白身境》的第六篇,所谓白身,就是什么都不会,还没有进入角色。对于大部分小白来说,因为python用的太爽,以致于或许都没有听说过CMake。python是脚本语言,而当前大......