計算化学者のためのPython入門ー基礎知識のおさらいー

# はじめに
このシリーズは計算化学を題材にした Python プログラミングを紹介した「**計算化学者のためのPython入門**」の1つです。
特に「計算化学関連の Python プログラム開発に携わる予定」の読者を想定してます。

- [基礎知識のおさらい](https://qiita.com/TakuroTsutsumi/items/bcc86d243f5b38e93de9)
- [Python練習問題](https://qiita.com/TakuroTsutsumi/items/601f29d819624754e9df)
- [プログラム開発に参加するための心得](https://qiita.com/TakuroTsutsumi/items/cac3f3e7c32acaaef3ec)
- [クラスの使いみち](https://qiita.com/TakuroTsutsumi/items/5f8595bc2ffc68020a9b)
- [サンプルデータ集](https://qiita.com/TakuroTsutsumi/items/5dfb251ad0818d41cd1d)

Python3 は [Google Colab を使えばブラウザだけで実行](https://qiita.com/firedfly/items/9b76d4f4ea2b563777af) できます。


# 本記事の要点

- 「計算化学者のためのPython入門」シリーズを最大限楽しむために必要な Python 知識を Quiz 形式で紹介します。
- **Python Quiz**の答えにピンとこない方は「計算化学者のためのPython入門」シリーズを読む前に、[Python3 の基礎知識に不安がある人へ](#python3-の基礎知識に不安がある人へ)で紹介したサイトなどで Python3 の基礎知識を再確認することをおすすめします。


# Python Quiz

以下の Quiz の質問にピンとこない、答えを見てもよくわからない、調べようにも何をググればいいかわからない人は本シリーズを読み進める前に Python3 の基礎知識をおさらいするのがいいかもしれません。

---

Q1. 条件式 type("0") == type(0) は何を返す？

<details><summary>A1.</summary><div>

```python
False
```
</div></details>

---

Q2. import numpy as np や from math import pi は何をしている？

<details><summary>A2. </summary><div>

- numpyをインポートしてnpと定義
- mathからpi（円周率π）をインポート
</div></details>

---

Q3. 同じ階層にある test1.py で定義された hoge 関数を test.py で使いたい。どうすればいい？

```text
now_dir
 |___ test1.py (hoge 関数実装済み)
 |___ test.py
```

<details><summary>A3. </summary><div>

```python:./test.py
from test1 import hoge
```
</div></details>

---

Q4. list 型ではなく numpy.ndarray 型 (np.array) を使う利点は？np.array は何が便利？

<details><summary>A4. </summary><div>

- 配列同士の演算ができる
- 処理が速い　等
</div></details>

---

Q5. l_a = ["I", "have", "an", "apple"] の "apple" が "pineapple" に置換されたリスト l_b をつくるにはどうする？任意の l_a の "apple" を "pineapple" に置換したい場合はどうする？

<details><summary>A5. </summary><div>

loop と if 文を使うと以下のように書ける。
```python
l_a = ["I", "have", "an", "apple"]
l_b = []
for iele in l_a:
    if iele == "apple":
        l_b.append("pineapple")
    else:
        l_b.append(iele)
```

もしくは [numpy.where](https://note.nkmk.me/python-numpy-where/) を使うと以下のように書ける。

```python
import numpy as np
np_a = np.array(l_a)
np_a = np.where(np_a == "apple", "pineapple", np_a)
l_b = np_a.tolist()
```
</div></details>

---

Q6. 以下の test1.py を実行すると、どのように出力される？

```python:test1.py
print(1)

def test1(a, b):
    print(b)
    c = a * 2
    return c

print(3)
d = test1(4, 5)
print(d)
```
 
<details><summary>A6. </summary><div>

```python
1
3
5
8
```
</div></details>

---

Q7. 上で定義された test1 関数（メソッドとも言う）の引数、返り値はどれ？

<details><summary>A7. </summary><div>

- 引数：a, b
- 返り値：c
</div></details>

---

Q8. 以下の test2.py を実行すると何が出力される？

```python:test2.py
l_ppap = [["I", "have", "a", "pen"],
          ["I", "have", "an", "apple"],
          ["I", "have", "a", "pineapple"], 
          ["Pen-Pineapple-Apple-Pen"]]

for i in range(0, len(l_ppap)):
    if i < len(l_ppap[i]):
        print(l_ppap[i][i])
    else:
        print("No PPAP")
```

<details><summary>A8. </summary><div>

```python
I
have
a
No PPAP
```
</div></details>

---

Q9. 1 から 100 までループし、3 の倍数のときは "I have a pen"、4 の倍数のときは "I have an apple"、3、4 の公倍数のときは "I have a pineapple"、それ以外のときは "Pen-Pineapple-Apple-Pen" と出力するプログラムは書けそうですか？プログラム構造を想像できますか？

<details><summary>A9. </summary><div>

おそらくこんな感じ。プログラム構造を想像できましたか？
```python
for i in range(1, 101):
    if i % 3 == 0 and i % 4 == 0:
        print("%4d   " % i, "I have a pineapple")
    elif i % 3 == 0:
        print("%4d" % i, "I have a pen")
    elif  i % 4 == 0:
        print("%4d" % i, "I have an apple")
    else:
        print("%4d" % i, "Pen-Pineapple-Apple-Pen")
```
</div></details>

Q10. 以下のスクリプトを実行すると何が出力される？

```python
l_c = ["A", "B", 3, "d", 5.0]
l_d = list(range(len(l_c)))

for i, j in enumerate(l_c):
    print(i, j)

for i, j in zip(l_c, l_d):
    print(i, j)
```

<details><summary>A10. </summary><div>

enumerate() と zip() は便利なので覚えましょう。
```python
for i, j in enumerate(l_c):
    print(i, j)

> 0 A
> 1 B
> 2 3
> 3 d
> 4 5.0

for i, j in zip(l_c, l_d):
     print(i, j)

> A 0
> B 1
> 3 2
> d 3
> 5.0 4
```
</div></details>

---

Q11. 以下のスクリプトを実行すると何が出力される？

```python
d_element = {"H": {"Number": 1, "Mass": 1.007825}, 
             "C": {"Number": 6, "Mass": 12},
             "N": {"Number": 7, "Mass": 14.003074},
             "O": {"Number": 8, "Mass": 15.994915}}

print(d_element["H"])
print(d_element["C"]["Mass"])

for i, j in d_element.items():
    print(i, j)

for i in d_element.keys():
    print(i)
```

<details><summary>A11. </summary><div>

辞書も便利なので積極的に使いましょう。

```python
print(d_element["H"])
> {'Number': 1, 'Mass': 1.007825}

print(d_element["C"]["Mass"])
> 12

for i, j in d_element.items():
    print(i, j)

> H {'Number': 1, 'Mass': 1.007825}
> C {'Number': 6, 'Mass': 12}
> N {'Number': 7, 'Mass': 14.003074}
> O {'Number': 8, 'Mass': 15.994915}

for i in d_element.keys():
    print(i)
> H
> C
> N
> O
```
</div></details>


# Python3 の基礎知識に不安がある人へ

世の中には Python に関するすばらしい記事、書籍がたくさんあります。それらの参考にしながら **Python3** 基礎知識を再確認しましょう。

ただし、**文法や Python ライブラリ (numpy など) の使い方を暗記する必要はありません**。Python ではどんなことができるのか、それはどんな固有名詞で呼ばれているのかを確認してください。使い方を忘れてしまっても固有名詞で**ググればOKです**。

以下、おすすめの参考文献を紹介します。

- Python-izm, https://www.python-izm.com/
    - 入門編、基礎編あたりがおすすめ。
- 【初心者向け】無料でPythonの基本文法を5時間で学ぼう！, https://qiita.com/AI_Academy/items/b97b2178b4d10abe0adb
    - かなりボリュームがありますが具体例が豊富でわかりやすいと思います。
- プログラミング演習 Python 2021, https://repository.kulib.kyoto-u.ac.jp/dspace/bitstream/2433/265459/1/Version2021_10_08_01.pdf
    - 京都大学の講義資料。書籍化しても良いレベル。
    - コラム：https://repository.kulib.kyoto-u.ac.jp/dspace/bitstream/2433/265459/2/Version2021_10_08_02.pdf
- Python プログラミング入門, https://utokyo-ipp.github.io/IPP_textbook.pdf
    - 東京大学 数理・情報教育センターの資料。


# リンク

[Anaconda で Python 環境をインストールする](https://qiita.com/t2y/items/2a3eb58103e85d8064b6)
[朝飯前に学べる！便利なPythonのヒント100選【前編】](https://qiita.com/baby-degu/items/05cf809d4d992923020d)
[きれいなPythonプログラミング（パイソニックなコードを書こう）を読んでみた](https://qiita.com/inetcpl/items/af42b8221d9447637449)