1. はじめに
これからPythonを始める方や、Pythonに慣れてきて本格的なプログラムを書きたい方向けに、Pythonicなコード(Pythonらしい、シンプルでカッコ良いコード)のサンプルを、いくつかまとめてみました(やりたいことからコードのサンプルを見つけられるよう、逆引き辞典のような形で内容を整理しています。)。
こういう書き方を覚えると、初心者の方々でも、「Python?? そんなん書けるし! 余裕😆!!」みたく、ドヤ顔で、カッコつけることができるようになります。また、Github等で公開されているPythonのコードも、Pythonicな書き方で書かれていることが多いので、記事の内容を理解しておくと、ご自身で、興味のあるプロジェクトに参加したり、コードを読み解く際にも、役に立つかと思います(先人の書いた良質なコードを読み解いてみたり、改良したりするのが、Pythonを覚える最短の道です!!)。
1.1. なぜPythonicに書いた方が良いのか?
Pythonは、他の言語に比べて、書き方の自由度が高いので、慣れていないと、複雑で、長く、読みにくいコードになってしまうことがあります。そのような場合、誰も(書いた本人ですら、簡単には)中身を理解できなくなってしまう/デバッグや改良にものすごく時間やコストがかかってしまう 等々、数々の問題を引き起こすことがあります(※)。場合によっては、プログラムの実行速度が著しく遅くなってしまうこともあります。Pythonicに書くことで、これらの問題を回避しやすくなります。
※ 自身もそうでしたが、c言語 等、より低級な言語を学んだ後、Pythonを覚えて、書き始めると、Pythonicでないコードになりやすいです。例えば、c言語で、よくあるfor文の書き方(配列のインデックスでループを回す)をしてしまうと、プログラムの実行速度がものすごく遅くなります。他にも、c言語では普通の書き方が、Pythonでは、あまり良くない書き方であることがあります。
2. Pythonicなコードのサンプルの一覧
この記事では、以下のような、Pythonicな(Pythonらしい、シンプルでカッコ良い)コードのサンプルをまとめています。
- #001 複数の変数への値の代入
- #002 リストの要素の取り出し
- #003 リストの要素への値の代入
- #004 リストの要素の簡単な繰り返し計算①
- #005 リストの要素の簡単な繰り返し計算②
- #006 条件を満たすリストの要素の取り出し
3. Pythonicなコードのサンプル
Pythonicな(Pythonらしい、シンプルでカッコ良い)コードのサンプルです。PythonicでないコードとPythonicなコードの違いが分かるよう、両者を並べて(上段:Non-pythonicなコード(Pythonicでないコード)、下段:Pythonicなコード)、記載するようにしています。
#001 複数の変数への値の代入
一行で、複数の変数に、値を代入することができます。見た目がシンプルになるので、コード全体が見やすくなります。
a = 1
b = 3
a, b = 1, 3
#002 リストの要素の取り出し
一行で、リストのすべての要素を取り出すことができます。見た目がシンプルになるので、コード全体が見やすくなります。タップルの要素を取り出す際も、同じやり方が使えます。
l = [1, 3] # list
a = l[0]
b = l[1]
l = [1, 3, (2, 4)] # list of list
a = l[0]
b = l[1]
c = l[2][0]
d = l[2][1]
l = [1, 3] # list
a, b = l
l = [1, 3, (2, 4)] # list of list
a, b, (c, d) = l
#003 リストの要素への値の代入
一行で、リストの要素に、値を代入することができます。見た目がシンプルになるので、コード全体が見やすくなります。また、Pythonicでないコードよりも、実行速度が早くなります。
l = []
for i in range(3):
l.append(i+1) # add element to given list
# l = [1, 2, 3]
l = [i+1 for i in range(3)]
# l = [1, 2, 3]
#004 リストの要素の簡単な繰り返し計算①
リストの要素の簡単な繰り返し計算であれば、一行で、計算を行うことができます。見た目がシンプルになるので、コード全体が見やすくなります。以下の例では、リストのすべての要素の2倍の値を求めています。
l = [1, 2, 3]
l_doubled = [0, 0, 0] # dummy values
for i in range(3):
l_doubled[i] = l[i] * 2
# l_doubled = [2, 4, 6]
l = [1, 2, 3]
l_doubled = [2 * x for x in l]
# l_doubled = [2, 4, 6]
#005 リストの要素の簡単な繰り返し計算②
上記と同じような、簡単な繰り返し計算を、別のやり方で行うこともあります。(リストのすべての要素に定数を掛けたり/割ったりする程度であれば、上記のやり方の方が良いのですが、)より複雑な計算を行いたい場合は、こちらのやり方を取ることが多いです。以下の例では、リストのすべての要素の3乗の値を求めています。
l = [1, 2, 3]
l_cubed = []
for i in range(3):
l_cubed[i] = l[i] * l[i] * l[i]
# l_cubed = [1, 8, 27]
l = [1, 2, 3]
l_cubed = [element*element*element for element in l]
# l_cubed = [1, 8, 27]
#006 条件を満たすリストの要素の取り出し
一行で、条件を満たす、リストの要素を取り出すことができます。見た目がシンプルになるので、コード全体が見やすくなります。以下の例では、リストのすべての要素の中から、2以上の値を持つ要素だけを取り出しています。
l = [1, 2, 3]
l_sliced = []
for i in range(3):
if l[i] >= 2:
l_sliced.append(l[i])
# l_sliced = [2, 3]
l = [1, 2, 3]
l_sliced = [element for element in l if element >= 2]
# l_sliced = [2, 3]
5. 今後のレベルアップに役立つ資料
Pythonの実力の向上を図るための、資料をいくつか紹介します。レベルアップを目指したい方は、順々に眺めてみると、メキメキ実力がつきます。
⭐️ Google Python Style Guide
Google様の公開されている、Pythonのコーディングのスタイルガイドです。こういうふうに、Pythonのコードを書くと良いよ、というのが、例を交えて、まとめてあります。こう書いたら、どういうメリット/デメリットがあるのか、また、それを踏まえて、Google様がどういう書き方にする方針としたのか、その考え方まで、きっちりとまとめられているので、ものすごく勉強になります。特に、これからPythonでお金を稼いでいこうとしている方々、ご自身でプログラムを作ろうとしている方々に、おすすめの資料です。
⭐️ DeepL Translate
もし、英語が苦手であれば、DeepL等を使って、日本語に翻訳してしまいましょう。
⭐️ シフトスケジュール問題を解くプログラムのサンプルコード
Google様の公開されている、シフトスケジュール問題を解くプログラム(バイトなどのシフトを自動的に決められるプログラム)のサンプルコードです。スタイルガイドを眺めて、飽きてきたら、実際に、コードを読んで、解読してみると、すごく面白いです。この機能は、こう書くんだ!!等々 様々な発見があるはずです。コピーして、チョロっと改造してみるのも良いです。グイっと実力がアップすること間違いなしです。
⭐️ シフトスケジュール問題を解くプログラムのサンプルコードの解説
上記のサンプルコードには、詳細な解説がついていなかったので、別途簡単な解説の記事を作っています。事前に、眺めておくと、サンプルコードの全体像が分かるようになるので、読み進めやすくなるかと思います。
💩 ウンコード・マニア
世の中には、ダメダメなコード(通称、ウンコード)もたくさんあります。下記のサイトでは、その例が多数紹介されています。良いコードだけでなく、ダメなコードも見ておくのも、勉強になりますので、反面教師として、ざっと眺めてみましょう。冗談のようなダメダメコードがたくさんありますが、実際の仕事の現場でもこういったものが見つかることもあります。
4. 最後に
生き物は必ず死を迎えます。それも、いつ訪れるのかわかりません。明日ミサイルが飛んでくるかも。時間は有限です。その中で、如何にやりたいことを成し遂げるのか、その鍵は時間の使い方にあります。計算機にやれる仕事はすべて、計算機にやってもらいましょう。そして、自分にしかできないこと、やりたいことをやりましょう。