python - 如何在Python中使用函数return val作为left val?

标签 python c python-2.7

我想让下面的 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 实现它,如何实现? 谢谢!!

最佳答案

最好问一下为什么你想要这个。如果我在 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

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

关于python - 如何在Python中使用函数return val作为left val?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18755075/

相关文章:

python - 具有可执行权限的 package_data 文件

python - 如何杀死由python中的子进程创建的进程?

c - 在 C 语言中,函数可以 exit() 还是应该允许 main() 来处理?

c - 从字符串中删除前几个字符

c - 函数 getenv() 总是返回 null

python - 当详细信息肯定在数据库中时,验证电子邮件和散列密码总是返回 None

Python 解析输入文件行

python - 在二维列表中查找搜索值的坐标

python - 之后改变输入运算符会影响之前方程的乘积吗?

python - Pandas Dataframe 一次追加一行到 CSV