闭包函数与装饰器

一、闭包函数

闭包函数:函数内部定义函数,成为内部函数,
该内部函数包含对外部作用域,而不是对全局作用域名字的引用
那么该内部函数成为闭包函数

name='alex'

# def func():

#    name='egon'
#      def bar():
#      print(name)
#    return bar

bar函数为一个闭包函数,它包含了对外部作用域name,并不是去找全局作用域的name

b=func()
print(b)

闭包函数:1 内部函数 2 包含对外部作用域而非全局作用域的引用
闭包函数的特点:
自带作用域
 延迟计算

#定义闭包函数的基本形式

# def 外部函数名():
# 内部函数需要的变量
# def 内部函数():
# 引用外部变量
# return 内部函数

 money=100
# def name():
# name='enon'
# def mo():
# money=10
# def tell_in():
# print('%s have money %s' %(name,money))
# return tell_in
# return mo
# a=name()
# name_money=a()
# print(name_money.__closure__[0].cell_contents)#闭包函数的参数用来判断是否为闭包函数!
# print(name_money.__closure__[1].cell_contents)

二global与nonlocal关键字

x=1
def fuck ():
global x#global 关键字将函数内的局部变量改为全局变量
x=100000
def fuck2():
x=100
def fuck3():
x=1000
print(x)
print(x)
print(x)
fuck()
x=1
def f():
x=2
def d():
nonlocal x#nonlocal关键字将本函数内部的变量改为它上一层变量并且只作用与函数内部!
x=3
def a():
pass
print(x)
f()

三、装饰器

-----------

(1):程序遵循开放封闭原则,对扩展是开放的,对修改是封闭的

(2):装饰器,装饰器本质可以任意可调用对象,被装饰的对象也可以是任意
    可调用对象,
    装饰器的功能是:
    在不修改被装饰对象源代码以及调用方式的前提下为期添加新功能

原则:
1.不修改源代码
2.不修改调用方法
目标:添加新功能

--------------#装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字import timeimport random#装饰器def timmer(func):

   def wrapper():
     start_time = time.time()
      func()
     stop_time=time.time()
     print('run time is %s' %(stop_time-start_time))
    return wrapper
#被装饰函数
@timmer #index=timmer(index) #装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字
def index():
  time.sleep(random.randrange(1,5))
  print('welecome to index page')
@timmer #home=timmer(home)
def home():
  time.sleep(random.randrange(1,3))
  print('welecome to HOME page')

index() #wrapper()
home()

#装饰器修订版这样能满足任意类型和任意类型的实参传入形参!

import time
import random
#装饰器
def timmer(func):
  def wrapper(*args,**kwargs):
    start_time = time.time()
    res=func(*args,**kwargs)
    stop_time=time.time()
    print('run time is %s' %(stop_time-start_time))
    return res
  return wrapper
#被装饰函数

@timmer
def index():
  time.sleep(random.randrange(1,5))
  print('welecome to index page')
@timmer
def home(name):
  time.sleep(random.randrange(1,3))
  print('welecome to %s HOME page' %name)

python基础-------函数(二)的更多相关文章

  1. python基础——函数的参数

    python基础——函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复 ...

  2. Python 基础语法(二)

    Python 基础语法(二) --------------------------------------------接 Python 基础语法(一) ------------------------ ...

  3. Python基础学习二

    Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...

  4. python基础—函数嵌套与闭包

    python基础-函数嵌套与闭包 1.名称空间与作用域 1 名称空间分为: 1 内置名称空间   内置在解释器中的名称 2 全局名称空间   顶头写的名称 3 局部名称空间 2 找一个名称的查找顺序: ...

  5. python基础—函数装饰器

    python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...

  6. Python基础-函数参数

    Python基础-函数参数 写在前面 如非特别说明,下文均基于Python3 摘要 本文详细介绍了函数的各种形参类型,包括位置参数,默认参数值,关键字参数,任意参数列表,强制关键字参数:也介绍了调用函 ...

  7. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  8. python基础知识(二)

    python基础知识(二) 字符串格式化 ​ 格式: % 类型 ---- > ' %类型 ' %(数据) %s 字符串 ​ print(' %s is boy'%('tom')) ----> ...

  9. 第三章:Python基础の函数和文件操作实战

    本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...

  10. 第八章:Python基础の面向对象(二)

    本課主題 面向对象的多态 面向对象的成员 成员修饰符 特殊成员 面向对象其他应用 异常处理 设计模式与单例模式 面向对象的多态 指定参数类型只是多态的一种表现 另外一种是允许自己类型和自己的子类型(典 ...

随机推荐

  1. 如何在制作jar包时引用第三方jar包

    我用的是Eclipse打包,但在CMD窗口执行的时候报“ActiveMQ.jar中没有主清单属性”错误. 在网上搜了下,这个与MANIFEST.MF文件有关,该文件没有定义MAIN方法所在类的路径,利 ...

  2. Scrum Meeting 13-20151221

    任务安排 姓名 今日任务 明日任务 困难 董元财 无(数据库) 网络连接框架优化 无 胡亚坤 无(数据库) 优化商品搜索 无 刘猛 无 无 马汉虎 无 无 赖彦俞 无 无 燃尽图 团队照片 暂无 代码 ...

  3. archive成功了,但是在输出ipa时要求有账号密码

    archive成功了,但是在输出ipa时要求有账号密码 可以通过命令行方式输出,绕开账号检查1.进入Windows-Organizer-Archives,找到要输出的scarchive列表项:2.右键 ...

  4. BZOJ4690: Never Wait for Weights

    裸带权并查集. #include<cstdio> #define N 100005 int m,i,j,s,t,u,d[N],p[N]; char k; int find(int i){ ...

  5. Linux系统编程@终端IO

    Linux系统中终端设备种类  终端是一种字符型设备,有多种类型,通常使用tty 来简称各种类型的终端设备.终端特殊设备文件一般有以下几种: 串行端口终端(/dev/ttySn ) ,伪终端(/dev ...

  6. 【设计模式 - 2】之单例模式(Singleton)

    1      模式简介 单例模式在代码中是非常常用的,如线程池.数据库连接.注册表.共享资源.一些非常消耗资源的组件,等等. 单例模式主要解决如下问题: 确保一个特殊类的实例是独一无二的: 确保这个类 ...

  7. qt 国际化(翻译时会触发changeEvent)

    1. 修改工程文件 .pro ,加入翻译源文件 hello_world.ts: TRANSLATIONS += \        Resource/translations/hello_world.t ...

  8. POJ--3172 Scales (DFS 大容量背包 C++)

    Scales Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3148   Accepted: 851 Description ...

  9. otter双A同步配置

    otter双A配置 最近做跨国服务器的数据同步,用了阿里的otter开源框架,遇到了不少问题,写一下文档为以后做参考. 第一步: 下载所需的文件 :otter,zookeeper,aria2 otte ...

  10. SQL 中的一些小巧但常用的关键字

    前面的几篇文章中,我们大体上介绍了 SQL 中基本的创建.查询语句,甚至也学习了相对复杂的连接查询和子查询,这些基本功相信你也一定掌握的不错,那么本篇则着重介绍几个技巧方面的关键字,能够让你更快更有效 ...