追記
図らずも多くの方々にご覧いただくことができ、いくつかの貴重なご意見を頂戴することができました。
皆様のご意見を元に記事を見直すとかなり至らない点が見受けられました。いただいた指摘を参考に、少しずつ記事を修正しております。
コメントでご指摘してくださった方にこの場をお借りしてお礼申し上げます。ありがとうございました。
2025-12-19
この記事の公開当初のタイトルは「Pythonでマクロを使ってみる」でしたが、記事の内容が「マクロ」という概念と少なからず乖離していたため現在のタイトル・内容に修正いたしました。
2025-12-21
記事の最後でコードの可読性が向上する、という話をしていましたがこの方法では可読性の向上にはつながらない、というご意見をいただいたため、その記述を削除・変更いたしました。
はじめに
この記事はUdon Advent Calendar 2025 - Adventarの17日目の記事です。
こんにちは。
Pythonは書きやすい上にライブラリが豊富なので、様々な用途に使えるプログラミング言語です。
Pythonでコードを書くとき、同じようなコードを何度も書くことがあると思います。例えば、データの前処理や特定の形式での出力などです。
それらをいちいち書くのは面倒な上にミスの原因にもなります。そこで、今回はよく使うが何行かにわたっているコードをメソッドとしてまとめ、短いコードで呼び出しを行えるようにしようと思います。
よく出てくるコードをクラスに
例えば、以下のようなコードがあるとします。
N = int(inpuy())
A = [0] * N
for i in range(N):
A[i] = int(input())
これはABCなどの競技プログラミングの問題を解く際によく利用されるコードです。
詳しい説明は省きますが、これは「N個の整数をリストAに格納する」という操作を行っています。
見ての通りこのコードは4行もあり、毎回書くのは面倒です。
これをメソッドにし、さらにクラスにまとめることで呼び出しを簡単にしたいと思います。
クラスを定義する
メソッドをまとめるクラスを定義します。特に名前の競合はないので、シンプルにFrequentとします。
class Frequent:
pass
ここからは、このクラス内に色々と追記していきましょう。
メソッドを定義する
早速、先程のコードをメソッドにしてみましょう。コードの機能は「整数N及びその後N行に渡って入力される整数をリストAに格納する」というものです。
これをメソッドにまとめてみましょう。引数なしで、NとAを返すようにします。
class Frequent:
def input_list():
N = int(input())
A = [0] * N
for i in range(N):
A[i] = int(input())
return N, A
これを呼び出す場合は以下のようにします。
N, A = Frequent.input_list()
これによって、一連の処理を通してNとAを得ることができました。呼び出す行は1行なので、事前にこれを定義しておけば、4行かかっていたコードをかなり短縮することができます。
こんな感じで、よく使う操作をまとめたメソッドをどんどん定義していきましょう。
いくつか書いてみました。
class Frequent:
# 整数Nと、N要素のリストAを入力する
def input_list():
N = int(input())
A = [0] * N
for i in range(N):
A[i] = int(input())
return N, A
# 整数H, Wと、H行W列の行列を入力する
def input_matrix():
H, W = map(int, input().split())
matrix = [0] * H
for i in range(H):
matrix[i] = list(map(int, input().split()))
return H, W, matrix
結構長くなってきましたね。
プログラムを書き始めるときは、これをプログラムの前の方に書いておきます。
クラスを別ファイルに切り分ける
せっかく定義したクラスは普段使いしたいですが、いちいちPythonコードを書くときにコピペしてくるのは面倒です。そこで、マクロを別ファイルに切り分けて、必要なときにインポートして使えるようにしましょう。
ディレクトリ構成を以下のようにしておきましょう。
.
├── frequent_codes.py
└── main.py
frequent_codes.pyには先ほど書いたクラスを置いておきます。そして、main.pyの冒頭に以下のようなことを書きます。
from frequent_codes import Frequent
こうすると、その後Frequentクラス内のメソッドをmain.pyで呼び出せるようになります。
こうすることで、以下のような利益があります。
- クラスをコピペしなくてもよくなる
- コードの冒頭が長くなることを防げる
- クラスメソッドの内容を変更したいとき、
frequent_codes.pyを編集すればクラスを使っている全ファイルに変更を行き渡らせることができる - 一部だけ変更したいときは
Frequentクラスを継承すればよい
基本的に定義したクラスは複数のファイルで使いたいと思うので、この方法がおすすめです。
おわりに
今回はPythonで複数行をひとまとめにすることをやってみました。
呼び出し部分を短くすることはできましたが、読みやすいか、と言われると微妙ですね。定義している位置がわかりづらくなるので、他の人に見せるには向かないです。
なので、競技プログラミングのなど速さが求められる場面で使うことがメインになると思います。自分で内容を覚えておき、事前に書いておけば実際の解答部分の実装が早くなるかもしれません。
それではまた、明日の記事でお会いしましょう!