首页 > 编程语言 >Python基础13

Python基础13

时间:2022-10-12 20:01:00浏览次数:47  
标签:13 return Python res 基础 func kwargs print def

今日内容概要

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

今日内容详细

多层语法糖

'''
多层语法糖 加载顺序由下往上
每次执行之后如果上面还有语法糖 则直接将返回值函数名传给上面的语法糖
如果上面没有语法糖了 则变形index = outer1(inner2)
'''
def outer1(func1):
    print('执行了outer1')
    def inner1(*args, **kwargs):
        print('执行了inner1')
        res1 = func1(*args, **kwargs)
        return res1
    return inner1

def outer2(func2):
    print('执行了outer2')
    def inner2(*args, **kwargs):
        print('执行了inner2')
        res2 = func2(*args, **kwargs)
        return res2
    return inner2

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

@outer1
@outer2 
@outer3 
def index():
    print('from index')

index()

有参装饰器

'''当装饰器中需要额外的参数时 得使用有参装饰器'''
# 在外层再套用一个函数 用于接收额外的参数
'''示例'''
def outer(a): 
	def login_auth(func):
		def inner(*args, **kwargs):
			if a = '1':
				print("条件成立执行的代码")
				res = func(*args, **kwargs)
				return res
			elif a = '2':
				print("条件成立执行的代码")
				res = func(*args, **kwargs)
				return res
			elif a = '3':
				print("条件成立执行的代码")
				res = func(*args, **kwargs)
				return res
		return inner
	return login_auth

'''
函数名加括号先执行 优先级最高 有参装饰器的情况
	先看函数名加括号的执行
	然后再是语法糖的操作
'''
@outer('1')  # 在这给有参装饰器传参
def index():
    print('from index')
index()

装饰器模板

'''最常用的无参装饰器模板'''
def outer(func_name):
    def inner(*args, **kwargs):
        res = func_name(*args, **kwargs)
        return res
    return inner
@outer
def index():
    pass

'''不常用的有参装饰器模板'''
def outer_plus(a): 
	def outer(func_name):
		def inner(*args, **kwargs):
			res = func_name(*args, **kwargs)
			return res
		return inner
	return outer

@outer_plus('a')
def func():
    pass

装饰器修复技术

'''
当其他人不会用被装饰的函数时可能会用help查看,这时就会暴露 会显示出其实是执行了其他函数实现的 这时候就可以通过导入模块functools下的wraps实现 让其他人即使使用了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

递归函数

1.函数的递归调用
	函数直接或者间接的调用了函数自身
	'''直接调用'''
	def func():
        print('from func')
        func()  # 自身调用自身 会一直执行直到达到最大递归深度
	func()   
	'''间接调用'''
	def func1():
        print('from func1')
        func2()
	def func2():
        print('from func2')
        func1() 
	func1()
	'''最大递归深度:python解释器添加的安全措施 官网提供的最大递归深度为10001 我们在测试的时候可能会出现996 997 998'''
    
2.递归函数
	直接或者间接调用自己
	每次调用都必须必上一次简单 并且需要有一个明确的结束条件
		递归:一层层往下
		回溯:基于明确的结果一层层往上
        
'''递归函数案例  
求第一个人年龄 第二个人比第一个人小两岁 第三个人比第二个人小两岁 第四个人比第三个人小两岁 第五个人18岁比第四个人小两岁
'''
def get_age(n):
    if n == 1:
        return 18
    return get_age(n-1) + 2
res = get_age(5)
print(res)

作业

'''1.利用递归函数依次打印列表中每一个数据值
	l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]'''
l1 = [1, [2, [3, [4, [5, [6, [7, [8, ]]]]]]]]


def func(j):
    for i in j:
        if type(i) == list:
            func(i)
        else:
            print(i)


func(l1)

'''2.利用有参装饰器编写多种用户登录校验策略'''
l2 = [['jason', '123'], ['jack', '234']]
d1 = {'jason': {'name': 'jason', 'pwd': '123'}, 'kevin': {'name': 'kevin', 'pwd': '234'}}


def outer(a):
    def login_auth(func):
        def inner(*args, **kwargs):
            username = input('请输入用户名:').strip()
            password = input('请输入密码:').strip()
            if a == '1':
                if username == 'jason' and password == '123':
                    print('登陆成功')
                    res = func(*args, **kwargs)
                    return res
                print('用户名或密码错误')
            elif a == '2':  # 列表
                for i in l2:
                    if username == i[0] and password == i[1]:
                        print('登陆成功')
                        res = func(*args, **kwargs)
                        return res
                print('用户名或密码错误')
            elif a == '3':  # 字典
                if username in d1:
                    b = d1.get(username)
                    name, pwd = b.values()
                    if username == name and password == pwd:
                        print('登陆成功')
                        res = func(*args, **kwargs)
                        return res
                print('用户名或密码错误')
            elif a == '4':  # 文件 需要提前创建
                with open('text', 'r', encoding='utf8') as f:
                    for i in f:
                        name, pwd = i.strip().split('|')
                        if username == name and password == pwd:
                            print('登陆成功')
                            res = func(*args, **kwargs)
                            return res
                    print('用户名或密码错误')
            else:
                print('没有')

        return inner

    return login_auth


@outer('3')
def login():
    print('from login')


login()


@outer('2')
def login1():
    print('from login1')


login1()


@outer('1')
def login2():
    print('from login2')


login2()

标签:13,return,Python,res,基础,func,kwargs,print,def
From: https://www.cnblogs.com/lzjjjj/p/16785766.html

相关文章

  • Python解决千年虫问题
    #避免千年虫(日期bug)问题千年虫:部分计算机程序使用年份后两位作为记录年份,当日期跳转到00时候,默认会解析为1900,造成系统紊乱lst=[45,89,1998,00,75,33,1968,37,1958,90]l......
  • day13装饰器以及递归函数
    目录今日内容概要今日内容详细多层语法糖有参装饰器装饰器模板null装饰器修复技术递归函数作业今日内容概要多层语法糖问题有参装饰器装饰器修复技术递归函数今......
  • Python生成10个八位随机密码
    #生成10个八位随机密码importrandomlst1=[chr(i)foriinrange(97,123)]#生成26为字母列表lst2=[iforiinrange(0,10)]#生成0-9数字列表result=lst1+lst2#......
  • python爬虫博客
    importrequestsimportjsonfrompprintimportpprintfrombs4importBeautifulSoupurl="https://www.cnblogs.com/AggSite/AggSitePostList"headers={#"content-ty......
  • [python] JSON
    [python]JSONJSON(JavaScriptObjectNotation,JS对象标记)是一种轻量级的数据交换格式。JSON的数据格式其实就是python里面的字典格式,里面可以包含方括号括起来的数......
  • json python
    jsonpython阅读目录序列化模块json模块回到顶部序列化模块1,定义序列化:就是将一种数据结构(如字典,裂变)等转换成一个特殊的序列(字符串或者bytes)的过程就叫序列化序列化......
  • python 装饰器
    参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017451662295584https://blog.csdn.net/zhh763984017/article/details/120072425......
  • 概要13
    今日内容回顾目录今日内容回顾多层语法糖有参装饰器无参、有参装饰器模板装饰器修复技术递归函数练习多层语法糖有参装饰器装饰器模板装饰器修复技术递归函数多层......
  • python第十三课---
    昨日内容回顾global与nonlocal关键字global 用于局部名称空间修改全局名称空间中的名字绑定关系nonlocal 用于局部名称空间修改外层局部名称空间中的名字绑定关系......
  • 老司机学swoole之基础进阶篇(进程篇)2019年swoole基础进阶之进程篇
    0资料收集视频地址https://www.bilibili.com/video/BV1oJ411U7bc/?vd_source=4a69745b599dffec877b0fcfe130b0921设置自定义进程名称2创建第一个子进程、获取子进程......