问题描述
我正在为 C 重写一段 Python 代码,但我遇到了作者使用 zip
函数的问题。请考虑以下事项:
def coords(step_size):
for dz in (-step_size / 2,step_size / 2):
for dx,dy in zip((-step_size / 2,step_size / 2,-step_size / 2),(step_size / 2,-step_size / 2,-step_size / 2)):
yield dx,dy,dz
for dx,dz in coords(step_size):
....
如果我的理解是正确的,zip
通过组合传递的值创建一个 tulpa 迭代器对象,这个函数只是计算 dx,dz
的值,但我正在努力弄清楚这里到底发生了什么,我怎么能把它改编成 C。非常感谢你的帮助!
谢谢
解决方法
您的代码以特定顺序创建轴对齐立方体的八个顶点。在 C 中,或多或少忠实地呈现 Python 代码可能如下所示:
struct point {
double x,y,z;
};
double s = 1.0;
const double zz[2] = {-s / 2,s / 2};
const double xx[4] = {-s / 2,s / 2,-s / 2}; // zipped list,left
const double yy[4] = {s / 2,-s / 2,right
struct point p[8];
unsigned n = 0;
for (unsigned i = 0; i < 2; i++) {
for (unsigned j = 0; j < 4; j++) {
p[n].x = xx[j];
p[n].y = yy[j];
p[n].z = zz[i];
n++;
}
}
C 没有生成器,所以他的代码只是填充一个数组。 Zip 可能看起来是在 Python 中实现这一目标的好方法,但 Python 不是 C,所以不要费心编写自己的 zip。更典型的 C 代码呈现可能如下所示:
struct point p[8] = {
{-s / 2,-s / 2},{ s / 2,{-s / 2,s / 2},s / 2}
};
,
作为解释,zip()
返回一个从输入列表创建的新列表。新列表包含元组,其中第 n 个元组包含输入列表的第 n 个元素中的每一个。