重点:函数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年一月一日零点零分到现在经过的秒数。