My plot.

イントロクイズの話とか、プログラム関係の備忘録だったり。書きたいことを気が向いたときに書きます。

C# Programmer meets Python

最近、Python(3.x)なんかを触ったりしていたのですが、少し変わった言語だな~~と思ったので、C#プログラマ視点からいくつか特徴的な点を紹介してみようかなと思います。

いくつかの他言語(C#,Java等々)からPython使おうとしてる方は多少参考になるかもしれません、

ただし、私はC#大好きです

そのため、多少否定的になってしまうかもしれませんが、それはご愛嬌ということで。


Python 2.x系は微妙に内容が違いますので、そちらをこれから学ぶ、という方は十分にご注意ください。

全体像として

とりあえずHello, World.の比較。

using System;

namespace sample
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Hello, World!");
    }
  }
}


print("Hello, World!")

C#、圧倒的敗北感。

やはりというかなんというか。スマートさではPythonには叶いません。そりゃそうだよ。

かくいう私もpaizaなんかで簡単なコードサクサクやるときはPythonですし。


変数定義

int i = 100;

string player = "SHIZUKA MOGAMI";

bool flag = true;


i = 100

player = "SHIZUKA MOGAMI"

flag = True

型明示しなくていいのか~~なんか気持ち悪いな~~

と私は思ってしまいました。ちなみにC++大好きな先輩にも意見を求めたところ同じ感じでした。

もっとも暗黙的に型宣言してるだけで、型の概念はあります。当たり前です。
初めて入る人にはいいかもしれませんが、ここから明示的な言語に移る時、ちょっと大変な気もしなくもない。まあこの程度ならすぐ慣れますかね~~


条件分岐(=if)

とりあえず簡単に、合格点かどうかなんかを判断させてみます。

int score = 20;

if(score == 100)
{
  Console.WriteLine("満点です!すばらしい!");
}
else if(score >= 80)
{
  Console.WriteLine("合格です。");
}
else
{
  Console.WriteLine("不合格です。");
}


score = 20;

if score == 100:
  print("満点です!すばらしい!")
elif score >= 80:
  print("合格です。")
else:
  print("不合格です。")

括弧で囲わないのか…と、少し最初見にくかったりはしましたが、そこはだんだん慣れてコロン1個が楽になってきました。

そんなことよりelifって。少しは略されたseの気持ちも考えてやれよ!!

はい、茶番です。大体の言語でelse ifのままで略されませんから、少し不思議ではありますよね。


繰り返し構造(=for?)

forの後ろに?がついてるのに気づいた非Pythonプログラマの皆さん。よくぞ気づかれた。

なぜならPythonのforは他言語だとforeach1に当たるのです!!

「おいおい、for使いにくすぎやん!!」

と思われた方、私もそう思いました。

とりあえず "一般的なfor" を使おうとする場面を考えましょう。

for(int i=0;i<10;i++)
{
  Console.WriteLine(i);
}


for i in range(10):
  print(i)

「あれ、思ったより変じゃないのでは?」

ポイントはこのrangeという関数。

これは引数を1つあるいは2つ取りますが、それにより以下のような挙動をします。

list1 = range(5)
# ここでlist1には [0,1,2,3,4] というリスト(配列と似たもの)が代入されるイメージ(正確には違う)

list2 = range(-5,3)
# ここでlist2には [-5,-4,-3,-2,-1,0,1,2] というリストが代入されるイメージ(正確には違う)

つまり、rangeは整数の配列を作る関数と捉えてもらえれば問題ありません2。これをPythonfor(=foreach)と併用したら…

とても強力なのは言うまでもありません。この関数があるため、foreachforを一本化しても問題ないのでしょう。

では、普段のforeachのように使ったときを見てみましょう。

string[] cities = new string[]{"Yokohama", "Nagoya", "Osaka", "Hakata" };
foreach(string c in cities)
{
  Console.WriteLine(c);
}

// (以下出力される値)
// Yokohama
// Nagoya
// Osaka
// Hakata


cities = ["Yokohama", "Nagoya", "Osaka", "Hakata"}
for c in cities:
  print(c)

# (以下出力される値)
# Yokohama
# Nagoya
# Osaka
# Hakata

一つの関数で両方できるのは分かりやすかったりするのかな―と思ったり思わなかったり。他言語やってからやると、慣れれば難しいことはなかったです。

Pythonからプログラミングを始めた方は他をやろうとしたときに「うわっこれいちいち2個に分けてんのかよめんどくさ」とか思うんでしょうかね…

まとめ

とりあえず私がやっていて結構違うな、と思ったところを数点あげてみましたが、とにかくPythonは書きやすいです。

思い立ったらサラッと書ける。

でもやっぱりC#のほうが得意なことはあるわけで……上手に使い分けていければいいんだろうなーということです。どの言語にも言えることですが。

あ、turtleのことを書き損ねた。実用性はどうなのか分かりませんが、手軽にグラフィックが扱えるモジュールのturtleってのがあるので、興味がある方はどうぞ調べてみてください。気が向いたら取り上げます。

そういえばあんまり否定的にならなかったなー(o・∇・o)


  1. (ご存じない方向けの簡単な解説)配列などを指定し、その配列各要素に一度ずつある処理を行わせる、forの姉妹のようなものです。C#の例は繰り返し構造後半で提示するプログラムを参照ください。

  2. range関数、実際にprintしてみるとリストは出ないで、range(10)的なのがそのまま出るんですよね。内部的には遅延評価みたいにしてるんだろうか?その辺は勉強不足。まあ使う上ではリストだと思って使えばほぼ問題ないでしょう。