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

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

时间:2022-10-12 21:15:16浏览次数:61  
标签:return 递归函数 args 多层 语法 func kwargs print def

多层语法糖

def func1(a1):  # 1 定义了函数func1  # 14 func1(foo2)
	print('加载了func1')  # 15 加载了func1
	def foo1(*args, **kwargs):  
    	print('执行了foo1')  # 17 执行了 foo1  
    	res1 = a1(*args, **kwargs)  # 18 此时a1 = foo2 调用foo2
    	return res1
   return fool # 16 返回值 fool 上层已经没了,直接调用


def func2(a2):  # 2 定义了函数func2 # 10 此时func2(foo3函数体代码)
	print('加载了func2')  # 11 加载了func2
	def foo2(*args, **kwargs):   
   		print('执行了foo2')  # 19 执行了foo2
       res2 = a2(*args, **kwargs)  # 20 此时a2 = foo3 调用foo3
       return res2
	return foo2  # 12 foo2返回给func1

def fun3(a3):  # 3 定义了函数func3  # 6 此时func(index函数体代码)
	print('加载了func3')  # 7 加载了func3
	def foo3(*args, **kwargs):
		print('执行了foo3')  # 21 执行了foo3
		res3 = a3(*args, **kwargs)  # 22此时 a3 = index 调用index
		return res3
	return foo3  # 8 返回foo3 值给func2

    @func1  # 13 返回值给func1(foo2) 调用func1
    @func2  # 9 此时func2(foo3) 调用func2
    @func3  # 5 调用func3  func3(index函数体代码)
def index():  # 4 定义了函数f语法糖将函数名index当做参数传输过去
	print('我在这')  # 23 打印了我在这 

index()
  """打印顺序""" 
加载了func3
加载了func2
加载了func1
执行了foo1
执行了foo2
执行了foo3
我在这

有参装饰器

在我们使用校验用户是否登录装饰器时,如果我们使用了多种用户来源校正,那么就需要传一个参数给装饰器。 但是装饰器原本的形参又不能改变,那么当装饰器中需要额外的参数时我们就可以使用有参装饰器。在装饰器外层在包一层函数。
def outer(a):
    def login_auth(func):
		  def inner(*args, **kwargs):
		  username = input('请输入用户名').strip()
 		  passwold = input('请输入密码').strip()
        if a == '1':
            print('固定用户名jason 密码 123 ')
        elif a == '2':
            print('在文本里校验用户')
        elif a == '3':
            print('在字典里校验用户')
        return inner
	return login_auth

@outer('2')   """请注意,只要函数名带括号那么无论右边是变量名还是@ 都优先执行函数"""
def func():
    print('在文本里校验正确啊')
    
@outer('3')
def func():
    print('在字典里校验成功啊')

有参装饰器模板

def a1(a):
    def a2(func):
        def a3(*args, **kwargs):
            print('执行被装饰对象前添加的功能')
            res = func(*args, **kwargs)
            print('执行被装饰对象后添加的功能')
            return res
        return a3
    return a2
@a1(传个参数)
def foo():
    pass

装饰器修复技术

from functools import wraps
def outer(func):
    @wraps(func)
    def inner(*args, **kwargs):
		print('啥米是装饰器')
       res = func(*args, **kwargs)
    	return res
    return inner

@outer
def foo():
	print('我才是真正的foo')

foo()
装饰器修复技术其实没啥大用,在我们不使用@wraps时,函数foo已经被传参到 func了
"""func = foo()真正执行的函数其实是func)""" 
修复技术只是用来忽悠你把函数foo改回成真的foo"""不是真的改,其实戴了个面具""" 啥都没变。

递归函数

递归的概念

在函数里直接或者间接调用自己>>>>>递归函数
递归函数里如果我们不给返回值那么他会一直循环递归,最大递归深度是1000. 
递归应当必须要有结束条件且下一次要比上一次更简单。(距离结束条件更近)

直接调用自己

def foo():
	 print('直接调用了自己')
    foo()
foo()
'''RecursionError: maximum recursion depth exceeded while calling a Python object'''python解释器中限制了没有条件的递归函数最大递归深度只有1000,当超过1000次就会报错

间接调用自己

def foo():
    print('间接调用自己')
    func()
def func():
    print('哈哈')
    foo()
    
func() 
# 结果报错  同上

递归函数用法

计算1- 100之和
def func1(n):
    if n < 1:
        return 1
        
    else:
    	return func1(n-1) + n
res = func1(100)
print(res)

作业

b = False
user_name_dict = {'1': {'name': 'jack', 'passwold': '123'},
                  '2': {'name': 'tank', 'passwold': '123'}}


def outer(a):
    def outer1(func):
        def inner(*args, **kwargs):
            username = input('请输入用户名').strip()
            passwold = input('请输入密码').strip()
            if a == '1':
                if username == 'tank' and passwold == '123':
                    print('验证成功')
                    res = func(*args, **kwargs)
                    return res
                else:
                    print('验证失败')
            elif a == '2':
                for i in user_name_dict:
                    user_dict = user_name_dict.get(i)
                    temp_list = user_dict.values()
                    if username in temp_list and passwold in temp_list:
                        print('验证成功')
                        res = func(*args, **kwargs)
                        return res
                else:
                    print('验证失败')
            elif a == '3':
                with open(r'userinfo.txt', 'r', encoding='utf8') as f:
                    for i in f:
                        real_name, real_pwd = i.split('|')
                        if real_name == username and real_pwd.strip('\n') == passwold:
                            print('验证成功')
                            res = func(*args, **kwargs)
                            return res
                    else:
                        print('验证失败')

        return inner

    return outer1


@outer('1')
def foo1():
    print('写好的用户名和密码')


@outer('2')
def foo2():
    print('字典校验')


@outer('3')
def txt():
    print('文件验证')


data_dict = {
    '1': foo1,
    '2': foo2,
    '3': txt
}

while True:
    print("""
         1.固定登录
         2.字典校验
         3.文件校验
         """)
    choice = input('请输入你想要执行的功能').strip()
    if choice in data_dict:
        num = data_dict.get(choice)()

标签:return,递归函数,args,多层,语法,func,kwargs,print,def
From: https://www.cnblogs.com/LiaJi/p/16785963.html

相关文章

  • 装饰器补充和递归函数
    装饰器补充和递归函数多层语法糖问题我们在写代码时可能会遇到同一个函数用多个语法糖来装饰,那么他们之间的关系是什么,怎么执行的就需要看一下下面这段代码了defoutter......
  • python基础之多层语法糖、函数递归
    python基础之多层语法糖、函数递归目录一、多层语法糖二、装饰器模版三、装饰器修复技术四、函数的递归调用1.函数的递归调用2.递归函数的定义3.递归函数的特点4.递归函数......
  • 多层语法糖+递归
    今日内容多层语法糖defoutter1(func1):#1先看函数print('加载了outter1')defwrapper1(*args,**kwargs):print('执行力wrapper1')re......
  • 多层语法糖、装饰器、递归函数
    多层语法糖、装饰器、递归函数目录多层语法糖、装饰器、递归函数一、多层语法糖二、有参装饰器三、装饰器模板1、最常用的无参装饰器2、不常用的有参装饰器四、装饰器修复......
  • Java基础语法 数组的默认初始化值
    默认初始化值packagecom.ljg.java;/**⑤数组元素的默认初始化值* >数组元素是整型:0* >数组元素是浮点型:0.0* >数组元素是char型:0或'\u0000',而非'0'......
  • 装饰器、递归函数,语法糖
    目录作业讲解多层语法糖问题有参装饰器装饰器模版装饰器修复技术递归函数作业作业讲解1.编写一个用户认证装饰器函数:registerlogintransferwithdraw基本要求......
  • day13装饰器以及递归函数
    目录今日内容概要今日内容详细多层语法糖有参装饰器装饰器模板null装饰器修复技术递归函数作业今日内容概要多层语法糖问题有参装饰器装饰器修复技术递归函数今......
  • 杂谈:我为啥不喜欢用新语法不喜欢用动态语句
    最近接手的代码,怎么说呢?原作者水平肯定是有的,而且很高。但是明显的一个感觉就是他特别喜欢用动态语句。喜欢用一些新语法。后来的一些改动,比较大的时候我直接就把动......
  • 装饰器的补充与递归函数
    多层语法糖defoutter1(func1):print('加载了outter1')defwrapper1(*args,**kwargs):print('执行了wrapper1')res1=func1(*args,**kwarg......
  • 多层语法糖、有参装饰器、装饰器修复技术、递归函数
    多层语法糖defoutter1(func1):print('加载了outter1')defwrapper1(*args,**kwargs):print('执行了wrapper1')res1=func1(*args,**kwar......