zoukankan      html  css  js  c++  java
  • python基础-------函数(二)

                                          闭包函数与装饰器

    一、闭包函数

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

    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)



  • 相关阅读:
    linux 下常用命令
    Mysql 数据库几种引擎的区别比较
    java 中使用ajax调用后台方法注意事项
    C# HtmlDocument和HtmlNode的使用以及节点的模糊查询
    Visio 保存卡死解决办法
    java outterLoop跳出多重循环用法以及详解
    webapi 文件下载输出接口
    获取web.config 内的值
    xml的读取(曾删改)
    from 验证
  • 原文地址:https://www.cnblogs.com/niubin/p/7011318.html
Copyright © 2011-2022 走看看