C# や Java 開発者のための Python 入門 研修コースに参加してみた
今回参加した研修コースは C#やJava開発者のためのPython入門 です。
人気のPythonですが、教室も満員御礼でその人気がうかがえました !!
今回は Java や C# 開発経験がある方を対象に、 Python との書き方の違いや言語機能の違いを解説いただいたのですが、書き方にはそれほど違いはないものの、高階関数などJavaにはない機能にちょっと慣れないなー、という印象でした。
また最後には Python らしくデータサイエンスのライブラリをインストールして、数値解析のサンプルを書いて動かしてみました。とってもいい体験でした !!
Pythonどんなものかなー、という雰囲気を知りたい方にはデータサイエンスの演習までついて、とってもオススメです !!
では、どんなコースだったのかレポートします !!
もくじ
コース情報
想定している受講者 | C#もしくはJavaプログラミングの中級レベルの知識 |
---|---|
受講目標 | Pythonプログラミングの基本的なスキルを習得する |
講師紹介
プログラミングのコースではお馴染みの 米山 学 さんです。
JavaはもちろんPython/PHPなどスクリプト言語、Vue/ReactなどJSだってなんだってテックが大好き。原点をおさえた実践演習で人気
この “参加してみた” レポートでもいくつかレポートしていますので、ぜひご覧ください。
研修コースに参加してみた
講座でやること
- Python と Java 、C# の違いを解説
- やらないこと
- 機械学習や Deep Learning の基礎はやりません
Python の背景
- ビッグデータ解析、機械学習、深層学習などデータサイエンスの人気の高まりに応じて Python も上昇中
- Google Trends / TIOBE / GitHub などでも上昇中
- Google Trends / TIOBE / GitHub などでも上昇中
JavaScript は小さなライブラリがとても多く、Stats は上位になりますので、実質的には Python かなーという印象です。
言語構造の違い
まずは机上で言語構造の違いを解説してもらいました。
Java、C# と Python との違いで特徴的なところ
- Python はコンパイラが要らない
- 型などのバグに実行後に分かるということもある
- 自動でキャストしたときのバグの再現性が低い
- 読みやすさ、簡潔さが重要視されるのが Python
- インデントが厳密 // 無いとエラー (!!)
- 他の言語は「任意」
{ }
や;
が不要
Hello Python!!
見るより書いてみるほうが早い、ということもあり、実際に Python で書いてみます。
まずは開発環境です。さすが、人気です。開発環境がサクッと手に入ります。
- Windows で Python を使うには Anaconda というパッケージがオススメ
- Jupyter Notebook などデータサイエンスのライブラリに加えて「R」などもオールインワンで入っている (!)
- 今回は Jupyter notebook を使ってコードを書きます
- エディタ上で実行できる (!!) -> いちいち実行コマンド叩かない!!
- エディタ上で実行できる (!!) -> いちいち実行コマンド叩かない!!
Hello Python を書く
- Java
class Hello { public static void main(String[] args) { System.out.println("Hello Python!"); } }
- Python
print("Hello Python!")
言語仕様の違い
Hello! Python を実行したところで、言語仕様が違うところに気付きます。
- クラスは必ずしも必要ではない (!!)
- mainメソッドは必要ない (!)
- コメントの書き方
- Java
// コメント /* コメント */
- Python
# コメント ''' コメント (シングルクォート3つ) '''
- Java
- インデントをあわせないとダメ
- 命名規約がありキャメルケース camelCase ではなく スネークケース snake_case を使う
インデントのルールは無用なインデント論争を避けつつ、読みやすくしようという意図かもしれませんね。
リテラルと変数およびデータ型
- 明示的な変数宣言は不要
- Java
int num = 0; // int型 String str = "abc"; // String型(C#の場合string) num = str; // Compilation Error
- Python
num = 0 str = "abc" num = str # OK
- Java
- 文字列
- Java
"hello!"
- Python
'hello!!' "hello!!"
- Java
- 配列
- Java
int[] array = new int[3]; array[0] = 1;
- Python
array = [1, 2, 3] array[-1] # 3
- Java
- 2 次元配列
- Java
int[] array = {{1, 2}, {3, 4}};
- Python
array = [[1, 2], [3, 4]]
- Java
- if 文
- Java
if (condition) { // true }
- Python
if condition: # true
- Java
- for 文
- Java
for (int i; i < 3; i++) { // statement }
- Python
for i in range(3): # statement
- Java
- foreach 文
- Java
for (int n : array) { // statement }
- Python
for n in array: # statement
- Java
- while 文
- Java
while (condition) { // statement }
- Python
while condition: # statement
- Java
突拍子もないほど違うことはありませんね。とはいえ、心なしか Python の方が直感的です。
関数
関数の定義
ここからは Java や C# と違う言語機能にフォーカスして紹介いただきました。
- Python は関数型言語も取り入れている
- C# や Java はクラスがないとメソッドを定義できない
- 一番近いのは
static
メソッド
- 一番近いのは
では、見てみましょう。
- Java
void func() { } void func(int i) { } int func() { return 0; } int func(int i) { return 0; }
- Python
# defで関数を宣言する def func(): pass # pass を書かないとエラーになる (定義を書いたところで内部実行されオブジェクトとして扱われる) # インデントは必須 def func(i): pass def func(): return 0 def func(i): return 0
関数だけを定義できるのはスクリプト言語では多いですね。
ちなみに def
は define の略で、Ruby でも宣言に使っているので、この辺は色々な影響を受けていそうです。
// Perl は sub
PHP は function
高階関数 High-Order Function
さらに違うところです。
この高階関数はちょっと慣れないなー、と思ったので、社内のエンジニアに聞くと、今個人的に学習している PHP でも、
array array_map ( callable $callback , array $array1 [, array $... ] )
という array_map 関数がありますよね、と社内のエンジニアからコメントをもらい、勉強不足を露呈しました。。orz
話を戻し、気を取り直して、高階関数です。
- 引数として関数を受け取ることができる # F1(F2)
- 戻り値として関数を返すことができる # F1->F3
見てみた方が早いのでサンプルです。
def double(n):
return n * 2
def triple(n):
return n * 3
double(2) # 4
triple(2) # 12
# 変数に関数を入れることができる
d = double
d(2)
# 引数に関数を入れることもできる
list(map(double, [1, 2, 3])) # [2, 4, 6]
なお、Java 8 以降や C# ではラムダ式で似たようなことができるそうです。
内包表記
さらに続きます。もう、ちょっ、何言ってるか、わかりません。
list = [x for x in range(5)] # 0~4までのリストを作成
- Java や C# では書けない
- ワンライナーのような書き方になるので慣れてないと分からない。。
- むやみやたらに使うものではない
クラス
関数のところで戸惑いましたが、ここからは馴染んだクラスの表現です。
- Java
class Foo { // }
- Python
class Foo: pass # 内部的にはクラスオブジェクトが実行される (インスタンスが出来る訳ではない)
クラス・メンバー
ここは Python だと冗長な書き方ではないので、逆にいい感じです。
- Java
class Foo { int x; void setX(int x) { this.x = x; } int getX() { return x; } } Foo foo = new Foo(); foo.setX(1); foo.getX(1); // => 1
- Python
class Foo: # フィールドの定義は不要 def set_x(self, x): # 第一引数に自インスタンスを指定する self self.x = x # self という変数名は慣習 def get_x(self): return self.x # python には new 演算子が無い foo = Foo() foo.set_x(1) foo.get_x() # => 1
その他コンストラクタや継承についても紹介いただきましたが、ここも突拍子もないものはありませんでした。
書いてみましょう
ここまで違いを学んだもので、実際に連結リスト(リンクトリスト)を実装します。
class Node:
def __init__(self, data=None): # Noneは null を指すオブジェクト
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def add_first(self, data):
new_node = Node(data)
new_node.next = self.head
self.head = new_node
def remove(self, remove_key):
head = self.head
if head is not None:
if (head.data == remove_key):
self.head = head.next
head = None
return
while head is not None:
if head.data == remove_key:
break
prev = head
head = head.next
if head == None:
return
prev.next = head.next
head = None
def print_all(self):
printval = self.head
while printval:
print(printval.data),
printval = printval.next
list = LinkedList()
list.add_first("Mon")
list.add_first("Tue")
list.add_first("Wed")
list.add_first("Thu")
list.remove("Tue")
list.print_all()
一旦、ここまでで主な言語仕様の違いを解説いただいたのですが、最後のサンプルでも確かに Python は読みやすいと感じます。
Python によるデータサイエンス
最後にお楽しみということで、Python といえば、データサイエンスです。
実際にデータセットとライブラリを使って、データを解析し、グラフを出したりしました。
- 使用したデータセット
- 使ったライブラリ
- 模様
最後のグラフを表示する演習を終えたところで、コースは修了しました。
まとめ
今回のコースでは Java と C# から Python の書き方や言語機能を眺めてみました。
最後のデータサイエンスの演習で感じたのは、Python はやはり Jupyter Notebook で書いて実行して解析したり、学習モデルの精度を上げたり、いくようなもので使うんだなー、というのを実感しました。 (実験に近い感覚です)
Python には Django などの Web アプリケーションフレームワークもありますが、用途の違いを肌で感じられたことはとても良い体験でした!
これから Python に触れてみようかな、と思う方には "知って、書いて、体験する" をセットできるのでとてもオススメです !!
label SE カレッジの無料見学、資料請求などお問い合わせはこちらから!!
label SEカレッジを詳しく知りたいという方はこちらから !!
IT専門の定額制研修 月額28,000円 ~/ 1社 で IT研修 制度を導入できます。
年間 670 講座をほぼ毎日開催中!!
SEプラスにしかないコンテンツや、研修サービスの運営情報を発信しています。