LoginSignup
2
2

⭐️Pythonicなコードのススメ⭐️ ~ シンプルでカッコ良いコードを書くために!! ~

Posted at

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 複数の変数への値の代入

 一行で、複数の変数に、値を代入することができます。見た目がシンプルになるので、コード全体が見やすくなります。

Non-pythonic
a = 1
b = 3
Pythonic
a, b = 1, 3

#002 リストの要素の取り出し

 一行で、リストのすべての要素を取り出すことができます。見た目がシンプルになるので、コード全体が見やすくなります。タップルの要素を取り出す際も、同じやり方が使えます。

Non-pythonic
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]
Pythonic
l = [1, 3] # list
a, b = l

l = [1, 3, (2, 4)] # list of list
a, b, (c, d) = l

#003 リストの要素への値の代入

 一行で、リストの要素に、値を代入することができます。見た目がシンプルになるので、コード全体が見やすくなります。また、Pythonicでないコードよりも、実行速度が早くなります。

Non-pythonic
l = []
for i in range(3):
    l.append(i+1) # add element to given list
# l = [1, 2, 3]
Pythonic
l = [i+1 for i in range(3)]
# l = [1, 2, 3]

#004 リストの要素の簡単な繰り返し計算①

 リストの要素の簡単な繰り返し計算であれば、一行で、計算を行うことができます。見た目がシンプルになるので、コード全体が見やすくなります。以下の例では、リストのすべての要素の2倍の値を求めています。

Non-pythonic
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]
Pythonic
l = [1, 2, 3]
l_doubled = [2 * x for x in l]
# l_doubled = [2, 4, 6]

#005 リストの要素の簡単な繰り返し計算②

 上記と同じような、簡単な繰り返し計算を、別のやり方で行うこともあります。(リストのすべての要素に定数を掛けたり/割ったりする程度であれば、上記のやり方の方が良いのですが、)より複雑な計算を行いたい場合は、こちらのやり方を取ることが多いです。以下の例では、リストのすべての要素の3乗の値を求めています。

Non-pythonic
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]
Pythonic
l = [1, 2, 3]
l_cubed = [element*element*element for element in l]
# l_cubed = [1, 8, 27]

#006 条件を満たすリストの要素の取り出し

 一行で、条件を満たす、リストの要素を取り出すことができます。見た目がシンプルになるので、コード全体が見やすくなります。以下の例では、リストのすべての要素の中から、2以上の値を持つ要素だけを取り出しています。

Non-pythonic
l = [1, 2, 3]
l_sliced = []
for i in range(3):
    if l[i] >= 2:
        l_sliced.append(l[i])
# l_sliced = [2, 3]
Pythonic
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. 最後に

 生き物は必ず死を迎えます。それも、いつ訪れるのかわかりません。明日ミサイルが飛んでくるかも。時間は有限です。その中で、如何にやりたいことを成し遂げるのか、その鍵は時間の使い方にあります。計算機にやれる仕事はすべて、計算機にやってもらいましょう。そして、自分にしかできないこと、やりたいことをやりましょう。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2