はじめに
このシリーズは計算化学を題材にした Python プログラミングを紹介した「計算化学者のためのPython入門」の1つです。
特に「計算化学関連の Python プログラム開発に携わる予定」の読者を想定してます。
Python3 は Google Colab を使えばブラウザだけで実行 できます。
本記事の要点
- 「計算化学者のためのPython入門」シリーズを最大限楽しむために必要な Python 知識を Quiz 形式で紹介します。
- Python Quizの答えにピンとこない方は「計算化学者のためのPython入門」シリーズを読む前に、Python3 の基礎知識に不安がある人へで紹介したサイトなどで Python3 の基礎知識を再確認することをおすすめします。
Python Quiz
以下の Quiz の質問にピンとこない、答えを見てもよくわからない、調べようにも何をググればいいかわからない人は本シリーズを読み進める前に Python3 の基礎知識をおさらいするのがいいかもしれません。
Q1. 条件式 type("0") == type(0) は何を返す?
A1.
False
Q2. import numpy as np や from math import pi は何をしている?
A2.
- numpyをインポートしてnpと定義
- mathからpi(円周率π)をインポート
Q3. 同じ階層にある test1.py で定義された hoge 関数を test.py で使いたい。どうすればいい?
now_dir
|___ test1.py (hoge 関数実装済み)
|___ test.py
A3.
from test1 import hoge
Q4. list 型ではなく numpy.ndarray 型 (np.array) を使う利点は?np.array は何が便利?
A4.
- 配列同士の演算ができる
- 処理が速い 等
Q5. l_a = ["I", "have", "an", "apple"] の "apple" が "pineapple" に置換されたリスト l_b をつくるにはどうする?任意の l_a の "apple" を "pineapple" に置換したい場合はどうする?
A5.
loop と if 文を使うと以下のように書ける。
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 を使うと以下のように書ける。
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()
Q6. 以下の test1.py を実行すると、どのように出力される?
print(1)
def test1(a, b):
print(b)
c = a * 2
return c
print(3)
d = test1(4, 5)
print(d)
A6.
1
3
5
8
Q7. 上で定義された test1 関数(メソッドとも言う)の引数、返り値はどれ?
A7.
- 引数:a, b
- 返り値:c
Q8. 以下の 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")
A8.
I
have
a
No PPAP
Q9. 1 から 100 までループし、3 の倍数のときは "I have a pen"、4 の倍数のときは "I have an apple"、3、4 の公倍数のときは "I have a pineapple"、それ以外のときは "Pen-Pineapple-Apple-Pen" と出力するプログラムは書けそうですか?プログラム構造を想像できますか?
A9.
おそらくこんな感じ。プログラム構造を想像できましたか?
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")
Q10. 以下のスクリプトを実行すると何が出力される?
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)
A10.
enumerate() と zip() は便利なので覚えましょう。
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
Q11. 以下のスクリプトを実行すると何が出力される?
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)
A11.
辞書も便利なので積極的に使いましょう。
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
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 環境をインストールする
朝飯前に学べる!便利なPythonのヒント100選【前編】
きれいなPythonプログラミング(パイソニックなコードを書こう)を読んでみた