python 的延迟评估和延迟绑定?
lazy evaluation and late binding of python?
懒惰评估是什么时候? (生成器,如果,迭代器?),
什么时候后期绑定? (闭包,常规函数?)
a = [1,2,3,4]
b = [lambda y: x for x in a]
c = (lambda y: x for x in a) #lazy evaluation
d = map(lambda m: lambda y:m, a) #closure
for i in b:
print i(None)
# 4 4 4 4
for i in c:
print i(None)
# 1 2 3 4
for i in d:
print i(None)
# 1 2 3 4
这看起来像是作业,所以我不会只给你答案。这里有两个函数,您可以单步执行并查看值如何变化。
def make_constants_like_generator():
def make_constant(x):
def inner(y):
return x
return inner
results = []
for i in [1, 2, 3, 4]:
results.append(make_constant(i))
for f in results:
print f(None)
return results
def make_constants_like_list():
x = None
results = []
for i in [1, 2, 3, 4]:
x = i
def inner(y)
return x
results.append(inner)
for f in results:
print f(None)
return results
惰性求值会等到最后一刻才对表达式求值。与之相反的是热切的评价。生成器表达式是惰性的,它在迭代之前什么都不做。列表表达式急切,一遇到就给列表填值
早绑定和晚绑定与系统如何确定名称所指的内容有关。 python 中的所有名称都是后期绑定的。结合惰性求值,这意味着名称绑定的内容可以在使用它的表达式被求值之前改变
def map(func, iter):
return (func(val) for val in iter)
懒惰评估是什么时候? (生成器,如果,迭代器?), 什么时候后期绑定? (闭包,常规函数?)
a = [1,2,3,4]
b = [lambda y: x for x in a]
c = (lambda y: x for x in a) #lazy evaluation
d = map(lambda m: lambda y:m, a) #closure
for i in b:
print i(None)
# 4 4 4 4
for i in c:
print i(None)
# 1 2 3 4
for i in d:
print i(None)
# 1 2 3 4
这看起来像是作业,所以我不会只给你答案。这里有两个函数,您可以单步执行并查看值如何变化。
def make_constants_like_generator():
def make_constant(x):
def inner(y):
return x
return inner
results = []
for i in [1, 2, 3, 4]:
results.append(make_constant(i))
for f in results:
print f(None)
return results
def make_constants_like_list():
x = None
results = []
for i in [1, 2, 3, 4]:
x = i
def inner(y)
return x
results.append(inner)
for f in results:
print f(None)
return results
惰性求值会等到最后一刻才对表达式求值。与之相反的是热切的评价。生成器表达式是惰性的,它在迭代之前什么都不做。列表表达式急切,一遇到就给列表填值
早绑定和晚绑定与系统如何确定名称所指的内容有关。 python 中的所有名称都是后期绑定的。结合惰性求值,这意味着名称绑定的内容可以在使用它的表达式被求值之前改变
def map(func, iter):
return (func(val) for val in iter)