【Python】C言語との記述法の違いを比較

PythonはC言語よりも非常に短いコードで処理を記述できます。
プログラムの内容にもよりますが、同じ内容のプログラムを記述した場合、C言語に比べてPythonのほうが5~10倍程度少ないコード量で済むと言われたりもしています。
このページでは、PythonとC言語との記述法の簡単な違いの比較を実際にソースコードを並べて比較していきます。

【はじめに】Hello World!

まずは、プログラミング入門時にお馴染みの「Hello World!」。
C言語とPythonで書くとそれぞれ次のようになります。

C言語

#include <stdio.h>

int main(void)
{
    printf("Hello World!");
    return 0;
}

Python3

print("Hello World!")

C言語の標準出力はprintf関数ですが、Pythonはprint関数と微妙に関数名が違います。
また、PythonではC言語のように「main関数」や「標準出力のためのライブラリ読み込み」は必要ありません。
文末にセミコロン(;)をつける必要もありません。
そのため、Python「Hello World」は1行でかけてしまいます。

ただし、日本語の文字列を扱う場合、冒頭に「# -*- coding: utf-8」と付けます。

# -*- coding: utf-8
print("こんにちは世界")

変数の宣言・代入

続いて変数の宣言と代入を比較します。

C言語

#include <stdio.h>

int main(void)
{
    int num;
    num = 2;

    return 0;
}

Python

num = 2

Pythonには変数宣言、型宣言はありません。
最初からそのまま変数に代入できます。
尚、変数の型は代入された値によって自動的に決まります。

繰り返し(while文)

繰り返しの制御構文(while文)の比較をします。

C言語

#include <stdio.h>

int main(void)
{
  int i = 0;

  while(i < 5){
    printf("%d\n", i);
    i++;
  }
  return 0;
}

Python

i = 0

while i < 5:
  print(i)
  i += 1

C言語では括弧({~})で括って制御範囲を示すのに対し、Pythonではコロン(:)とインデント(空白)で制御範囲を表します。
これはwhile文に限らず、for文、if文、関数定義などでも同じです。
そのためPythonでは「インデント」がとても重要となります。
また、Pythonでは「i++」の略記が使えず「i += 1」のみとなります。
Print文に変数をそのまま代入するだけで値を標準出力することもできます。

- 参考記事
1 【C言語】while文の使い方 (条件式など)
2 【Python】while文で繰り返し処理(反復)

繰り返し(for文)

繰り返しの制御構文(for文)の比較をします。

C言語

#include <stdio.h>

int main(void)
{
  int i = 0;

  for(i=0; i<5; i++){
      printf("%d\n", i);
  }

  return 0;
}

Python

for i in range(0, 5, 1):
    print(i)

for文の書き方は大きく異なります。
Pythonでは、カウント変数iの初期値と終了条件を指定するのにrangeを使います。
range(0, 5, 1)だと初期値は0でカウント数は+1です。
そして、カウント変数が5以下の間、処理を繰り返します。
ただし、カウント変数が+1の場合、range(0, 5)と略記できます。
また、初期値が0ならrange(5)とさらに略記できます。

for i in range(5): # = range(0, 5, 1)
    print(i)
- 参考記事
1 【C言語】for文の使い方 (条件式など)
2 【Python】for文で繰り返し処理(反復)

条件分岐(if文)

条件分岐(if文)の比較をします。

C言語

#include <stdio.h>

int main(void)
{
      int i = 3;

      if(i == 1){
        printf("i=1");
      }
      else if(i == 2){
        printf("i=2");
      }
      else if(i == 3){
        printf("i=3");
      }
      else {
        printf("i=4");
      }
      return 0;
} 

Python

i = 3

if i == 1:
  print("i = 1")
elif i == 2:
  print("i = 2")
elif i == 3:
  print("i = 3")
else:
  print("i = 4")

C言語の「else if」がPythonでは「elif」と地味に短くなっているのがポイントです。

- 参考記事
1 【C言語】if文の使い方 (条件式など)
2 【Python】if文で繰り返し処理(反復)

関数定義・呼び出し

関数の定義と呼び出しで比較します。

C言語

#include <stdio.h>

// 関数定義
int fanc(int a, int b){
  int c = 0;
  c = a + b;
  return c;
}

int main(void)
{
  int x = 0;

  // 関数呼び出し
  x = fanc(1, 2);

  printf("%d", x); // 3

  return 0;
}

Python

# -*- coding: utf-8
# 関数定義
def fanc(a, b):
  c = a + b
  return c

# 関数呼び出し
x = fanc(1, 2)

print(x)  # 3

Pythonでは、関数定義に「def 関数名:」を使います。
C言語のように関数や引数に型を定義する必要はありません。

配列・リスト

C言語の配列に近いものとして、Pythonにはリストがあります。
両者を比較しています。

C言語

#include <stdio.h>

int main(void)
{
  int list1[5] = {1, 2, 3, 4, 5};
  int i = 0;

  for(i=0; i<5; i++){
      printf("%d\n", list1[i]);
  }

  printf("%d", list1[1]);

  return 0;
}

Python

list1 = [1, 2, 3, 4, 5]

print(list1) # [1, 2, 3, 4, 5]
print(list1[1]) # 2

Pythonでは、print関数に配列を渡すだけで中身を確認できます。
他にもスライスという便利な機能でリストの一部分のみを取り出したり、リストの長さを途中で変更することも可能です。
また、異なるデータ型の要素をもつことができます。

# -*- coding: utf-8
# 異なるデータ型の要素をもてる
list2 = [1, 'two', 3, 'four', 5]

# スライスで2~3番要素のみ取り出して表示
print(list2[2:4]) # [3, 'four']

このようにPythonのリストは自由度が高い一方、要素へ順にアクセスすると処理が重くなるデメリットを抱えています。
そこで、大量のデータを扱う場合は、NumPy配列と呼ばれるC言語の配列に近いものを使います。
ただし、NumPy配列はPython標準機能ではなく、「NumPy」と呼ばれる外部ライブラリを読み込むことで利用できます。

- 参考記事
1 【C言語】配列の宣言・初期化・代入
2 【Python】リストの使い方

関連記事

Python入門 サンプル集

コメント

  1. ARAKI より:

    こんにちはpython勉強のため拝見させていただきました。
    説明の中に明らかに間違いがあるのでご訂正ください、

    if文の説明でC言語の例が
    if(i = 1){
    となっていますが、正しくは
    if(i == 1){
    です。

  2. Sato より:

    はじめまして。
    Pythonを始めてみようかと思い、検索サイトからこちらに寄らせて拝見させていただきました。
    簡素かつ分かりやすい内容で、参考になりました。
    一箇所だけ、

    >また、「i = i + 1」の略記がPythonでは「i += 1」となります。

    のところに違和感がありました。
    間違いではないですが、C言語のソースは「i++;」という異なる表記ですし、C言語でも「i += 1;」と略記することが可能なので。

    • 管理人 より:

      ※Sato様
      コメントありがとうございます。
      ご指摘いただいた通り、違和感のある記述でしたので
      修正致しました。