Another introduction to programming language C 10: 数値を読み込んで総和と平均を表示するPythonプログラム

標準入力から数値列を読み出して,総和と平均を求めるプログラムを今度はPythonで書いてみる.

import sys
num = sum = 0
for line in sys.stdin:
    num += 1
    sum += float(line)
avg = sum / num
print "sum = %f, avg = %f" % (sum, avg)

拍子抜けしたかもしれないが,近代的なプログラミング言語とはこのようなものである.

比較のため元のCプログラムを再掲する.

#include <stdio.h>
#include <stdlib.h>

void read_from_stdin(int *n_values, double *array) {
  /* この関数が
    for line in sys.stdin:
      num += 1
    に相当する */
  *n_values = 0;
  while (!feof(stdin)) {
    char buff[1000];
    double v;
    fgets(buff, 1000, stdin);
    sscanf(buff, "%lf", &v);
    array[n_values] = v;
    *n_values += 1;
  }
}

void do_something(int n, const double *a) {
  /* この関数が
    for line in sys.stdin:
      sum += float(line)
    avg = sum / num
    print "sum = %f, avg = %f" % (sum, avg)
    に相当する */
  double sum = 0;
  int i;
  for (i = 0; i < n; i += 1) {
    sum += a[i];
  }
  printf("sum = %f, average = %f\n", sum, sum / n);
}

int main(int argc, char *argv[]) {
  double *a = calloc(10000, sizeof(double));
  int n;
  read_from_stdin(&n, a);
  do_something(n, a);
  return 0;
}

C言語とPythonの主な違いは,その抽象度である.

C言語はアセンブリ言語に近い(従って機械に近い)記述を得意とする反面,数学を扱うには抽象度が低すぎる.一方Pythonは数学を扱うにはかなりよい抽象度を持つ反面,アセンブリ言語に近い記述は不可能である.

一つの言語で,アセンブリ言語近く(例えばOSのファンクションコールを発行したりビット操作をしたり)から数学並みの抽象度(行列の計算や関数を返す関数など)までカバーするような言語は存在する.C++0x(現在はまだ策定中)と Common LISP だ.ただし,両者とも言語仕様が大きすぎるきらいがある.はっきり言えば,使いこなすのが難しい.そこで,複数の言語を組み合わせるという方法が日常的に行われる.低レベル部分はC言語に任される傾向がある.高レベル部分はPythonであったり,LISPをコンパクトに作り直したSchemeであったりする.

C言語をマスターしても,計算機言語のマスターへはまだまだ道があるのである.
Comments