はじめに
この記事は、普段Java(オブジェクト指向言語)を書いている僕が、
新しくPythonを学んで感じた所感をまとめたものです。
JavaエンジニアがPythonを触るとどう感じるのか、そんな視点で読んでいただければ幸いです。
僕のスペック
- 7年目エンジニア
- Java歴5年
- 設計原則やオブジェクト指向の基礎知識あり
なぜPythonを勉強しようと思ったのか
単純な興味本位によるものですが、一番はなぜ世間でPythonが人気なのかを知りたかったからです。
GitHub Octoverse 2024 によれば、2024年の間、Pythonが最もGitHubで使われている言語とされています。
また、Pythonを覚えて簡単な業務ツールを作ってみたいと思いました。
最初にやったこと
Pythonに触れるにあたり、まずは「思想 → 公式情報 → 基本文法」の順で理解を深めました。
他の言語でも同じですが、言語が作られた背景知識や哲学を知っておくと、理解がスムーズになります。
Pythonの禅(Zen)を読んだ
まず最初に、Pythonの設計思想を知るために「The Zen of Python」に目を通しました。
これは、Pythonプログラマが持つべき心構えについて書かれた短い文です。
印象としては、Pythonプログラマに限らず、全プログラマが読んだ方が良い心構えだと感じました。
以下のような内容が特に印象に残りました。
Readability counts.
読みやすいことは善である。
If the implementation is hard to explain, it's a bad idea.
コードの内容を説明するのが難しいのなら、それは悪い実装である。
原文は英語で書かれているため、詳しく解説されている以下の記事を読みました。
Python公式のFAQサイトを読んだ
次に、Pythonの成り立ちや用途を知るため公式FAQを確認しました。
- なぜPythonが開発されたのか
- Pythonとはなにか
- Pythonは何をするのに向いているか
など、初心者が最初に疑問に思う部分が網羅されています。
全ては読めていないですが、以下のQAは印象に残りました。
Python の互換性を無くすような提案をしてもいいのですか?
どんなひどい設計だとしても、その変更が全ユーザーに影響を与えるならやるな
という回答は、ソフトウェア開発全般に言えることだと思います。
Pythonの勉強方法
ゼロからのPython入門講座を一通り読む
文法学習には以下のサイトを使いました。
このサイトは、Google Colab(Pythonをブラウザ上で実行できるサービス)を使ってPythonの基本的操作を学習できるサイトです。
基本的なプログラミング知識はあったので、「Pythonではどう書くのか」を中心にざっと読みました。
サイトのタイトルにもあるように、全くのプログラミング初心者にも分かりやすく書かれていておすすめです。
特に、環境構築をせずブラウザ上でコードを動かせるのは、初心者にはとてもありがたいと思います。
書籍購入- VTuberサプーが教える! Python 初心者のコード/プロのコード
基本文法から一歩踏み込んで、読みやすい/安全なPythonコードを学びたかったので購入しました。
ITエンジニア本大賞2025にて、技術書部門ベスト10 に選ばれています。
個人的に買ってよかったと思ったのは、
馴染みのあるJava言語との書き方の違いを知ることができた点です。
- Pythonらしい命名
- 例外処理
- クラスの継承
- テストコード
- ログの設定
書籍内で、Javaとの比較は一切書かれていません。
あくまで、僕がJavaエンジニアだったので比較しながらPythonを学ぶことができた という意味です。
また、コードの解説だけでなくVS Codeでの操作方法も画面キャプチャ付きで丁寧に解説されており、非常にわかりやすかったです。
これは個人的な主観ですが、
一般的なネット記事や動画講座では、基本文法までしか解説していないことが多い印象です。
しかし、本書では実務で扱うことを想定しており、読みやすい/安全なコードについて丁寧に解説されています。
Python覚えたての初心者が1つレベルアップするための学習教材として、非常におすすめできる内容でした。
YouTubeでも解説動画が投稿されており、こちらも非常にわかりやすいです。
個人的に、uvを使った仮想環境でのパッケージ管理の解説動画がわかりやすくて助かりました。
(Javaではパッケージ管理の概念があまりなかったので勉強になりました)
Pythonで感動したこと
ここからは、実際に触ってみて感じた “良かった点” を紹介します。
Javaより圧倒的に少ないコードで書ける
まず驚いたのは、コード量の少なさ です
実際にサンプルコードで比較してみます。
(わかりやすさを重視するために、あえて例外処理は書いていません。)
CSVファイル読み取り
以下のCSVファイルから、20歳以上のユーザー名だけを取得する関数で比較してみます。
name,age
tarou,22
Bob,19
zirou,25
JavaのCSVファイル読み取り
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
public List<String> loadAdultNames(String filePath) throws IOException {
try (var lines = Files.lines(Path.of(filePath))) {
return lines
.skip(1) // ヘッダ行をスキップ
.map(line -> line.split(","))
.filter(cols -> cols.length >= 2)
.filter(cols -> Integer.parseInt(cols[1].trim()) >= 20)
.map(cols -> cols[0].trim())
.toList();
}
}
CSVライブラリは使わず、Javaの標準機能だけで書いた例です。
-
Files.linesでファイル読み込み(ストリーム) -
skip(1)でヘッダ除外 -
split(",")で列に分割 - 年齢列を
Integer.parseIntして 20以上だけフィルタ - 名前列だけ
List<String>で返却
行数:13行+import 4行 = 17行
PythonのCSVファイル読み取り
import csv
def load_adult_names(path: str) -> list[str]:
with open(path, newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
return [row["name"] for row in reader if int(row["age"]) >= 20]
-
openでファイルを開く -
csv.DictReaderで{"name": ..., "age": ...}辞書オブジェクト(キー名,value 形式)として読める - リスト内包表記で
年齢 >= 20 の行だけnameを取り出してリストにする
行数:4行+import 1行 = 5行
一目瞭然ですが、Pythonのほうが圧倒的にコード量が少なく、読みやすく感じます。
Javaのデータクラス
データクラスでも比較してみます。
ここでは、よくあるユーザークラスを例に見てみましょう。
ユーザークラスには、
- ユーザーID
- ユーザー名
- メールアドレス
があります。
public class User {
private int id;
private String name;
private String email;
public User() {}
public User(int id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
'}';
}
}
ドメイン駆動設計の値オブジェクトについて学んでいる方なら、
色々突っ込みたくなるコードですが、わかりやすさを重視してこの設計にしています。
個人的な主観ですが、現場ではsetter/getter で書かれたデータクラスが多いと感じています。
Pythonのデータクラス
from dataclasses import dataclass
@dataclass
class User:
id: int
name: str
email: str
@dataclass がクラスに定義されているのが特徴です。
@dataclass をつけることで、Userクラスはデータクラスとして認識され、以下の処理を勝手にやってくれます。
- コンストラクタ自動生成
- repr(Javaでいう toStringに 相当) を自動生成
- eq(Javaでいう equals に相当) 自動生成
- setter/getter不要(属性アクセスでOK)
2025/12/4 追記
Javaでも、record を使えば楽に書けることをコメントで教えていただきました。
ありがとうございます!
public record User(int id, String name, String email) {}
JDK16 で正式リリースされているようです。
キーワード引数が便利すぎる
Javaの場合、関数の呼び出しは引数で定義された順番通りに値を渡す様になっています。
Javaの引数指定
public String greet(String name, int age) {
return "Hi " + name + " (" + age + ")";
}
// 呼び出し
greet("tarou", 20); // ←順番がすべて
引数が少ない関数の場合、この書き方は気になりません。
しかし、以下のコードのように引数の定義が多くなると、呼び出し側は引数指定を慎重にする必要があります。
引数が多くなると、呼び出し側で引数の指定ミスにつながりやすくなります。
Pythonは、キーワード引数の仕組みで可読性を高める
Pythonには、引数指定をする時、'引数名'='渡す値' の形式で関数を呼び出すことができます。
これにより、どの引数に何を渡すのかが分かりやすくなります。
def greet(name, age):
return f"Hi {name} ({age})"
greet("tarou", 20) # Javaと同じく順番通りに引数を指定
greet(name="tarou", age=20) # キーワード引数
greet(age=20, name="tarou") # 順番を入れ替えてもOK
さらに、デフォルト引数の設定も可能です。
def greet(name, age=0):
return f"Hi {name} ({age})"
greet("zirou") # age=0 が自動で入る
個人的に、
この引数指定の柔軟さは素晴らしい仕組みだと思いました。
軽く調べたところ、C#、Ruby、Kotlin あたりのメジャー言語も対応していたので、
逆にJavaが対応していないのが珍しいくらいな気がしてきました。
インデントで処理スコープを管理している
Javaは、クラスや関数のスコープを {} で管理しているのに対し、
Pythonは、インデントで管理しています。
def hello():
print("関数の中です") # ← インデントあり → 関数hello()のスコープ
if True:
print("ifの中です") # ← さらに深いインデント → if文のスコープ
print("関数内ですが、ifの外です")
print("関数の外です") # ← インデントなし → グローバルスコープ
最初見たときは読みづらさを感じていました。
しかし、インデントでスコープを分けるメリットは、自然とインデントが整えられたコードになるメリットがあることに気づきました。
Javaでは、{}で区切られていれば、インデントが不揃いでも動作します。
極端な例ですが、Javaでは以下のコードでも動作します。
public class Sample {
public void hello() {
System.out.println("関数の中です");
if (true) {
System.out.println("ifの中です");
}
System.out.println("関数内ですが、ifの外です");
}
}
コードフォーマッターを使えば解決できますが、
Pythonは言語の仕組みで解決しているのがよい点だと感じました。
Pythonが微妙だと思ったところ
良いところばかりではなく、気になった点もあります。
動的型付け言語であること
長年Javaを触ってきたからか、個人的にここだけは受け付けられません。
Pythonのサンプルコードはわかりやすさを重視しているのか、
基本的に型をつけずに変数定義をしています。
静的型付け言語であるJavaに慣れ親しんできた僕からすると、
Pythonのシンプルさを強調するコードよりも、型を定義していない箇所が気になって仕方ありませんでした。
最近のPythonでも型チェックに力を入れているらしく、
PyCharm1では、型未定義の場合に警告を出してくれます。(修正しなくても実行はできる)
しかし、警告してくれるとはいえ無視してもプログラムは実行できてしまうため、
堅牢性でいえば、Javaに分があるように感じました。
VS Codeでのセットアップが面倒だった
普段、僕はAndroidStudioでJavaを書いています。
開発に必要なビルド環境はすべてIDEが提供してくれるので、この点は楽でした。
VS Codeの場合汎用IDEゆえ、
Pythonの環境を構築しようとしたときに、必要な拡張機能を自分でインストールする必要があるのは手間に感じました。
特にコード補完やフォーマッター等の機能をPython用に染めていくなら、
拡張機能を探す必要があります。
Pythonに特化したIDEを使いたいならPyCharm一択(個人の感想)
PyCharmなら、コード補完、デバッグ、仮想環境管理、リファクタリングといった基本機能がPython専用で用意されているため、非常に強力でした。
特に、ライブラリのインストールがGUIベースで管理できる点は、とてもありがたかったです。
本格的なPython開発をするなら、迷わずPyCharmを推します。
ただし、Python以外の言語も扱ったり、PCのスペックが心許ない場合は、
軽量なVS Code をおすすめします。
複数のIDEを同時に触っていると、
ショートカットキーの違い等、細かい部分の違いが気になってしまいますからね。
実行速度は少し遅く感じる
「Pythonはインタプリタ言語2だから実行速度が遅い」なんて話を学習前から耳にしていました。
実際触ってみたところ、たしかに実行速度が少し遅いように感じます。
「Python 遅い」でGoogle検索するとかなりの件数がヒットするのでみんな感じているデメリットのようです。
このあたりの特徴から、大規模システム開発よりも、小規模アプリやツールの開発に向いていると感じました。
全体的な感想
Pythonを簡単に勉強してみた個人的な感想は、超書きやすいWindowsバッチのようなイメージです。
Windowsバッチ と表現したのは、小規模ツール・スクリプト用途では圧倒的に便利だと感じたからです。
仕事用でちょっとした効率化ツールが欲しい と思ったら、Pythonを選択するのが良いと思います。
今はコーディングAIエージェントもあるので、結構簡単に作れます。
一方で、
大規模システム開発になってくると、Javaのように制限の多い静的型付け言語が向いていると感じました。
結局のところ、何を作るかで言語を選択するべきで、優劣をつけることはできないと思います。
僕自身、新しい言語の学習をするのは久しぶりだったため、かなり刺激になりました。
少しずつPythonも勉強して自分の引き出しを増やしていきたいです。
ここまで読んでいただきありがとうございました。