求助高手:改写一个Perl函数

求助高手:改写一个Perl函数

近日在《Learn Perl》中发现perl 5.10引入了一个关键字state,类似于C语言里的static变量。其中有一个函数用到了这个特点,于是想用Python实现类似的效果,耗时甚多却毫无头绪,特向各位求助。

原Perl函数:

use 5.010;

sub running_sum {
  state $sum = 0;
  state @numbers;
  foreach my $number ( @_ ) {
    push @numbers, $number;
    $sum += $number;
  }
  say "The sum of (@numbers) is $sum";
}

调用函数:
running_sum( 5, 6 );
running_sum( 1..3 );
running_sum( 4 );


改写成Python调用,则为如下格式:
running_sum( 5, 6 )
running_sum( [1, 2, 3] )
running_sum( 4 )


则程序输出为:
The sum of (5 6) is 11
The sum of (5 6 1 2 3) is 17
The sum of (5 6 1 2 3 4) is 21

如果允许使用全局变量,那么其实很简单;因此不能使用全局变量。
如果使用class,大概也不太难实现,不过我没试验过。

如果只用函数改写,而不用到class,可能需要用到如下知识:
1. 变长函数参数,类似于 def func(a, b, *args, **kargs). Perl调用时,参数会自动解嵌套成一个变长的非嵌套的list;而Python的参数则可能嵌套。当然简单起见,只要实现上述变长非嵌套参数调用即可。  (-:
2. generators. 但是generator函数只是在执行期间保留状态,而原Perl程序则是多次调用函数。因此我的想法是在Python版的函数体内使用 while true 形式的死循环.


期待高手出手....
sum = 0
def run_sum(a, b, *args):
    global sum
    sum += a + b
    for i in args:
        sum += i

if __name__=='__main__':
    run_sum(1,2)
    print sum
    run_sum(3,4,1,2)
    print sum


[Copy to clipboard] [ - ]
CODE:
>>>def test(*args):
...     if not hasattr(test,'total'):test.total=0
...     test.total +=sum( [ type(v) is tuple or type(v) is list and sum(v) or v for v in args ])
...     return test.total
...
>>> test(1,2,3)
6
>>> test([1,2,3],4,5,6)
27
>>> test(1)
28

我对Python不熟说的不对别骂我。。。
在perl5.10之前都是利用闭包间接实现静态变量的

[Copy to clipboard] [ - ]
CODE:
{
  my $count;
  sub foo{print $count++;}
}

Python 也有类似的做法.

[Copy to clipboard] [ - ]
CODE:
def foo():
  count = [1]
  def bar():
    count[0] += 1
    return count[0]
  return bar
bar = foo()
print bar()
print bar()

突然想我想起perl宣称的解决问题的办法不止一种
py也有很多种
为啥不能用全局变量呢
global 就是全局的啊
如我在要求里说的,如果使用全局变量,那么就很容易实现了。我是想看看Python用什么方法也可以实现Perl、C中的static类型的变量。
因此,二楼的方法其实是不符合要求的,呵呵
其实《Learn Python》一书中也提到了类似的解答方法,除了使用class外,另外两种办法就是三楼和四楼两位的解决办法了。
此外,似乎使用generator语法并不能达到我想要的目的   ):


QUOTE:
原帖由 xiaoyu9805119 于 2009-1-15 12:48 发表
突然想我想起perl宣称的解决问题的办法不止一种
py也有很多种

对一个问题,通常情况下,Python都不会只有一种解法;但是,直观简单的解法往往只有一种  
python的全局变量其实是模块级变量,与传统意义上的全局变量不同。应该充分利用,不必排斥。