如何用Pythonic写法避免冗余命名,直接初始化pyz等变量?
Python中避免中间字典直接初始化变量的Pythonic写法
原Python脚本由于Python的赋值特性(并非引用传递),循环后pyz, pxy, pxz始终为None,导致执行失败:
pyz, pxy, pxz = None, None, None for name, plane in zip(['left', 'right', 'floor'], [pyz, pxy, pxz]): pcd = o3d.io.read_point_cloud(f'{name}.ply') plane = Plane.best_fit(np.asarray(pcd.points).astype('f4')) ax = pxy.intersect_plane(pxz) ay = pxy.intersect_plane(pyz) az = pyz.intersect_plane(pxz) p0 = pyz.intersect_line(ax) p1 = pxy.intersect_line(az) p2 = pxz.intersect_line(ay) xyz0 = Points([p0, p1, p2]).centroid()
现有可行方案是借助字典作为中间结构,但在后续大量计算几何操作中,pyz这类命名变量比plane['yz']的字典访问方式更便捷。因此希望找到一种既无需中间数据结构,又能直接初始化pyz, pxy, pxz的Pythonic写法。
解决方案:生成器/列表推导式 + 解构赋值
完全可以通过生成器表达式(或列表推导式)配合解构赋值实现需求,既没有多余的中间结构,又能直接初始化命名变量:
# 用生成器表达式生成Plane实例,直接解构赋值给命名变量 pyz, pxy, pxz = ( Plane.best_fit(np.asarray(o3d.io.read_point_cloud(f'{name}.ply').points).astype('f4')) for name in ['left', 'right', 'floor'] ) # 后续计算逻辑保持不变 ax = pxy.intersect_plane(pxz) ay = pxy.intersect_plane(pyz) az = pyz.intersect_plane(pxz) p0 = pyz.intersect_line(ax) p1 = pxy.intersect_line(az) p2 = pxz.intersect_line(ay) xyz0 = Points([p0, p1, p2]).centroid()
写法优势:
- 无冗余中间数据结构,代码简洁紧凑
- 直接完成命名变量初始化,后续使用完全贴合原需求的便捷性
- 生成器表达式采用惰性求值,处理大体积点云文件时内存效率更高
如果需要更明确的文件名与变量对应关系(避免顺序出错),也可以用列表推导式:
file_names = ['left', 'right', 'floor'] # 列表推导式生成Plane实例,解构赋值给命名变量 pyz, pxy, pxz = [ Plane.best_fit(np.asarray(o3d.io.read_point_cloud(f'{fn}.ply').points).astype('f4')) for fn in file_names ]
内容的提问来源于stack exchange,提问作者Paul Jurczak
相关产品推荐
相关产品推荐

