4.01day11函数定义域;闭包函数简介

今日内容:
1、函数对象
2、名称空间
3、函数的嵌套定义
4、作用域
5、闭包函数

一、函数对象
函数名存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 对象

函数对象的应用:
1、可以直接引用

2、可以当做 函数参数 传递

3、可以作为函数的返回值
def fn():
print('hello')

def fn1():
print('world')
return fn

res = fn1() # fn1()的值为 函数fn1 的return值,即fn
res() # 即 此为 fn(),调用了 函数fn

4、可以作为容器类型的元素

二、名称空间
名称空间:存放名字与内存空间地址对应关系的容器

作用:解决由于名字有限,导致名字重复发生冲突的问题

三种名称空间:
1. 内置 名称空间 # python解释器内置的函数名的存放位置
2. 全局 名称空间 # 顶级变量名的存放位置,即最高缩进级的变量名,包括顶级的if,while内的变量
3. 局部 名称空间 # 函数中的变量名的存放位置

这三个名称空间的变量可以共存,即同一个变量名可以同时存在于三个名称空间中

注意:
del 名字:可以移除查找最近的名字与内存空间地址的对应关系
加载顺序:内置>全局>局部 | Built-in > Global > Local

三、函数嵌套定义

在函数内定义函数的操作就是函数的嵌套定义

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 # 外层函数的局部变量:Enclosing - 嵌套作用域
def inner():
len = 30
print('1:', len) # 30, inner -> outer -> global -> built-in
inner()
print('2:', len) # 20, outer -> global -> built-in
outer()
print('3:', len) # 10, global -> built-in

del len
print('4:', len) # len地址, built-in

5、闭包
# closure:被包裹的函数,称之为闭包
# 完整的闭包结构:
1.将函数进行闭包处理
2.提升函数名的作用域,将内部函数对象作为外部函数的返回值

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()
baidu()
posted @ 2019-04-01 15:31  输诚  阅读(108)  评论(0编辑  收藏  举报