以下是一个模块给出的模型
如果您查看它的内部,您可以检查两个函数的定义是否在嵌套深度中定义
我以前从未见过这种情况
工作怎么样
def load(filepath, shape_only=False):
def readpca(f, nv):
nc,nd = struct.unpack('<II', f.read(8))
assert(nd == 3*nv)
funcs = [[struct.unpack('<d', f.read(8))[0] for d in range(nd)]
for c in range(nc)]
(nm,) = struct.unpack('<I', f.read(4))
assert(nm == 3*nv)
# fyi: elements are ordered x1,y1,z1,x2,y2,z2,...xnv,ynv,znv.
vmean = [struct.unpack('<d', f.read(8))[0] for i in range(nm)]
(ne,) = struct.unpack('<I', f.read(4))
values = [struct.unpack('<d', f.read(8))[0] for i in range(ne)]
return PCAModel(vmean, funcs, values)
with open(filepath, 'rb') as f:
nv,nt = struct.unpack('<II', f.read(8))
# fyi: faces is a list of tuples (each tuple contains 3 vertex indices).
faces = [struct.unpack('<III', f.read(12)) for i in range(nt)]
shape = readpca(f, nv)
try:
textr = None if shape_only else readpca(f, nv)
except Exception:
print('No texture data. Returning shape-only model.')
textr = None
return MorphModel(faces, shape, textr)
Python中的函数定义:
和变量赋值:
它们完全相同,除了一个绑定到变量(
foo
)一个函数值,另一个绑定到非函数值(以及Python选择使它们在语法上完全不同的事实)那么让我们看看,下面两个之间的区别是什么
在第一种情况下,变量
foo
的范围比函数bar
的范围更广;在第二种情况下,foo
是bar
的局部你的情况几乎完全一样。
load
函数需要一个辅助函数readpca
,但它不想让它在load
之外可用,因此它将它定义为函数的本地函数实际上,对于函数来说,由于闭包的概念,它有点复杂:tl;dr是指函数可以访问其定义环境的变量。这里根本不使用它,但是
readpca
可以访问变量filepath
和readonly
,如果它愿意的话;如果readpca
是在load
之外定义的,如果readpca
对这些参数感兴趣,则必须通过额外的参数传递这些参数。这种闭包效应是函数可能希望在另一个函数中定义的另一个原因相关问题 更多 >
编程相关推荐