了解 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}
};
我正在为 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}
};