装饰器

装饰器篇:
1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码。 def login(func):
def inner(*args, **kwargs):
"""登录程序
"""
username = input('username:')
password = input('password:')
if username == 'boss_gold' and password == '':
ret = func(*args, **kwargs) # func是被装饰的函数
return ret
else:
print('登录失败') return inner @login
def shoplist_add():
print('增加一件物品') @login
def shoplist_del():
print('删除一件物品') shoplist_add()
shoplist_del() # 但是这样有一样不好,就是运行了shoplist_add()之后再运行shoplist_del()还是要输入 用户名和密码。 FLAG = False
def login(func):
def inner(*args, **kwargs):
global FLAG
"""登录程序
"""
if FLAG:
ret = func(*args, **kwargs) # func是被装饰的函数
return ret
else:
username = input('username:')
password = input('password:')
if username == 'boss_gold' and password == '':
FLAG = True
ret = func(*args, **kwargs) # func是被装饰的函数
return ret
else:
print('登录失败') return inner @login
def shoplist_add():
print('增加一件物品') @login
def shoplist_del():
print('删除一件物品') shoplist_add()
shoplist_del() # 2.编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件。 def log(func):
def inner(*args, **kwargs):
with open('log', 'a', encoding='utf-8') as f:
f.write(func.__name__ + '\n')
ret = func(*args, **kwargs)
return ret return inner @log
def shoplist_add():
print('增加一件物品') @log
def shoplist_del():
print('删除一件物品') shoplist_add()

推导式练习题:

1. 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母

1 li = ['qwer','asdf','zxcv','ty','gh','bn','uIo','UIj','plm']
2 lis = [i.upper() for i in li if len(i) >= 3]
3 print(lis)

2. 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表

lis = [(x,y) for x in range(0,6,2) for y in range(1,6,2)]
print(lis)

3. 求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]

M = [[1,2,3],[4,5,6],[7,8,9]]
lis = [i[2] for i in M]
print(lis)

生成器

3.处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕
def check_file(filename,aim):
with open(filename,encoding='utf-8') as f: #句柄 : handler,文件操作符,文件句柄
for i in f:
if aim in i:
yield i g = check_file('1.复习.py','生成器')
for i in g:
print(i.strip()) 4.写生成器,从文件中读取内容,在每一次读取到的内容之前加上‘***’之后再返回给用户。
def check_file(filename):
with open(filename,encoding='utf-8') as f: #句柄 : handler,文件操作符,文件句柄
for i in f:
yield '***'+i for i in check_file('1.复习.py'):
print(i.strip())

默写

a. 生成器函数
获取移动平均值例子:

def init(func):
def inner(*args,**kwargs):
ret = func(*args,**kwargs)
ret.__next__()
return ret
return inner
@init
def average():
average = 0
count = 0
sum = 0
while 1:
num = yield average
sum += num
count += 1
average = sum/count
ret = average()
print(ret.send(10))
print(ret.send(20))

Python练习_装饰器、生成器_day12的更多相关文章

  1. python三大器(装饰器/生成器/迭代器)

    1装饰器 1.1基本结构 def 外层函数(参数): def 内层函数(*args,**kwargs); return 参数(*args,**kwargs) return 内层函数 @外层函数 def ...

  2. 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化

    文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...

  3. Python之迭代器&装饰器&生成器&正则

    1.迭代器 迭代器是访问数据集合的一种方式,它只能从集合的第一个元素开始顺序访问,直到最后一个元素结束.类似于linux里的cat命令,只能挨行读取文本内容,不可以跳到中间或者尾部读取(不会把所有的数 ...

  4. python语法_装饰器

    装饰器的知识点储备: 1 作用域 2 高阶函数 3 闭包 内部函数,对外部作用作用域的变量进行了引用,该内部函数就认为是闭包, def outer(): x=10 def inner(): print ...

  5. Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle

    目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...

  6. python笔记 - day4-之装饰器

                 python笔记 - day4-之装饰器 需求: 给f1~f100增加个log: def outer(): #定义增加的log print("log") ...

  7. Python深入05 装饰器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...

  8. Day04 - Python 迭代器、装饰器、软件开发规范

    1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...

  9. Day11 Python基础之装饰器(高级函数)(九)

    在python中,装饰器.生成器和迭代器是特别重要的高级函数   https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...

随机推荐

  1. python 使微信自动回复

    https://zhuanlan.zhihu.com/p/308999073 今天是鄙人的生日,欢luo过后想写点关于itchat的文章~ (不小心暴露年龄了,是的,我已经16岁了~~) 言归正传,这 ...

  2. SQL-W3School-总结:SQL 快速参考

    ylbtech-SQL-W3School-总结:SQL 快速参考 1.返回顶部 1. 来自 W3School 的 SQL 快速参考.可以打印它,以备日常使用. SQL 语句 语句 语法 AND / O ...

  3. 最新解决Chrome(版本76.0.3809.100) “请停用以开发者模式运行的扩展程序”的方法

    最新解决Chrome(版本76.0.3809.100) “请停用以开发者模式运行的扩展程序”的方法 最近在远景论坛上发现了最新的解决Chrome浏览器提示:请停用以开发者模式运行的扩展程序的问题.该方 ...

  4. proj-6.1.1 编译

    Requiring C++11 Requiring C++11 - done Configuring PROJ: PROJ_VERSION = 6.1.1 PROJ_ABI_VERSION = 6_1 ...

  5. 严重性 代码 说明 项目 文件 行 禁止显示状态错误 C1128 节数超过对象文件格式限制: 请使用 /bigobj 进行编译。

    严重性 代码 说明 项目 文件 行 禁止显示状态错误 C1128 节数超过对象文件格式限制: 请使用 /bigobj 进行编译. 默认情况下,对象文件最多可存放 65,536 (2^16) 个可寻址的 ...

  6. linux修改配置文件解决mysql中文乱码和指定数据库存储引擎

    如题,mysql数据库的中文显示乱码: 先看下原来数据库里的字符编码: mysql> show variables like '%character_set%'; +-------------- ...

  7. 静态文件cdn自解析生成相对路径

    一.场景和目标:      用户上传一个包含 index.html 的静态资源压缩包,资源内所有文件都是相互依赖的,不需要用户对内部文件内容做任何特殊处理,仅通过服务端逻辑处理达到用户访问 http: ...

  8. 五句话搞定Python、JavaScript作用域

    这个银角的看家之作了吧,哈哈哈,剽窃下,原地址在这:点我点我 Python与JavaScript基本相同,但声明提前一项略有不同. JavaScript.Python中无块级作用域 在Java或C#中 ...

  9. shuffle 打乱一维数组

    <?php $arr = range(,); print_r($arr); echo '<br />'; shuffle($arr); print_r($arr); ?> Ar ...

  10. otepad++ 配置 支持jquery、html、css、javascript、php代码提示

    官网下载:http://notepad-plus-plus.org/ 获取插件的方法:打开软件,窗口工具栏有有一个问号,点获取插件. 我使用的插件(安装方法都是官方的方法): QuickText.v0 ...