day12闭包,装饰器
一、闭包:内部函数引用了外部函数的变量.
# f1()
#闭包的定义
#内部的函数引用了外部函数的变量 # def f1(b): #闭包的常用状态
# def f2():
# print(b)
# return f2
#内部函数返回一个值到全局
# def f1(): #从内部函数返回一个值到全局
# b = 10
# def f2():
# return b
# return f2()
#
# print(f1())
def f1():
a = 1
def f2():
def f3():
print(a)
f3()
print('f3 : ',f3.__closure__)
f2()
print('f2 : ',f2.__closure__) f1() #__closure__ 用来查看是否是 闭包 cell就是调用的元素 三层的嵌套,f23调用了外层的元素,那么f2也是闭包了
从某个网页读取网页内容
from urllib.request import urlopen
# ret = urlopen('http://www.cnblogs.com/Eva-J/articles/7194277.html').read()
# print(ret)
def get_url(url):
def read1():
ret = urlopen(url).read()
print(ret)
return read1 read_func = get_url('http://www.cnblogs.com/Eva-J/articles/7194277.html') #结果是bytes类型。写入文件再打开就完成了转码
read_func()
read_func()
二、装饰器:
#装饰器的作用
# 在不改变函数的调用方式的情况下,给函数的前后添加新的功能 #从最简单的装饰器
def timmer(qqxing): #timmer是装饰器的名字,传入的参数就是被装饰的函数
def inner(): #在装饰器中需要定义一个内部函数
print('调用func之前')
qqxing() #被装饰的函数,并且要执行
print('调用func之后')
return inner #将内部函数的名字返回 @timmer #语法糖 func = timmer(func)
def func():
print('公司好老板好同事好') # func()
# 完整的装饰-万能的装饰
def timmer(qqxing): #timmer是装饰器的名字,传入的参数就是被装饰的函数
def inner(*args,**kwargs): #在装饰器中需要定义一个内部函数
print('调用func之前')
ret = qqxing(*args,**kwargs) #被装饰的函数,并且要执行
print('调用func之后')
return ret
return inner #将内部函数的名字返回 @timmer #语法糖 func = timmer(func)
def func(name):
print('%s的公司好老板好同事好'%(name))
return 1111111111 ret = func('俊杰')
print('result : %s'%ret) #装饰器的固定结构
def wrapper(func):
def inner(*args,**kwargs):
"""被装饰函数执行之前要添加的代码"""
ret = func(*args,**kwargs)
"""被装饰函数执行之后要添加的代码"""
return ret
return inner
两个案例:1.一次认证,多次访问 2.将当前调用函数的日志记录在文件里
#概念
#开放封闭原则
#开放
#对扩展是开放的 #封闭
#对修改是封闭的 #装饰器:开放封闭原则
#一次认证多次免登陆
flag = False
def login(func):
def inner(*args,**kwargs):
global flag
if flag == False:
username = input('用户名:')
password = input('密码:')
if username == 'alex' and password == 'somebody':
print('登录成功')
flag = True
if flag == True:
ret = func(*args,**kwargs)
return ret
return inner @login
def art():
print('欢迎来到文章页') @login
def dar():
print('欢迎来到日记页') #用装饰器实现,访问art或者dar函数,登陆一次之后,无需再次登录
# art()
# dar() def log(func):
def inner(*args,**kwargs):
print('你要调用%s函数了'%func.__name__)
ret = func(*args,**kwargs)
return ret
return inner @log
def f1():
print('f1')
@log
def f2():
print('f2') #日志
f1()
f2()
三层装饰器:
# def auth():
# def auth2(func):
# def wrapper(*args,**kwargs):
# name=input("user: ")
# pwd=input("pwd: ")
#
# if True:
# if name == 'egon' and pwd == '123':
# print('login successful')
# res=func(*args,**kwargs)
# return res
# else:
# print('ldap')
# return wrapper
# return auth2
# @auth() # foo = auth(driver='file')(foo) 三层的话 语法糖那里要带上括号
# def foo(name):
# print(name)
# foo('egon')
day12闭包,装饰器的更多相关文章
- 多进程,多线程,使用sqlalchemy 创建引擎(单例模式),闭包装饰器承载数据库会话,装饰模型类的类方法
python 多进程,多线程,使用 sqlalchemy 对数据库进行操作 创建引擎 & 获取数据库会话: 使用类的方式,然后在对象方法中去创建数据库引擎(使用单例,确保只创建一个对象,方法里 ...
- 闭包&装饰器详解
闭包 先不着急看闭包的定义,让我们从一段示例代码开始.如果将上一个示例稍微修改下: >>> def outer(): ... x = 1 ... def inner(): ... p ...
- 【Python】 闭包&装饰器
python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...
- DAY12、装饰器
一.补充:nonlocal关键字 1.作用:将L与E(E中的名字需要提前定义)的名字统一 2.应用场景:如果想在被嵌套的函数中修改外部函数变量(名字)的值 3.案例: def outer(): ...
- python 函数名 、闭包 装饰器 day13
1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print ...
- 闭包&装饰器
闭包 1.函数引用 def test(): print('--test--') # 调用函数 test() # 引用函数 ret = test print(id(ret)) print(id(test ...
- day20 Python 高阶函数,函数,嵌套,闭包 装饰器
高阶函数定义 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个都可以称之为高阶函数 一.函数的接收参数是一个函数名 import time def foo(): ...
- python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)
一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...
- day4----函数-闭包-装饰器
本文档内容: 1 python中三种名称空间和作用域 2 函数的使用 3 闭包 4 装饰器 一 python中三种名称空间和作用域 1.1名称空间: 当程序运行时,代码从上至下依次执行,它会将变量与值 ...
- Python闭包装饰器笔记
Python三大器有迭代器,生成器,装饰器,这三个中使用最多,最重要的就是装饰器.本篇将重要从函数嵌套开始讲起,从而引入闭包,装饰器的各种用法等. python中的一切都是一个对象(函数也是) 1.首 ...
随机推荐
- 小二助手-react.js分块加载
小二助手在线演示地址:http://118.25.217.253:8000 账号test 密码123 小二助手是用material-ui开发的,感觉国内使用的人数不是特别多,所以创建了一个qq交流群 ...
- 关于JS里的函数作用域链的总结
在JavaScript中,函数的作用域链是一个很难理解的东西.这是因为JavaScript中函数的作用域链和其他语言比如C.C++中函数的作用域链相差甚远.本文详细解释了JavaScript中与函数的 ...
- yii2 URL重写 nginx的配置
Url的重写 nginx的配置文件 [root@localhost protected]# vim /etc/nginx/conf.d/default.conf server { listen ...
- Docker与PAAS
Docker与PAAS 学习了:https://blog.csdn.net/raindaywhu/article/details/52057103 Docker基于内存的:
- Block系列2:Block内存管理
ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController { UIImag ...
- tomcat优化---大数据量提交tomcat时,tomcat无法接收导致页面无反应
关于tomcat的一个优化问题: 有时候保存大数据量的数据时.tomcat不优化的话,页面会没反应.tomcat后台并不报错,仅仅是提示以下内容: 警告: More than the maximum ...
- 万字总结:学习MySQL优化原理(转)
本文转自:https://www.tuicool.com/wx/2eMBfmq 前言 说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引. ...
- php核心技术与最佳实践知识点(上)
一.基础 1.serialize:序列化一个类,只是保存了类的属性,所以还需要反序列化unserialize的时候包含该类. 2.对于将array转为object,这个转换因为没有具体的类,所以称为了 ...
- spring中使用 @value 简化配置文件的读取
1.在applicationContext.xml文件中配置properties文件 <bean id="propertyConfigurer" class="or ...
- Odoo8中“更多”下拉菜单选项指定后台执行代码
在Odoo8中的仓库模块,根据每日最小安全库存数量,系统会自动生成一些补货单,而且是一个产品会生成一笔,如果产品比较多,这里生成的补货单也会很多. 如果这里的补货单没有即时处理,那相同产品后续不会再生 ...