Python生成器和闭包
from math import sqrt
"""
## 生成器(generator)
一个带有`yield`的函数就是一个生成器(generator),
生成器看起来象函数调用,但不会执行任何函数代码,
知道对其调用`next()`才开始执行。
虽然执行流程仍按照函数的流程执行,
但每执行到一个yield语句就会中断,
并返回一个值。
"""
def gen():
for x in range(1,11):
print('generating')
yield x
for x in gen():
print(x)
#闭包(函数嵌套)
#outer外层函数
#inter内层函数
def outer(x):
def inter(y):
return x+2*y
return inter
print(outer(3))
print(outer(3)(4))
#使用类来计算两点距离
class Point(object):
def __init__(self,x,y):
self.x=x
self.y=y
def distance(self,u,v):
return sqrt((self.x-u)**2+(self.y-v)**2)
point=Point(3,4)
print(point.distance(9,9))
#使用闭包实现距离
def point_loc(x, y):
def dist(u, v):
return sqrt((x - u) ** 2 + (y - v) ** 2)
return dist
print(point_loc(3,4))
print(point_loc(3,4)(9,9))
# 注意:f()里面的内容不会立即执行,所以避免在闭包中引用后续会发生变化的变量
运行结果:
generating
1
generating
2
generating
3
generating
4
generating
5
generating
6
generating
7
generating
8
generating
9
generating
10
<function outer.<locals>.inter at 0x0000024BE46AF510>
11
7.810249675906654
<function point_loc.<locals>.dist at 0x0000024BE46AF8C8>
7.810249675906654