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

# 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. extjs4权限管理,actioncolumn列显示隐藏或禁用

    //隐藏getClass: function(v, meta, rec) { if ( someCondition ) { return 'x-hidden' } }//加入其他样式getClass: ...

  2. 转:RESTful架构详解

    http://kb.cnblogs.com/page/512047/ REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. ...

  3. 淘宝分布式配置管理服务Diamond

    转载:http://blog.csdn.net/kevinlynx/article/details/40017109 在一个分布式环境中,同类型的服务往往会部署很多实例.这些实例使用了一些配置,为了更 ...

  4. Python CODE——Nonblocking I/O client AND Delaying Server

    #!Nonblocking I/O - Chapter 5 -pollclient.py import socket,sys,select port=51423 host='localhost' sp ...

  5. $ gulp watch 运行出错解决方法

    $ gulp watch 运行出错解决方法   $ gulp watch     如果你出现了如下报错信息: gulp-notify: [Laravel Elixir] Browserify Fail ...

  6. 【Oracle】查找每期数据都存在的产品

    现在存在以下数据 如上图:A01与A02同时存在201710.201711.201712中 我们现在要将其查找出来 如果上图的表结构如下: 那么查询的SQL如下: SELECT DISTINCT CO ...

  7. Oracle 数字操作。数字函数。mod(),trunc(),round(),ceil(),floor的使用

    1,取整函数(ceil 向上取整,floor 向下取整) 第一种方式: ) from dual -- 取整 trunc (1.9) = 1 第二种方式 select ceil(66.6) N1,flo ...

  8. android adt 最新下载地址23.03

    打开这个网址就可以看到adt的详细信息:  http://developer.android.com/sdk/installing/installing-adt.html 或者直接在你的eclipse ...

  9. C# socket编程 使用udp实现单对单的连接对话

    ipLocalPoint = new IPEndPoint(IPAddress.Parse("192.168.31.122"), 5000); //定义网络类型,数据连接类型和网络 ...

  10. .net面试中的一些常见问题与答案

    1.页面传值的方式及其优缺点?   Session,Application,Cookies,Requst.QueryString,Requst.Form,Server.Transfer(通过Conte ...