python递归函数

今日内容概要

  • 多层语法糖
  • 有参装饰器
  • 装饰器修复技术
  • 递归函数

内容详细

多层语法糖

语法糖的定义:

语法糖(Syntactic sugar),也译为糖衣语法,由英国计算机科学家彼得·约翰·兰达发明的一个术语,指计算机语言中添加的某种语法。这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

    之所以叫“语法”糖,不只是因为加糖后的代码功能与加糖前保持一致,更重要的是,糖在不改变其所在位置的语法结构的前提下,实现了运行时的等价。可以简单理解为,加糖后的代码编译后跟加糖前一致。

    之所以叫语法“糖”,是因为‘加糖后’的代码写起来更爽,包括但不限于:**==代码更简洁流畅,代码更语义自然……写着爽,看着爽,就像吃了糖。==**

    有人将语法糖归类为奇技淫巧,需要声明的是,“语法糖”这个词绝非贬义,它不是糖衣炮弹,更不是口蜜腹剑,它可以给编码带来实实在在的方便,也可以提高编码的效率,更重要的,在性能上也不来损失。

语法糖是约定俗成的,为编译器所认可的,可以带来方便快捷的,编程语法。一定程度上而言,语法糖可以呈现于书本,流通于码界,也可以诞生于指尖。窃以为,能够带来编码便利的语法,皆可称为糖😁

案例:

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,**kwags):
        print('执行了wrapper2')
        res2 = wrapper2(*args,**kwargs)
        return res2
    return wrapper2

def outter3(func3):
    print('加载了outter3')
    def wrapper3(*args,**kwargs)
    res3 = wrapper3(*args,**kwargs)
    return res 
return wrapper3

@outter1
@outter2
@outter3
def index()
	print('from index'  

上述案例是语法糖的多层语法糖

多层语法糖的加载顺序都是由下往上推的,每次执行之后如果上面还有语法糖,则直接将返回值函数传给上面的语法糖;如果上面没有语法糖了,则变形 index = outter1(wrapper2)

image

有参装饰器

有参装饰器:

是为装饰器提供多样功能的选择的实现而提供的,实现的原理是三层闭包

有参装饰器的模板:

def outer(a):
    def outer1(func):
        def wrapper(*args,**kwargs):
            print('流程推对了吗')
            res = func(*args,**kwargs)
            return res
        return wrapper
    return outer1

@outer('mySQL')
def func():
    pass

通过第三层进行传值,使得有参装饰器可以使用其他参数,实现其他功能。

无参装饰器模板:

def outer(func):
    def inner(*args,**kwargs):
        pass
    	res = func(*args,**kwargs)
        return inner
    return outer
@outer
def index():
    pass

装饰器修复技术

小知识:
   def index():
       """index函数"""
       pass
help(index)
help(len)

结果:
index()
   index函数

Help on built-in function len in module builtins:

len(obj, /)
   Return the number of items in a container.


from functools import wraps
def outer(func_name):
   @wraps(func_name)  # 这里仅仅是为了让装饰器的效果更加逼真,平时可以不写
   def inner(*args,**kwargs):
       '''我是inner'''
       res=func_name(*args,**kwargs)
       return res
   return inner
@outer # func = outer(func)
def func():
   '''我是真正的func'''
   pass

# help(func)
#print(func)
func()

递归函数

1.函数的递归调用
函数直接或者间接的调用函数自身

直接调用
def index():
    def index ('from index ')
    index()
index()

间接调用
def index():
    print('from index ')
    func()
    
def func():
    print('from func')
    index()
 index()

'''官网提供的最大递归深度为1000,我们在测试的时候可能会出现996 997  998 每个人电脑不同结果也会不同'''

2.递归函数

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)

image

posted @ 2022-10-12 17:11  亓官扶苏  阅读(407)  评论(0编辑  收藏  举报