一、带参数的装饰器 (必须会)

针对不同的app的验证,比如:天猫和天猫超市,京东商城和京东超市

def wrapper_out(n):
print(n)
def wrapper(f):
def inner(*args,**kwargs):
if n == '腾讯':
user_input = input('请输入用户名: ').strip()
pass_input = input('请输入密码: ').strip()
with open('qq.txt',mode='r+',encoding='utf-8') as f1:
for i in f1:
username,password = i.strip().split('|')
if username == user_input and password == pass_input:
print('登录成功')
ret = f(*args,**kwargs)
return ret
return False
elif n == '抖音':
user_input = input('请输入用户名: ').strip()
pass_input = input('请输入密码: ').strip()
with open('dy.txt',mode='r+',encoding='utf-8') as f2:
for j in f2:
username, password = j.strip().split('|')
if username == user_input and password == pass_input:
print('登录成功')
ret = f(*args, **kwargs)
return ret
return False
return inner
return wrapper @wrapper_out('腾讯')
def qq():
print('成功访问qq')
qq() @wrapper_out('抖音')
def tiktok():
print('成功访问抖音')
tiktok()

函数一般嵌套3层

def wrapper_out(n):
def wrapper(f):
def inner(*args,**kwargs):
with open(n,encoding = 'utf-8') as f1:
for line in f1:
user,pass = line.strip().split('|')
username = input('请输入用户名: ').strip()
password = input('请输入密码: ').strip()
if username == user and passwor == pass:
dic_status['status'] = True
ret = f(*args,**kwargs)
return ret

看到带参数的装饰器分两步执行:

1.执行warpper_out('腾讯')这个函数,把相应的参数'腾讯'传给n,并且得到返回值warpper
2.与@warpper结合,得到我们之前熟悉的标准版的装饰器按照装饰器流程执行

练习题

# 如果输入的是抖音的账号和密码就访问抖音,如果输入的是腾讯的用户名和密码就访问腾讯

def wrapper_out(n):
print(n)
def wrapper(f):
def inner(*args,**kwargs):
if n == '腾讯':
user_input = input('请输入用户名: ').strip()
pass_input = input('请输入密码: ').strip()
with open('qq.txt',mode='r+',encoding='utf-8') as f1:
for i in f1:
username,password = i.strip().split('|')
if username == user_input and password == pass_input:
print('登录成功')
ret = f(*args,**kwargs)
return ret
return False
elif n == '抖音':
user_input = input('请输入用户名: ').strip()
pass_input = input('请输入密码: ').strip()
with open('dy.txt',mode='r+',encoding='utf-8') as f2:
for j in f2:
username, password = j.strip().split('|')
if username == user_input and password == pass_input:
print('登录成功')
ret = f(*args, **kwargs)
return ret
return False
return inner
return wrapper @wrapper_out('腾讯')
def qq():
print('成功访问qq')
qq() @wrapper_out('抖音')
def tiktok():
print('成功访问抖音')
tiktok()

增强耦合性写法

def wrapper_out(n):
def wrapper(f):
def inner(*args,**kwargs):
user_input = input('请输入用户名: ').strip()
pass_input = input('请输入密码: ').strip()
with open(n,mode='r',encoding='utf-8') as f1:
for i in f1:
username,password = i.strip().split('|')
if username == user_input and password == pass_input:
print('登录成功')
ret = f(*args,**kwargs)
return ret
else:
print('验证失败')
return False
return inner
return wrapper @wrapper_out('qq')
def qq():
print('成功访问qq')
qq() @wrapper_out('dy')
def tiktok():
print('成功访问抖音')
tiktok()

二、多个装饰器装饰一个函数 (流程会)

def wrapper1(func1):  # func1 = f原函数
def inner1():
print('wrapper1 ,before func') # 2
func1()
print('wrapper1 ,after func') # 4
return inner1 def wrapper2(func2): # func2 == inner1
def inner2():
print('wrapper2 ,before func') # 1
func2() # inner1
print('wrapper2 ,after func') # 5
return inner2 @wrapper2 # f = wrapper2(f) 里面的f == inner1 外面的f == inner2
@wrapper1 # f = wrapper1(f) 里面的f == func1 外面的 f == inner1
def f():
print('in f') # 3 f() # inner2() # 输出结果
wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper2 ,after func

三、递归函数 (练习题,作业题会做*)

递归就是自己用自己

官网规定: 默认递归的最大深度1000次

如果你递归超过100次还没有解决这个问题,那么执意使用递归,效率很低

形式

def func(n):
print(n)
n += 1
func(n)
func(1)

练习题

# 查看电脑执行次数
import sys
print(sys.setrecursionlimit(1000000))
def func(n):
print(n)
n += 1
func(n)
func(1)
def age(n):
if n == 1:
return 18
else:
return age(n-1) + 2
print(age(4))
# 输出结果
24 #
l1 = [1, 3, 5, ['太白','元宝', 34, [33, 55, [11,33]]], [77, 88],66]
def func(n):
for i in n:
if type(i) == list:
func(i)
else:
print(i)
func(l1)
# 输出结果
1
3
5
太白
元宝
34
33
55
11
33
77
88
66

python之装饰器的进阶的更多相关文章

  1. 进阶Python:装饰器 全面详解

    进阶Python:装饰器 前言 前段时间我发了一篇讲解Python调试工具PySnooper的文章,在那篇文章开始一部分我简单的介绍了一下装饰器,文章发出之后有几位同学说"终于了解装饰器的用 ...

  2. 【转】详解Python的装饰器

    原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...

  3. 详解Python的装饰器

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  4. 详解python的装饰器decorator

    装饰器本质上是一个python函数,它可以让其它函数在不需要任何代码改动的情况下增加额外的功能. 装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志,性能测试,事务处理,缓存, ...

  5. Python各式装饰器

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  6. Python札记 -- 装饰器补充

    本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...

  7. python基础——装饰器

    python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...

  8. 两个实用的Python的装饰器

    两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...

  9. python 基础——装饰器

    python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...

随机推荐

  1. nexus7入手

    平板一直关注了很久了,关键是不知道平板对我来说,拿它来做什么用.所以,一直也就是关注,也没有决心买了. 终于这次出手了,N7,到货了! 照片是原生的android系统,不习惯,不习惯,直接用刷机精灵, ...

  2. Redis list实现原理 - 双向循环链表

    双向链表 双向表示每个节点知道自己的直接前驱和直接后继,每个节点需要三个域 查找方向可以是从左往右也可以是从右往左,但是要实现从右往左还需要终端节点的地址,所以通常会设计成双向的循环链表; 双向的循环 ...

  3. nvm安装以及注意事项

    nvm初衷:由于以后的开发工作可能会在多个Node版本中测试,而且Node的版本也比较多,所以需要这么款工具来管理 1. 下载:[nvm-windows](https://github.com/cor ...

  4. 第二章 表与指针Pro SQL Server Internal (Dmitri Korotkev)

    聚集索引 聚集索引就是表中数据的物理顺序,它是按照聚集索引分类的.表只能定义一个聚集索引. 如果你要在一个有数据的堆表中创建一个聚集索引,如2-5所示,第一步要做的就是SQL服务器创建另一个根据聚集索 ...

  5. 一篇文章彻底说清JS的深拷贝/浅拷贝

    一篇文章彻底说清JS的深拷贝and浅拷贝 这篇文章的受众 第一类,业务需要,急需知道如何深拷贝JS对象的开发者. 第二类,希望扎实JS基础,将来好去面试官前秀操作的好学者. 写给第一类读者 你只需要一 ...

  6. 简单易懂的Servlet路径问题

    关于servlet路径,我看了一下网上别人的博客园,发现都有一个通病,讲的太专业了,又抓不住关键部分,往往看一眼就不想看第二眼.所以我特地准备了初学者所通识的servlet路径问题. 1.标识符 /j ...

  7. Nuxt简单使用Google/Baidu Analyze

    博客地址: https://www.seyana.life/post/17 具体账号注册方法和绑定方法可以去到官网下,都有相应的指南, 一般设置也比较简单,只需要把对应js代码添加到head中即可, ...

  8. vuex和localStorage,全局变量的区别

    vuex是状态管理,是为了解决跨组件之间数据共享问题的,一个组件的数据变化会映射到使用这个数据的其他组件当中.如果刷新页面,之前存储的vuex数据全部都会被初始化掉. localStorage是H5提 ...

  9. 洛谷P1000超级马里奥的神奇解法

    话说上过洛谷的都知道,有一道经典例题P1000超级马里奥,这一题,可以说是非常简单非常经典,但是就算如此,还是可以人才辈出,我是个比较循规蹈矩的人(雾),所以我的代码就比较平常,也就是直接输出了所要求 ...

  10. Python 【绘制图及turtle库的使用】

    前言 最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,整理了一下,挑了一些觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~赶快去试一下吧) one ...