-1

我想让下面的 c 代码在 Python 中工作,我该怎么做?

// low level
typedef int* (*func)(int);

// high level
int a[2];

// high level
int* foo(int i) { return &a[i]; }

// low level
void goo(func f) {
  int i = 0;
  for(; i < 2; ++i) *f(i) = 7;
}

int main(void)
{
  goo(foo);
  return 0;
}

当我写一个像 s goo 这样的低级函数时,我想使用高级用户定义函数 foo 返回的指针。

在 c 中真的很容易,我想在 Python 中实现,如何?谢谢!!

4

3 回答 3

1

像其他人一样,我真的不明白你为什么想要这个。但是你可以返回一个改变某些东西的函数。

这是您的代码的翻译:

# high level
a [ 0, 0 ]

# high level
def foo(i):
    def change(n): a[i] = n
    return change

# low level
def goo(f):
   for i in range(2):
        f(i)(7)

goo(foo)
于 2013-09-12T04:52:15.557 回答
1

最好问问你为什么想要这个。如果我在 C 中看到这样的代码,我会强烈劝阻作者不要写这个:它看起来像是一种故意混淆的方式。

f的唯一目的似乎是允许突变a。在这种情况下,函数签名很奇怪。为什么不:

typedef void (*func)(int, int);

哪个包含索引以及您要设置的值?在这种情况下,我们甚至可以给这个签名起一个好听的名字,一个“setter”。

typedef void (*setter)(int, int);

有了这个,C代码就简单直接了,

void foo(int i, int val) { a[i] = val; }

void goo(setter f) {
  int i = 0;
  for(; i < 2; ++i) f(i, 7);
}

并且这个的 Python 翻译也很简单。

如果你真的需要这样的东西,只需在可调用的东西中捕捉突变的想法,然后返回它。这就是指针的真正含义,对吧?例如:

a = [0, 0]

def foo(i):
    def mutate(v):
        a[i] = v
    return mutate

def goo(f):
    for i in range(2):
        f(i)(7)

if __name__ == '__main__':
    goo(foo)
    print a

指针不是指针,因为它在物理上由“星”运算符表示。它是一个指针,因为我们可以引用和改变它。我们可以用简单的函数来做到这一点:

a = [4, 17]

def foo(i):
    def ref():
        return a[i]
    def mutate(v):
        a[i] = v
    return { 'ref' : ref, 'mutate' : mutate }

def goo(f):
    for i in range(2):
        ptr = f(i)
        print "at", i, "I see", ptr['ref']() 
        ptr['mutate'](7)

if __name__ == '__main__':
    goo(foo)
    print a

如果我们想让它更漂亮,我想我们可以使用类。

a = [4, 17]

def foo(i):
    class Ptr(object):  
        def __init__(self): pass
        def ref(self):
            return a[i]
        def set(self, v):
            a[i] = v
    return Ptr()

def goo(f):
    for i in range(2):
        ptr = f(i)
        print "at", i, "I see", ptr.ref() 
        ptr.set(7)

if __name__ == '__main__':
    goo(foo)
    print a

但同样,我不会盲目地使用它:我宁愿看到真正的代码,看看你想要做什么。

于 2013-09-12T04:23:17.203 回答
0

Python 中没有指针,也没有数组。通常的 Python 习惯用法是返回列表的修改副本,而不是填写在其他地方创建的列表。

但是,Python 确实允许您定义自己的对象类型,并重载运算符的含义。因此,虽然 Python 中没有要重载的一元 *,但您可以重载 p[x] 的含义,而 p[0] 的含义与 C 中的 *p 含义相同。

阅读此处了解您可以使用 Python 类做什么。“新式”类是 Python 2.x 中的最佳选择,成为Python 3 中 的唯一选择。 http://docs.python.org/2/reference/datamodel.html

至于将函数传递给 Python 函数,只需传递名称,不带括号:

import math
def f1(x):
    return 2*x + 1

def sumf( func, vals ):
    return sum( func(x) for x in vals );

print sumf( f1, (1, 2, 3) )
print sumf( math.cos, [0, math.pi/2, math.pi] )

如您所见,库函数与用户定义的函数一样传递。

于 2013-09-12T04:16:15.090 回答