今日内容
1.函数对象
2.名称空间与作用域
3.函数的嵌套调用与闭包
一、函数对象
1.1 定义
函数名存放的就是函数地址,所以函数名也就是对象,称之为函数对象
1.2 函数对象的应用
1.可以直接被引用
2.可以当作函数参数传数
3.可以作为函数的返回值
4.可以作为容器类型的元素
def fn():
num = 10
print('fn function run')
# 直接被引用
func = fn
fn()
func()
案例:四则运算
def add(n1, n2):
return n1 + n
def sub(n1, n2): # subtraction 减法
return n1 - n2
def mul(n1, n2): # multiplication 乘法
return n1 * n2
def div(n1, n2): # division 除法
return n1 / n2
method_map = {
'add': add,
'sub': sub,
'mul': mul,
'div': div
}
def computed(fn):
if fn in method_map:
return method_map[fn]
else:
return add
def func():
cmd = input("方法名:")
method = computed(cmd)
result = method(100, 20)
print(result)
func()
二、名称空间
2.1 三种名称空间
built-in:内置名称空间,系统级,一个,随解释器执行而产生,解释器停止而销毁
global:全局名称空间,文件级,多个,随所属文件加载而产生,文件运行完毕而销毁
local:局部名称空间,函数级,多个,随所属函数执行而产生,函数执行完毕而销毁
注:加载顺序:built-in > global > local
num = 10
def fn2():
num = 20
print("this is fn2", num)
def fn3():
num = 30
print("this is fn3", num)
fn2() # this is fn2 20
fn3() # this is fn3 30
print(num) # 10
三、作用域
3.1 LEGB
不同作用域之间名字不冲突,以达到名字的重用
直接查找顺序: Local -> Enclosing -> global -> built-in
built-in : 内置作用域,所有函数
global:全局作用域,当前文件所有函数
enclosing:嵌套作用域,当前函数
local:局部作用域
len = 10
def outer():
len = 20
def inner():
len = 30
print('1', len)
inner()
print('2', len)
outer()
print('3', len) # 10 global --> built-in
del len
print('4', len) # len地址--》built-in
四、函数嵌套
将函数直接定义到另一个函数内部就可以使用外部函数中的名字
def outer():
num = 20
def inner():
print(num) # inner 可以直接使用outer中的名字
inner()
outer()
五、闭包
函数嵌套(格式稍作改良)
inner : 可以使用outer的局部变量
def outer():
num = 10
def inner:
print(num)
return inner
fn = outer()
fn()
# 案例一:外部函数可以为闭包传递参数
import time
def download():
print('开始下载...')
time.sleep(2)
print('完成下载...')
data = ""
outer(data)
# 传参
def outer(data):
def inner():
# 保存,播放,删除等操作
print("闭包打印:", data)
inner()
download()
# 案例二:延迟执行
import requests
def outer(url):
def get_html():
html = requests.get(url)
print(html.text)
return get_html
# 先预定义多个爬虫方法,爬页面操作并未执行
baidu = outer('https://www.baidu.com')
python = outer('https://www.python.org')
sina = outer('https://www.sina.com.cn')
# 什么时候想爬什么页面就调用指定页面的爬虫方法
baidu()
sina()