抛砖引玉---"闭包"
# 函数引用外部变量是没有任何问题的
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
网友评论