'''
一: 名称空间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. hdoj:2081

    手机短号 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. there was an error running the selected code generator unable to retrieve metadata for

    there was an error running the selected code generator unable to retrieve metadata for PROBLEM: I ha ...

  3. 移动网页广告引入mraid.js使用指南

    在网上找mraid相关资料,相对比较少,大多都是API介绍,概念介绍等,没有一份详细的移动端网页广告使用教程,经过自己两天的摸索,完成了开发的移动端网页版的广告加入mraid功能. 背景: 我开发了移 ...

  4. JS中常用的Math方法

    1.min()和max()方法 Math.min()用于确定一组数值中的最小值.Math.max()用于确定一组数值中的最大值. alert(Math.min(2,4,3,6,3,8,0,1,3)); ...

  5. Docker-常用命令(7)

    ## List Docker CLI commandsdockerdocker container --help ## Display Docker version and infodocker -- ...

  6. jQuery UI =>jquery-ui.js中sortable方法拖拽对象位置偏移问题

    今天要处理sortable方法处理的对象,拖拽的时候,位置偏移的问题. 按理应该是鼠标在哪,对象就跟着在哪的 百度了一下问题,http://blog.csdn.net/samed/article/de ...

  7. JVM监控和调优常用命令工具总结

    JVM监控和调优 在Java应用和服务出现莫名的卡顿.CPU飙升等问题时总是要分析一下对应进程的JVM状态以定位问题和解决问题并作出相应的优化,在这过程中Java自带的一些状态监控命令和图形化工具就非 ...

  8. [转]MapReduce:详解Shuffle过程

    Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必须要了解的.我看过很多相关的资料,但每次看完都云里雾里的绕着,很难理清大致的逻辑, ...

  9. c++学习计划

    我选择的课程是西北工业大学的<C++程序设计> 理由是:西北工业大学的计算机挺不错的,而且这门课程还有"国家精品"的认证,感觉应该挺不错的. 共48讲...有点多 从2 ...

  10. Codeforces Round #496 (Div. 3)

    一如既往地四题...好久没切了 有点犯困了明显脑子感觉不够灵活. 为了熟练度还是用java写的,,,导致观赏性很差...我好不容易拉了个队友一起切结果过掉a就tm挂机了!!! A题竟然卡了,,,用了十 ...