Python到C的循环转换
我有以下python代码:Python到C的循环转换,python,c,Python,C,我有以下python代码: r = range(1,10) r_squared = [] for item in r: print item r_squared.append(item*item) 如何将此代码转换为C?C中是否有类似于可变数组的东西,或者我将如何做python附加的等价物?C中的数组在默认情况下是可变的,因为您可以编写一个[I]=3,就像python列表一样 但是,它们是固定长度的,与Python列表不同 对于你的问题,这实际上应该是好的。你知道你想要的最终
r = range(1,10)
r_squared = []
for item in r:
print item
r_squared.append(item*item)
如何将此代码转换为C?C中是否有类似于可变数组的东西,或者我将如何做python附加的等价物?C中的数组在默认情况下是可变的,因为您可以编写一个[I]=3,就像python列表一样 但是,它们是固定长度的,与Python列表不同 对于你的问题,这实际上应该是好的。你知道你想要的最终尺寸;只需创建一个大小相同的数组,并分配给成员 但当然也有一些问题需要解决 为可追加数组编写一个简单的库,就像Python列表一样,对于C语言来说是一个非常好的学习项目。如果您需要的话,您还可以找到大量现成的实现,但在标准库中找不到 关键是不要使用堆栈数组,而是使用在堆上分配的内存。跟踪指向该内存的指针、容量和使用的大小。当使用的大小达到容量时,将其乘以某个数字,然后使用不同的数字来了解它们如何影响性能。这就是它的全部。如果你看一看,这基本上和它做的是一样的 这里有一个例子。您需要添加一些错误处理,malloc和realloc可以返回NULL,当然API的其余部分可以返回append,特别是delete函数,它将在分配的内存上调用free,但这应该足以向您展示以下想法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int *i;
size_t len;
size_t capacity;
} IntArray;
IntArray int_array_make() {
IntArray a = {
.i = malloc(10 * sizeof(int)),
.len = 0,
.capacity = 10
};
return a;
}
void int_array_append(IntArray *a, int value) {
if (a->len+1 == a->capacity) {
size_t new_capacity = (int)(a->capacity * 1.6);
a->i = realloc(a->i, new_capacity * sizeof(int));
a->capacity = new_capacity;
}
a->i[a->len++] = value;
}
int main(int argc, char *argv[]) {
IntArray a = int_array_make();
for (int i = 0; i != 50; i++)
int_array_append(&a, i);
for (int i = 0; i != a.len; ++i)
printf("%d ", a.i[i]);
printf("\n");
}
c中的简单数组。c中的数组是同质的
c无法像python中那样动态增加数组的大小。这里的数组是固定长度的 如果您知道要使用的数组的大小,您可以使用这种声明,如下所示
int arr[10];
或者,如果您想在运行时动态添加memery,请使用malloc调用和结构链表使用链表,有两个可用的库。如果您阅读代码,您将提前知道数组的长度,并且您知道当它是任何其他长度时,都不会尝试读取它,那么,有没有理由尝试复制Python列表的特性?那么,在C.1中选择向量,是C还是C++?vector在许多方式上与列表类似。2您是否需要使阵列可扩展,或者在创建阵列时知道阵列的大小?OP需要其阵列可扩展。@simonzack您怎么知道的?这根本不是OP的问题。Python就是这样管理列表添加的,但这并不意味着它是OP要求的一部分。@AdamSmith这就是我想象中他所说的可变数组。@simonzack mutable只是意味着它可以更改。除非他给我们的代码表明列表的大小必须增长,或者满足编译时未知的特定大小,否则很难说他所说的可变数组是什么意思,但我理解你的意思。很明显,OP需要一个根据需要增长的数组。为什么要从数组切换到链表,这样就可以追加?它们不容易构建,而且你放弃了一个有经验的Python程序员可能期望的优势,例如,恒定时间随机访问索引,对于Python的那些不太可能寻找的非常类似的语法,例如,在列表中间的恒定时间插入或删除。在其他事情中,你可以realloc。我不是建议他从数组切换到链接列表。我只是让他知道他在C中有哪些选项。我给出了数组[10]的例子,因为他似乎事先就知道了数组的大小。我给出了链表示例,让他知道在C中有一种方法可以动态增加数组的大小。
/ vector-usage.c
#include <stdio.h>
#include "vector.h"
int main() {
// declare and initialize a new vector
Vector vector;
vector_init(&vector);
// fill it up with 150 arbitrary values
// this should expand capacity up to 200
int i;
for (i = 200; i > -50; i--) {
vector_append(&vector, i);
}
// set a value at an arbitrary index
// this will expand and zero-fill the vector to fit
vector_set(&vector, 4452, 21312984);
// print out an arbitrary value in the vector
printf("Heres the value at 27: %d\n", vector_get(&vector, 27));
// we're all done playing with our vector,
// so free its underlying data array
vector_free(&vector);
}
int arr[10];