Python中嵌套定义的语法功能是什么?

2024-09-27 07:27:04 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是一个模块给出的模型

如果您查看它的内部,您可以检查两个函数的定义是否在嵌套深度中定义

我以前从未见过这种情况

工作怎么样

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)

Tags: inonlyforread定义rangestructshape
1条回答
网友
1楼 · 发布于 2024-09-27 07:27:04

Python中的函数定义:

def foo():
    pass

和变量赋值:

foo = 17

它们完全相同,除了一个绑定到变量(foo)一个函数值,另一个绑定到非函数值(以及Python选择使它们在语法上完全不同的事实)

那么让我们看看,下面两个之间的区别是什么

foo = 17
def bar():
    print(foo)

def bar():
    foo = 17
    print(foo)

在第一种情况下,变量foo的范围比函数bar的范围更广;在第二种情况下,foobar的局部

你的情况几乎完全一样。load函数需要一个辅助函数readpca,但它不想让它在load之外可用,因此它将它定义为函数的本地函数

实际上,对于函数来说,由于闭包的概念,它有点复杂:tl;dr是指函数可以访问其定义环境的变量。这里根本不使用它,但是readpca可以访问变量filepathreadonly,如果它愿意的话;如果readpca是在load之外定义的,如果readpca对这些参数感兴趣,则必须通过额外的参数传递这些参数。这种闭包效应是函数可能希望在另一个函数中定义的另一个原因

相关问题 更多 >

    热门问题