函数对象,名称空间和作用域以及闭包函数和装饰器

重点:函数func() 两层含义:

  第一层: func 指函数对象,指向内存地址

  第二层: 括号表示触发函数功能

一. 函数对象(可以理解为函数名):在面对对象中,一切皆对象

  具体体现:1.函数可以引用

       2.可以作为函数的参数

       3.可以作为函数返回值

          4.可以被储藏在容器中

二. 函数嵌套: 在一个函数中调用了另一个函数

  嵌套:在一个函数中定义了另一个函数,定义在内部的函数只能在函数内部使用。

三.  名称空间:存储名字和内存地址关系的空间

  分类:1. 内置名称空间: 存储解释器自带的一些名称与值的对应关系(print,  len, max, min,pop 等)

               在解释器启动时创建

     2. 全局名称空间:文件级别的名称(除了内置和函数内的都为全局)

             在执行py 文件时创建,所有文件代码执行完毕结束

       3. 局部名称变量:在内部函数内的名称。

             调用函数时创建,函数执行完销毁

  比较: 加载顺序: 内置变量 ===> 全局变量====> 局部变量

      查找顺序: 局部变量===> 全局变量 ====> 内置变量

四. 作用域: 域指范围: 函数的作用域在定义时就固定了,与调用为止无关

      全局名称空间和内置的名称空间在使用上没有什么本质区别, 而局部名称只能局部使用

      global: 定义全局变量,其变量可以在全局范围内使用

      local: 局部作用域

      globals(): 以字典类型返回当前位置的全部全局变量

      dir() : 不带参数时返回当前范围内的变量,方法和定义的类型列表,带参数时,返回参数的属性方法列表。 ???

      locals() : 查看局部作用域中的内容(相对概念)

      global a:明确要使用全局中的变量 a

      nonlocal a: 使用上一层中的a, 如果上一层没有就在上上层找,找到为止,但不表示使用全局变量

四. 闭包函数:满足两个条件

  条件一: 定义在另一个函数中

  条件二: 在内部的函数中使用了外部的名称(也就是数据值)

  重点: 在返回内部函数时,不是单纯的返回函数,还把函数中访问到的局部名称一起打包了

      相当于将内部函数与访问的数据打包在一起了

      __closure__用于访问闭包时打包的数据 print(f.__closure__[0].cell_contents)

      如果为全局变量没必要包走,外部可直接访问

def fun1():
    name='iris'
    def inner():
        print(name)
        print('hello')
    return inner
f=fun1()  # f 就是inner
f()  

五. 装饰器:在不修改源代码和调用方式的条件下为其他函数增加功能的函数

  特点:开闭原则(对扩展开放,对修改封闭)

     装饰器通过闭包函数实现

#源代码:
def download():
    print('开始下载')
    time.sleep(2)
    print('下载结束')
download()
# 为源代码加上统计开始时间和结束时间并计算总耗时的功能
# 方法一:修改源代码方法
import time
def download():
    start_time=time.time()
    print('开始下载')
    time.sleep(2)
    print('下载结束')
    end_time=time.time()
    print('下载耗时',(end_time-start_time))
download()

# 方法二:修改调用方式
import time
def download2():
    start_time=time.time()
    download()
    end_time = time.time()
    print('下载耗时',(end_time-start_time))
download2()

# 方法三:装饰器
def download():
    print('开始下载')
    time.sleep(2)
    print('下载结束')

def outter(func):
    def inner():
        start_time=time.time()
        func()
        end_time=time.time()
        print('下载耗时', (end_time-start_time))
    return inner
import time
download=outter(download)
download()

六. 时间戳: time.time()

  用秒表示当时的时间,指从1970年一月一日零点零分到现在经过的秒数。

猜你喜欢

转载自www.cnblogs.com/Afrafre/p/10034305.html