(十一)函数<3>闭包

抛砖引玉---"闭包"

# 函数引用外部变量是没有任何问题的
a=3
def foo():
    print('a={}'.format(a))
foo()
>>>
a=3
# 函数内部定义的变量,用在外部,就报错啦...
def foo():
    a=1
    return a
print(a)
>>>
Traceback (most recent call last):
  File "C:\Users\wcw\Desktop\Testing.py", line 10, in <module>
    print(a)
NameError: name 'a' is not defined

用内嵌函数修改下:

def foo():
    a=3
    def bar():
        return a
    return bar

f=foo()
print(f())
>>>
3
# 之前的例子再修改下
def foo():
    a=1
    def bar():
        return a
    return bar
print(foo()())
"""
bar()就是我们所定义的闭包,具有两个特点:
<1>是嵌套函数
<2>引用外部函数的自由变量(实例中,a就是自由变量,和bar()互相独立)

通过闭包,我们得以在外部访问函数内部的变量
"""
  • 抛物线实例
def parabola(a,b,c):
    def para(x):
        return a*x**2+b*x+c
    return para
# p实际上是parabola()的一个实例对象
p=parabola(2,3,4)
# 使用p(5)是否更为简洁,5即为x的值
print(p(5))

装饰器的本质,实际上也是闭包的一种应用.
目前个人的理解,闭包和装饰器还是有明显区别的...


review---"递归":函数不断调用自身的行为

def fib(n):
    if n==0:
        return 0
    elif n==1:
        return 1
    else:
        # 这里就是递归
        return fib(n-1)+fib(n-2)
if __name__=='__main__':
    f=fib(10)
    print(f)
>>>
55
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容