'''
一: 名称空间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. 关于Retrofit网络请求URL中含有可变参数的处理

    开题:在此默认各位看官对Retrofit.以及Okhttp已经有过一定的了解及应用,所以今天我们不谈基础入门的东西,今天我们谈在Retrofit请求接口管理类中URL参数含有动态参数的处理方式.一般我 ...

  2. 02Spark的左连接

    两个文件,一个是用户的数据,一个是交易的数据. 用户: 交易: 流程如下: 分为以下几个步骤: (1)分别读取user文件和transform文件,并转为两个RDD. * (2)对上面两个RDD执行m ...

  3. Vue+Vue-router微信分享功能

    在使用vue和vue-router路由框架已经开发过好几个项目了,其中也遇到不少坑,有些坑各种搜也没有找到非常理想的答案. vue学习相对来说还是比较简单,官方文档说明非常清楚(https://cn. ...

  4. jsp中相对路劲

    .代表当前目录 ..代表上一层目录 例如:如下文件,aliCashier.html要引入images下的图片,应该写成../../static/images/logo.png,此处会找到本地静态路径. ...

  5. 从头配置,开发 cocos2dx 3.14.1

    要使用cocos2dx写一个麻将测试工具. 配置流程如下: 1. 下载安装最新版本的VS(VS2017): https://www.visualstudio.com/zh-hans/downloads ...

  6. gitlab-ci + k8s 之docker (三)

    docker 在本系列(一)中(https://www.cnblogs.com/huandada/p/9965771.html)的runner_tomcat.sh脚本有涉及到镜像的推送,本文主要记录整 ...

  7. D - F(x)

    For a decimal number x with n digits (A nA n-1A n-2 ... A 2A 1), we define its weight as F(x) = A n ...

  8. javascript--面试题

    (1)javaScript怎么清空数组? 如 var arrayList = ['a','b','c','d','e','f']; 怎么清空 arrayList 方法1:直接改变arrayList所指 ...

  9. 主机配置nginx后如何获取访问者IP

    he你早的时候写了一个根据访问者ip查询天气的小接口,那时候还没得买域名,没有搞nginx,测试自然没有问题,然后随着一个小工具一块上线了,今天突然发现我的小工具有好几个人在使用了,就想写一个记录访问 ...

  10. python全栈开发 * 进程理论 进程创建 * 180724

    一.进程理论 1.进程是资源分配的最小单位. 2.进程调度就是多个进程在操作系统的控制下被CPU执行,去享用计算机的资源. 先来先服务 短作业优先 时间片轮转 多级反馈队列 3.进程调度的过程是不能够 ...