了解 Python 中的 zip 函数并使其适用于 C

Understanding zip function in Python and adapting it for C

我正在为 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, -step_size / 2, -step_size / 2)):
            yield dx, dy, dz

这个函数是这样循环调用的:

for dx, dy, dz in coords(step_size):
    ....

如果我的理解是正确的,zip 通过组合传递的值创建一个 tulpa 迭代器对象,这个函数只是计算 dx, dy,dz 的值,但我正在努力弄清楚究竟发生了什么在这里,我如何将它改编为 C。非常感谢你的帮助!

谢谢

作为解释,zip() returns 从输入列表创建的新列表。新列表包含元组,其中第 n 个元组包含输入列表的每个第 n 个元素。

您的代码以特定顺序创建轴对齐立方体的八个顶点。在 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, -s / 2};  // zipped list, left
const double yy[4] = {s / 2, s / 2, -s / 2, -s / 2};  // zipped list, 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},
    { s / 2, -s / 2, -s / 2},
    {-s / 2, -s / 2, -s / 2},
    {-s / 2,  s / 2,  s / 2},
    { s / 2,  s / 2,  s / 2},
    { s / 2, -s / 2,  s / 2},
    {-s / 2, -s / 2,  s / 2}
};