王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594

复习

    1.装饰器
开发原则:开放封闭原则
作用:不改变原函数的调用方式,为函数前后扩展功能
本质:闭包函数
from functools import wraps
def wrapper(f):
@wraps(f)
def inner(*args, **kwargs):
增加功能语句
ret = f(*args, **kwargs)
return ret
return inner
@wrapper

学习内容

装饰器进阶
1.functool.wraps
2.带参数的装饰器
* 接收聚合;传递打散
多个装饰器装饰同一个函数

代码区

1. 装饰器

def outer(*args):
print(args)
print(*args) def inner(*args):
print('inner', args)
inner(*args) outer(1, 2, 3, 4) # (* 接收聚合;传递打散)

2.带参数的装饰器

from functools import wraps
import time
flag = False
def timer_out(flag):
def wrapper(f):
@wraps(f)
def inner(*args, **kwargs):
if flag:
start = time.time()
ret = f(*args, **kwargs)
end = time.time()
print(end - start)
return ret
else:
ret = f(*args, **kwargs)
return ret
return inner
return wrapper @timer_out(flag)
def wahaha():
time.sleep(0.01)
print('娃哈哈') # wahaha = wrapper(wahaha) wahaha()
print(wahaha.__name__)

3.多个装饰器装饰一个函数

def wrapper1(func):   #  func-----f
def inner1():
print('wrapper1_before')
func()
print('wrapper1_after')
return inner1 def wrapper2(func): # inner1
def inner2():
print('wrapper_2_before')
func()
print('wrapper2_after')
return inner2 @wrapper2 # f = wrapper2(f) f----inner2
@wrapper1 # f = wrapper1(f) f----inner1
def f():
print('in f') f()

4.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),# 要求登录成功一次,后续的函数都无需再输入用户名和密码

Flag = True
c = 1 def outer(flag):
def wrapper(f):
def inner(*args, **kwargs):
global c
li = []
with open('log', 'r', encoding='utf-8') as f1:
for line in f1:
li.append(line)
li[0] = li[0].strip()
if flag and c:
user_acc = input('请输入账号')
user_ans = input('请输入密码')
if user_acc == li[0] and user_ans == li[1]:
print('认证成功,执行函数')
ret = f(*args, **kwargs)
c = 0
return ret
else:
print('认证失败,返回')
else:
ret = f(*args, **kwargs)
return ret
return inner
return wrapper
@outer(Flag)
def wahaha():
print('娃哈哈函数体')
@outer(Flag)
def qqxing():
print('QQ星函数体') wahaha()
qqxing()
'''
# 老师答案
'''
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()

5.编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件

'''
from functools import wraps
def wrapper(f):
@wraps(f)
def inner(*args,**kwargs):
li = []
ret = f(*args,**kwargs)
with open('log1','r',encoding='utf-8') as f1, open('log1.bak','w',encoding='utf-8') as f2:
for line in f1:
li.append(line)
li.append(inner.__name__)
f2.writelines(li)
import os
os.remove('log1')
os.rename('log1.bak', 'log1')
return ret
return inner
@wrapper
def wahaha():
print('娃哈哈函数体')
@wrapper
def qqxing():
print('QQ星函数体') wahaha()
qqxing()
'''
# 老师答案
'''
# 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()
# shoplist_del()
# shoplist_del()
# shoplist_del()
# shoplist_del()
# shoplist_del()
'''

6.# 进阶作业(选做):

# 1.编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果
# 2.为题目1编写装饰器,实现缓存网页内容的功能:
# 具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则,就去下载,然后存到文件中
import os
from urllib.request import urlopen
def cache(func):
def inner(*args, **kwargs):
if os.path.getsize('web_cache'):
with open('web_cache','rb') as f:
return f.read()
ret = func(*args, **kwargs)
with open('web_cache','wb') as f:
f.write(b'********' + ret)
return ret
return inner @cache
def get(url):
code = urlopen(url).read()
return code
ret = get('http://www.baidu.com')
print(ret)
ret = get('http://www.baidu.com')
print(ret)
ret = get('http://www.baidu.com')
print(ret)
 

python之路——12的更多相关文章

  1. 【python之路12】三元运算符(if)

    1.三元运算符条件语句 普通if条件是这样写的: n = 1 if n > 0: st = '大于0' else: st = '小于等于0' print(st) 三元运算符的写法: n = 1 ...

  2. python之路---12 生成器 推导式

    三十.函数进阶 1.生成器    函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器   一个一个的创建对象     节省内存 ①创建生成器       最后以yield结束 ...

  3. Python之路【第一篇】python基础

    一.python开发 1.开发: 1)高级语言:python .Java .PHP. C#  Go ruby  c++  ===>字节码 2)低级语言:c .汇编 2.语言之间的对比: 1)py ...

  4. python之路 目录

    目录 python python_基础总结1 python由来 字符编码 注释 pyc文件 python变量 导入模块 获取用户输入 流程控制if while python 基础2 编码转换 pych ...

  5. Python之路【第十九篇】:爬虫

    Python之路[第十九篇]:爬虫   网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...

  6. Python之路【第十八篇】:Web框架们

    Python之路[第十八篇]:Web框架们   Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Pytho ...

  7. Python之路【第十七篇】:Django【进阶篇 】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  8. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

  9. Python之路【第十五篇】:Web框架

    Python之路[第十五篇]:Web框架   Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 ...

随机推荐

  1. iOS应该具备知识点

    序言 我相信很多人都在说,iOS行业不好了,iOS现在行情越来越难了,失业的人比找工作的人还要多.失业即相当于转行,跳槽即相当于降低自己的身价.那么做iOS开发的你,你是否在时刻准备着跳槽或者转行了. ...

  2. 创建学生类 有姓名 学校 和年龄 覆盖toString() 1放到集合ArrayList 然后 2在第2个位置插入1个学生信息 3判断 刘德华这个学生是否存在 存在就打出来, 4输出全部学生信息 直接打印对象

    学生类 package com.lanxi.demo1; public class Student { //创建属性 姓名,学校,年龄 private String name; private Str ...

  3. 虚拟机模拟SSD用于Ceph测试

    一.简单介绍 在一些使用场景中,我们需要使用SSD进行测试,如Ceph的分级,OpenStack多种云硬盘配置.在物理设备受限的情况下,我们可以采用模拟SSD的方式进行 二.SSD的标识 在实际的使用 ...

  4. 20165326 java实验五

    实验五 网络编程与安全 一.实验内容 任务一: 结对实现中缀表达式转后缀表达式的功能 MyBC.java 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java 这个代码在 ...

  5. 学习animejs

    1.安装方式 (1)npm install animejs 2.引入 import anime from 'animejs' 3.使用 (anime({ targets: 'div', transla ...

  6. Bitmap每个像素值由指定的掩码决定

    bBitmap每个像素值由指定的掩码决定 写了一个小工具来转换Bitmap彩色图片的不同位数. 程序的逻辑是拼接: Bitmap文件头 + Bitmap信息头 + Bitmap数据 在RGB888转换 ...

  7. FreeMarker基础语法,宏,引用 等

    FreeMarker的插值有如下两种类型: 1,通用插值${expr}; 2,数字格式化插值:#{expr}或#{expr;format} ${book.name?if_exists } //用于判断 ...

  8. 8--Python入门--函数

    函数基本框架如下([]中的内容表示是或选的,可以不写):def 函数名(参数): ['''函数说明文档'''] 函数主体 [return 返回对象] 函数小例子 #我们先定义一个函数 def find ...

  9. python 前端 html

    web 服务本质: 浏览器发出请求--HTTP协议--服务端接收信息----服务端返回响应---服务端把HTML文件发给浏览器--浏览器渲染页面. HTML: 超文本标记语言是一种用于创建网页的标记语 ...

  10. Post Order traverse binary tree using non-recursive way

    Process analysis Stack = 5,  Push 3, Stack = 5, 3.    Pre = 5 Current = 3, Pre = 5, Push 2 to the st ...