'''
一: 名称空间namespaces
    名称空间就是存放名字与值绑定关系的内存空间 二: 名称空间分为三种
    内置名称空间:
        1. 特点: 存放是python解释器自带的名字,len,print
        2. 生命周期: 解释器启动则产生,解释器关闭则销毁
    全局名称空间
        1. 特点: 存放是全局的名字(没有任何缩进\顶头定义的名字)
        x=10
        y=20
        def func():
            pass
        print(x)         if True:
            x=1111
        2. 生命周期: python文件执行时则创建,文件执行完毕则销毁
    局部名称空间:
        1. 特点: 在函数内定义的名字
        2. 生命周期: 在函数调用时临时创建,函数调用完毕则立即销毁 三 名称空间总结:
    1. 加载顺序:
        先产生内置名称空间
        再产生全局名称空间
        如果调用函数则会临时局部名称空间     2. 名字的查找顺序:
        从当前位置向上查找
        def func():
        #     # len=2222
        #     print(len)
        # len=1111
        # func()
    3. 函数的局部名称空间彼此隔离,但是全局名称空间与内置名称空间是所有函数共享的
    4. 名称空间的嵌套关系是在函数定义(检测语法)就固定死的与调用位置无关,即无论在
       何处调用函数都必须老老实实地按照定义阶段规定的嵌套关系去查找名字
'''
#示范一
# mmm=11111111111111
# # x='aaaa'
# def f1():
#     x=1
#     def f2():
#         # x=2
#         def f3():
#             # x=3
#             print(x)
#         f3()
#     f2()
#
#
# f1()
#
# def foo():
#     xxx=1111
#     print(mmm)
#     print(len)
#
# def bar():
#     yyy=2222
#     print(mmm)
#     print(len)
#
#
# foo()
# bar() #示范二
# def f1():
#     # x=1111
#     def f2():
#         # x=333333333333333333333
#         print('from f2',x)
#     return f2
#
# xxx=f1()
# x='全局'
#
# def foo():
#     x='foo'
#     xxx()
#
# def bar():
#     x='bar'
#     xxx()
#
# def func():
#     x='func'
#     xxx()
#
#
# foo()
# bar()
# func() #示范三
# yyy=111
# def func():
#     print(yyy)
#     xxx=2222
#
# func() '''
全局作用域:内置名称空间+全局名称空间
    特点:全局存活,全局有效
   
局部作用域:局部名称空间
    特点:临时存活,函数内有效 '''
# 关键字: global
# 如果想要在局部修改全局名字对应的值是不可变类型时.必须在局部用global关键字加以声明
# x=111
# def func():
#     global x
#     x=222
#
# func()
# print(x) #如果想要在局部修改全局名字对应的值是可变类型时,直接修改即可
# l=[1,2,3]
# def func():
#     l.append(4)
#
# func()
# print(l) # nonlocal
# x=2222
# def f1():
#     x=1111
#     def f2():
#         # global x
#         nonlocal x
#         x=0
#     f2()
#     print('在f1内的x的值===>',x)
#
# f1()
# print(x) aaaaaa=1111111111111
# print(globals()) def func():
    x=1
    y=2
    print(locals()) func()
'''
1.
什么是闭包函数=>函数嵌套+函数对象+名称空间与作用域
    闭:定义在函数内的函数
    包:该内部函数需要访问一个名字,该名字属于外层函数作用域的(强调:不是全局作用域)
2. 为何要用闭包函数
    为了实现装饰器
3. 如何用闭包函数
    def outter(xxx):
        def inner():
            xxx
        return inner
'''
# def outter():
#     xxx=111
#     def inner():
#         print(xxx)
#     return inner
#
# f=outter()
# def foo():
#     xxx=2222
#     f()
# foo() # 为函数体传参的两种解决方案
# 方案一: 直接以参数的形式传入
# def func(xxx):
#     print(xxx)
# func(111) #方案二:
def outter(xxx):
    # xxx=111
    def func():
        print(xxx)
    return func func=outter(111)
'''
1.
什么是装饰器
    装饰器就是用来为被装饰的对象新增功能的工具/函数
    被装饰的对象可以是任意可调用的对象
    装饰器本事也可以是任意可调用的对象 2. 为何要用装饰器
    开放封闭原则:对修改封闭,对扩展开放
    也就是不可以修改源代码,而对原有的功能进行扩展
    装饰器需要遵循的原则:
        1. 不能修改被装饰对象的源代码
        2. 不能修改被装饰对象的调用方式     装饰器的目标:就是要在遵循原则1和2的前提下,为被装饰对象新增功能 3. 如何实现装饰器 '''
# # 阶段一:
###计算出一段程序执行的时间并打印出来
# import time
# def index():
#     time.sleep(1)
#     print('welcome to index page')
#
# start=time.time()
# index()
# stop=time.time()
# print('run time is %s' %(stop - start)) # # 阶段二:
# import time
# def index():
#     time.sleep(1)
#     print('welcome to index page')
#
# def wrapper():
#     start=time.time()
#     index()
#     stop=time.time()
#     print('run time is %s' %(stop - start)) # wrapper() # # 阶段三:
# import time
#
# def index():
#     time.sleep(1)
#     print('welcome to index page')
#
# def wrapper(func):
#     start=time.time()
#     func()
#     stop=time.time()
#     print('run time is %s' %(stop - start))
#
# wrapper(index) # 阶段四:
# import time
#
# def index():
#     time.sleep(1)
#     print('welcome to index page')
#
# def timmer(func):
#     # func=最原始那个index的内存地址
#     def wrapper():
#         start=time.time()
#         func()
#         stop=time.time()
#         print('run time is %s' %(stop - start))
#     return wrapper
#
# index=timmer(index) #index=wrapper的内存地址
# index() #wrapper() #############################################################################################################
# 装饰器语法糖
# 在被装饰器对象正上方单独一行写: @装饰器的名字
# 解释器一旦执行到@装饰器的名字就会: 原函数名=装饰器的名字(正下方那个函数) # import time
#
# def timmer(func):
#     # func=最原始那个index的内存地址
#     def wrapper():
#         start=time.time()
#         func()
#         stop=time.time()
#         print('run time is %s' %(stop - start))
#     return wrapper
#
# @timmer #index=timmer(index) #index=wrapper的内存地址
# def index():
#     time.sleep(1)
#     print('welcome to index page')
#
# index() #wrapper() # 装饰器修订:
# import time
#
# def timmer(func):
#     # func=最原始那个index的内存地址
#     def wrapper(*args,**kwargs):
#         start=time.time()
#         res=func(*args,**kwargs)
#         stop=time.time()
#         print('run time is %s' %(stop - start))
#         return res
#     return wrapper
#
# @timmer #index=timmer(最原始那个index的内存地址) #index=wrapper的内存地址
# def index():
#     time.sleep(1)
#     print('welcome to index page')
#
#
# @timmer # home=timmer(最原始那个home的内存地址) #home=wrapper的内存地址
# def home(name):
#     time.sleep(2)
#     print('welcome %s to home page' %name)
#     return 11111
#
# res=index() #wrapper()
# print('index====>',res)
# res=home('egon') #wrapper('egon')
# print('home====>',res) 装饰器补充:
import time
from functools import wraps def timmer(func):
@wraps(func)
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print('run time is %s' %(stop - start))
return res
# wrapper.__doc__=func.__doc__
# wrapper.__name__=func.__name__
return wrapper # @timmer #index=timmer(最原始那个index的内存地址) #index=wrapper的内存地址
def index():
"""
这是一个index函数
:return:
"""
time.sleep(1)
print('welcome to index page') # index() #wrapper() # print(help(index)) #print(index.__doc__)
# print(index.__doc__) # print(help(index)) #print(wrapper.__doc__)
print(index.__name__)

Python记录9:函数4:名称空间作用域+闭包函数+装饰器的更多相关文章

  1. Day11名称空间,作用域,闭包函数

    Day11 1.函数对象: ①可以被引用 ​ ②可以作为另一个函数的参数 ​ ③可以作为另一个函数的返回值0 ​ ④可以被存储到容器类型中 2.函数嵌套: ①嵌套调用:在一个函数中调用了另一个函数 ​ ...

  2. python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套

     复习   1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用:     # 字符串的比较#  -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...

  3. 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  4. day 12 名称空间和闭包函数

    函数嵌套 按照函数的两个阶段分为: 嵌套调用:在一个函数内部调用另一个函数 嵌套定义:在一个函数内部定义另一个函数 名称空间(namespace):存储名字的内存区域 名称空间的分类: 内置名称空间: ...

  5. Python函数名做参数,闭包,装饰器

    简单讲解闭包的写法和应用,在这之前,先声明,你定义的任意一个函数都可以作为其他函数的参数.就像下面这段代码的参数func,接收的参数就是一个函数名,在函数体内部使用了func()调用执行函数. 请看下 ...

  6. python_函数名的应用、闭包、装饰器

    0.动态传参内容补充: 0.1 单纯运行如下函数不会报错. def func1(*args,**kwargs): pass func1() 0.2 *的魔性用法 * 在函数定义的时候,代表聚合. *在 ...

  7. 13、python中的函数(闭包与装饰器)

    一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函 ...

  8. Python之闭包and装饰器

    闭包和装饰器是Python中非常重要的一种语法格式,在日常工作中应用非常广泛. 首先,我先为大家简单的介绍一下闭包的概念. 闭包:闭包是在函数嵌套的基础上,内层函数使用到外层函数的变量,且外层函数返回 ...

  9. Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

    本篇目录: 一.函数嵌套 二.函数名称空间与作用域 三.函数对象 四.闭包函数 ============================================================ ...

随机推荐

  1. JVM核心知识体系(转http://www.cnblogs.com/wxdlut/p/10670871.html)

    1.问题 1.如何理解类文件结构布局? 2.如何应用类加载器的工作原理进行将应用辗转腾挪? 3.热部署与热替换有何区别,如何隔离类冲突? 4.JVM如何管理内存,有何内存淘汰机制? 5.JVM执行引擎 ...

  2. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  3. springmvc date

    数据格式化,从本质上讲属于数据转换的范畴.Spring就是基于数据转换框架植入“格式化”功能的. 在数据转换时我们进行了如下配置: 我们使用的是ConversionServiceFactoryBean ...

  4. Django admin 自定义Choice_field

    在使用Django Admin后台时,有时候想自定义某一字段的Choice_field,例如屏蔽某些选项,只显示某些指定的选项. 想象这样的应用场景,我有一个网站,导航栏是这样的: 点开“技术杂谈”后 ...

  5. 蜕变成蝶~Linux设备驱动之watchdog设备驱动

    看门狗(watchdog )分硬件看门狗和软件看门狗.硬件看门狗是利用一个定时器 电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零 (俗称 “喂狗”),如果程序出现故障,不在定时周 ...

  6. js上传

    有时候需要显示进度,这时候就需要做一些切割,具体上传代码如下: <!DOCTYPE HTML> <html lang="en-US"> <head&g ...

  7. HTTP Headers 信息

    点开一个条目,可以查看请求的详细信息: General —— 通用信息 Request URL:请求的URL     Request Method:请求的方法     Status Code:响应状态 ...

  8. linux shell下16进制 “\uxxxx” unicode to UTF-8中文

    问题出现背景: 项目中有个通过ip获取归属地城市需求,我是直接通过新浪的ip归属查询接口来获取的.我使用的是shell脚本调用 RESULT=$(curl -s 'http://int.dpool.s ...

  9. 六种常见排序算法的java实现

    package edu.cn.ysw; //八种排序算法的实现与效率分析 /* * 内排序的种类: * 1.插入排序:直接插入排序.希尔排序. * 2.选择排序:简单选择排序.堆排序. 3.交换排序: ...

  10. linux部署的flask项目配置static

    环境: Python2.7 flask nginx linux的系统是Ubantu Python:我的是linux已经有的. flask:pip install flask nginx:sudo ap ...