一、函数对象

定义:函数名存放的就是函数的地址,所以函数名就是对象,称之为函数对象

  1. 可以直接被引用
  2. 可以当作函数参数传值
  3. 可以作为函数发返回值
  4. 可以作为容器类型的元素
def add(a,b):
    return a+b
def low(a,b):
    return a-b
def jump(a,b):
    return a*b
def full(a,b):
    return a/b
def quyu(a,b):
    return a%b
def computed(fu,n1,n2):
    res = fn(n1,n2)
    return
method_map = {
    'add':add,
    'low'=low,
    'jump':jump,
    'full':full,
    'quyu':quyu,
}
#根据指令获取计算方法
def get_cp_fn(cmd):
    if cmd in method_map:
        return method[cmd]
    return add #输入有误默认方法处理
while TRUE:
    cmd = input('cmd: ')
    if cmd == 'quit':
        break
    cp_fn = get_cp_fn(cmd)
    result = computed(cp_fn,100,20)
    print(resule)
View Code

二、名称空间

  • 定义:存放名字与内存地址对应关系的容器
  • 作用:解决由于名字有限,导致名字重复发生冲突
  1. Built_in:内置名称空间;系统级,一个;随解释器执行而产生,解释器停止而销毁
  2. Global:全局名称空间;文件级,多个;随所属文件加载而产生,文件运行完毕而销毁
  3. local:局部名称空间;函数级,多个;随所属函数执行而产生,函数执行完毕而销毁
def fn():
    global num
    num = 20
    print(num)
#global关键词可以将Local的名字提升为Global的名字
#一个文件中的Global名字就是一个,所以函数内部外部使用的名字都是一个
fn() # 注:一定要调用函数,才能产生名字,并提升
print()
View Code

三、函数的嵌套

#将函数直接定义到另一个函数内部,就可以使用外部函数中的名字
def outer():
    num = 20
    def inner():
        print(num) #inner就可以直接使用outer中的名字
    inner()
outer()

四、作用域

  • 定义:名字起作用的范围

  • 作用:解决同名可以共存的问

#四种作用域
#Built-in:内置作用域,所有文件所有函数
#Global:全局作用域,当前文件所有函数
#Enclosing:嵌套作用域,当前函数与当前函数的内部函数
#Local:局部作用域,当前函数

# 注:
# 不同作用域之间名字不冲突,以达到名字的重用
# 查找顺序:Local > Enclosing > Global > Built-in
len = 10
def outer():
    len = 20
    def inner():
        len = 30 
        print('1',len)
    inner()
    print('2',len)
outer()
print('3',len)

del len:
  
print('4',len)

五、闭包

  • 本质就是函数嵌套(格式稍作改良)
#inner可以使用outer的局部变量:可以将inner定义在outer中
#inner的调用还是在外部:inner函数对象可能被outer返回

#将内部函数对象作为外部函数的返回值,1、可以使用局部变量;2、不改变函数的调用位置
def outer():
    num = 10
    def inner():  #闭包:closure,定义在函数内部的函数
        print(num)
    return inner
fn = outer()  #fn = inner
fn()

闭包案例:

import time
def download():
    print('开始下载')
    time.sleep(2)
    print('下载完成')
    data = '下载得到的数据'
    outer(data)
#为闭包传参
def outer(data):
    def inner():
        #保存,播放,删除等操作
        print("闭包打印: ",data)
    inner()
download()
View Code