引入
闭包函数其实是 名称空间与作用域, 函数嵌套, 函数对象的综合运用
一.什么是闭包函数
-
闭 : 指的是定义在函数内部的函数
-
包 : 闭函数引用了一个来自外层函数的变量
'总结一句话来说' : 定义在函数内部的函数, 并且该函数包含对外部函数作用域中名字的引用,该函数就称为闭包函数
def outter():
name='egon'
def inner():
print('my name is %s' %name)
return inner #注意不能加括号
f=outter() #f=inner
- 注意 : 作用域在函数定义阶段就规定死了, 与调用的位置无关
定义阶段已经规定死了到'outter'下面的"x"去拿
def outter():
x=2
def inner():
# x=1
print('from inner',x)
return inner
在全局里面定义也无效
f=outter() # f=inner
print(f)
x=11111111111111111
f() # 2
把它装进一个函数,在函数里面再定义也是无效的
def foo():
x=111111111111111111
f()
foo() # 2
二.为函数传值的方式
方式一 : 将值以参数的形式传入
import requests
将"url"以参数的形式传入(也是最常用)
def get(url):
response=requests.get(url)下载
if response.status_code == 200:
print(response.text)
get('https://www.baidu.com')
get('https://www.python.org')
方式二 : 以包的方式传入
这是个获取网络源码的功能
import requests
def outter(url):
def get():
response=requests.get(url)
if response.status_code == 200:
print(response.text)
return get
baidu = outter('https://www.baidu.com')
baidu()
如果难以理解,就来个精简版
def outter(x):
def wrapper():
print(x) #按照查找的优先级去查找"x"
return wrapper #吐出了函数"wrapper"的内存地址
f = outter(10) #这里返回的值就是函数"wrapper"的内存地址,赋值给"f",加括号就调用
f() #10