一、闭包:内部函数引用了外部函数的变量.

# 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闭包,装饰器的更多相关文章

  1. 多进程,多线程,使用sqlalchemy 创建引擎(单例模式),闭包装饰器承载数据库会话,装饰模型类的类方法

    python 多进程,多线程,使用 sqlalchemy 对数据库进行操作 创建引擎 & 获取数据库会话: 使用类的方式,然后在对象方法中去创建数据库引擎(使用单例,确保只创建一个对象,方法里 ...

  2. 闭包&装饰器详解

    闭包 先不着急看闭包的定义,让我们从一段示例代码开始.如果将上一个示例稍微修改下: >>> def outer(): ... x = 1 ... def inner(): ... p ...

  3. 【Python】 闭包&装饰器

    python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...

  4. DAY12、装饰器

    一.补充:nonlocal关键字 1.作用:将L与E(E中的名字需要提前定义)的名字统一 2.应用场景:如果想在被嵌套的函数中修改外部函数变量(名字)的值 3.案例: def outer():    ...

  5. python 函数名 、闭包 装饰器 day13

    1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print ...

  6. 闭包&装饰器

    闭包 1.函数引用 def test(): print('--test--') # 调用函数 test() # 引用函数 ret = test print(id(ret)) print(id(test ...

  7. day20 Python 高阶函数,函数,嵌套,闭包 装饰器

    高阶函数定义 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个都可以称之为高阶函数 一.函数的接收参数是一个函数名 import time def foo(): ...

  8. python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)

    一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...

  9. day4----函数-闭包-装饰器

    本文档内容: 1 python中三种名称空间和作用域 2 函数的使用 3 闭包 4 装饰器 一 python中三种名称空间和作用域 1.1名称空间: 当程序运行时,代码从上至下依次执行,它会将变量与值 ...

  10. Python闭包装饰器笔记

    Python三大器有迭代器,生成器,装饰器,这三个中使用最多,最重要的就是装饰器.本篇将重要从函数嵌套开始讲起,从而引入闭包,装饰器的各种用法等. python中的一切都是一个对象(函数也是) 1.首 ...

随机推荐

  1. OpenGL ES 3.0之Fragment buffer objects(FBO)详解 (转)

    http://www.cnblogs.com/salam/p/4957250.html 片段操作图 这篇文章将介绍从写入帧缓冲和读取帧缓冲的方式. Buffers(缓冲) OpenGL ES支持三种缓 ...

  2. Chrome 37 Beta: 使用Windows的DirectWrite和支持<dialog>元素

    今天的Chrome Beta 发布版包含了许多新的开发者特性.这些特性帮助你制作更丰富的.更迅速的和更引人入胜的网页内容以及应用程序,尤其是移动设备上.除非特别指出,否则下面描述的变化对Android ...

  3. 【UVA】11468-Substring(AC自己主动机)

    AC自己主动机的题,须要注意的,建立失配边的时候,假设结点1失配边连到的那个结点2,那个结点2是一个单词的结尾,那么这个结点1也须要标记成1(由于能够看成,这个结点包括了这个单词),之后在Trie树上 ...

  4. windows lua 多线程 线程同步

    今天在改一个程序,改成部分逻辑用lua写,这个程序是多线程的.将程序中部分逻辑改成lua之后,各种非法访问内存错误,各种奇奇怪怪的问题,不分时间,不分地点的出现崩溃.从调用堆栈来看,基本都是使用lua ...

  5. requireJS目录

    前言 对于像我这种requireJS初学者而言,requireJS最难理解的部分应该是它的路径问题.晚上随便折腾了一下,算是稍微理清了这个目录问题吧. requireJS学习网址:requireJS中 ...

  6. /u200B 8203 Zero-width space 问题

    [TestMethod] public void TestBom() { string str = "123​";//这个字符串是错误的有问题 长度4 ).Select(x =&g ...

  7. filebeat 选项

    Filebeat Options input_type: log|stdin 指定输入类型 paths 支持基本的正则,所有golang glob都支持,支持/var/log/*/*.log enco ...

  8. NIO之直接缓冲区与非直接缓冲区

    直接缓冲区与非直接缓冲区的概念 一.非直接缓冲区 1)创建方式 通过 static ByteBuffer allocate(int capacity) 创建的缓冲区,在JVM中内存中创建,在每次调用基 ...

  9. 贯通tomcat --- 电子书

    http://www.educity.cn/jiaocheng/j10865.html 第1章 认识Tomcat [本章导读] Tomcat服务器是一个免费的开放源代码的Web应用服务器.它是Apac ...

  10. Atitit.atijson 类库的新特性设计与实现 v3 q31

    Atitit.atijson 类库的新特性设计与实现 v3 q31 1. V1版本---集成了多引擎1 2. V2版本新特性 --bsh脚本化2 3. V3版本新特性---循环引用解决使用fastjs ...