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

# 1. はじめに
　これからPythonを始める方や、Pythonに慣れてきて本格的なプログラムを書きたい方向けに、Pythonicなコード(Pythonらしい、シンプルでカッコ良いコード)のサンプルを、いくつかまとめてみました(やりたいことからコードのサンプルを見つけられるよう、逆引き辞典のような形で内容を整理しています。)。

　こういう書き方を覚えると、初心者の方々でも、「Python?? そんなん書けるし! 余裕😆!!」みたく、ドヤ顔で、カッコつけることができるようになります。また、[Github](https://github.com/)等で公開されているPythonのコードも、Pythonicな書き方で書かれていることが多いので、記事の内容を理解しておくと、ご自身で、興味のあるプロジェクトに参加したり、コードを読み解く際にも、役に立つかと思います(先人の書いた良質なコードを読み解いてみたり、改良したりするのが、Pythonを覚える最短の道です!!)。

https://www.python.org/


# 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 複数の変数への値の代入
　一行で、複数の変数に、値を代入することができます。見た目がシンプルになるので、コード全体が見やすくなります。

```python:Non-pythonic
a = 1
b = 3
```

```python:Pythonic
a, b = 1, 3
```


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

```python: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]
```

```python:Pythonic
l = [1, 3] # list
a, b = l

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


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

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

```python:Pythonic
l = [i+1 for i in range(3)]
# l = [1, 2, 3]
```


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

```python: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]
```

```python:Pythonic
l = [1, 2, 3]
l_doubled = [2 * x for x in l]
# l_doubled = [2, 4, 6]
```


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

```python: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]
```

```python:Pythonic
l = [1, 2, 3]
l_cubed = [element*element*element for element in l]
# l_cubed = [1, 8, 27]
```


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

```python: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]
```

```python: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でお金を稼いでいこうとしている方々、ご自身でプログラムを作ろうとしている方々に、おすすめの資料です。

https://google.github.io/styleguide/pyguide.html


### ⭐️ DeepL Translate
　もし、英語が苦手であれば、DeepL等を使って、日本語に翻訳してしまいましょう。

https://www.deepl.com/en/translator


### ⭐️ シフトスケジュール問題を解くプログラムのサンプルコード
　Google様の公開されている、シフトスケジュール問題を解くプログラム(バイトなどのシフトを自動的に決められるプログラム)のサンプルコードです。スタイルガイドを眺めて、飽きてきたら、実際に、コードを読んで、解読してみると、すごく面白いです。この機能は、こう書くんだ!!等々 様々な発見があるはずです。コピーして、チョロっと改造してみるのも良いです。グイっと実力がアップすること間違いなしです。

https://github.com/google/or-tools/blob/master/examples/python/shift_scheduling_sat.py


### ⭐️ シフトスケジュール問題を解くプログラムのサンプルコードの解説
　上記のサンプルコードには、詳細な解説がついていなかったので、別途簡単な解説の記事を作っています。事前に、眺めておくと、サンプルコードの全体像が分かるようになるので、読み進めやすくなるかと思います。

https://qiita.com/PowHolic/items/6591585a28f0881abf50


### 💩 ウンコード・マニア
　世の中には、ダメダメなコード(通称、ウンコード)もたくさんあります。下記のサイトでは、その例が多数紹介されています。良いコードだけでなく、ダメなコードも見ておくのも、勉強になりますので、反面教師として、ざっと眺めてみましょう。冗談のようなダメダメコードがたくさんありますが、実際の仕事の現場でもこういったものが見つかることもあります。

https://unkode-mania.net/



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