Pythonの初歩

簡単な計算

Pythonに慣れるため,当分の間は電卓がわりにPythonを使ってみましょう。実行を見て,お好きな方法でPythonを起動してください。

まず足し算です。生のPython(python または python3 コマンド)ならプロンプト >>> の右側に,IPython(ipython または ipython3 コマンド)ならプロンプト In [1]: の右側に,Jupyter Notebookなら最初の枠内に,123+456 と打ち込んでEnterキーを打ちます(Jupyter Notebookなら Shift + Enter です)。次の行に答えが出ます。以下ではIPythonの表示を示します。

In [1]: 123+456
Out[1]: 579

掛け算は *,割り算は /,累乗は ** です(^ は累乗ではなくビットごとの排他的論理和です)。計算の順序は,通常の数式と同様,累乗が一番先で,その次が掛け算・割り算,最後が足し算・引き算です。

In [2]: 23-4*5
Out[2]: 3

In [3]: (23-4)*5
Out[3]: 95

In [4]: 1/3
Out[4]: 0.3333333333333333

In [5]: 6.02*10**23
Out[5]: 6.019999999999999e+23

最後の e+23 は「×1023」の意味です。実数(浮動小数点数)の表示は上に示すように微妙に誤差が出ますが,これはコンピュータが内部で10進法ではなく2進法を使っているためです。

Python 2では,C言語などと同様に,整数の割り算は整数に切り捨てましたが,Python 3では / は実数(浮動小数点数)の範囲で計算します。整数の除算には // を使います。除算の余りは % です。例えば 7 // 3 は 2 になり,7 % 3 は 1 になります。

おもしろいことに,文字列を足し算,掛け算することもできます(以下では入力の行番号は省略します):

In [ ]: "ほげ" + "げほ"
Out[ ]: 'ほげげほ'

In [ ]: "ほげ" * 3
Out[ ]: 'ほげほげほげ'

値は変数に代入することができます。

In [ ]: x = 1/3

In [ ]: x*3
Out[ ]: 1.0

x = 1/3 のようにスペースを空けなくても x=1/3 のように詰めて書いてもまったく同じですが,多くのプログラマは,見やすいように,x = 1/3 または x = 1 / 3 のようにスペースを入れて,ゆったりと書きます。

この x のようなものを「変数」と呼びます。変数名は,大文字と小文字を区別します。

In [ ]: x
Out[ ]: 0.3333333333333333

In [ ]: X
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-45-b5fec669aca1> in <module>
----> 1 X

NameError: name 'X' is not defined

この NameError は変数名などを間違えたときに出ます。

対話型の環境では,一つ前の出力結果が,特別な変数 _ に入ります:

In [ ]: 2 ** 16
Out[ ]: 65536

In [ ]: _ ** 2      # この場合 65536 ** 2 と同じ
Out[ ]: 4294967296

上の例では _ ** 265536 ** 2 と同じです。IPython では __ が二つ前,___ が三つ前です(四つ前はありません)。

いげた印 # より右側はコメント(説明のための注釈)です。実際に打ち込むときはコメントは必要ありません。

対話型の環境なら,これまでの例で示したように,式を打ち込めばそのまま答えが表示されますが,対話型でないプログラム中では print() 関数を使わないと出力されません:

In [ ]: print("Hello")
Hello

print のような関数と同じ名前の変数を作ることもできます(お勧めしません):

In [ ]: print = 3

In [ ]: print
Out[ ]: 3

In [ ]: print("Hello")
...
TypeError: 'int' object is not callable

あらら! 元に戻すには,自分の作った print を削除します:

In [ ]: del print

In [ ]: print("Hello")
Hello

ほかにどういう関数があるのでしょうか。三角関数は?

In [ ]: sin(pi/2)
...
NameError: name 'sin' is not defined

駄目ですね。数学関数はいくつかのライブラリで定義されています(標準数学ライブラリ mathNumPySciPy)。ここでは後で必要になる NumPy のものを使います(pip などでインストールが必要です)。次のようにインポートします:

In [ ]: import numpy as np

これは numpy というライブラリを np という省略名で読み込む(インポートする)ことを意味します。よく使うライブラリには伝統的な省略名があるので,それに従いましょう。

これで np. で始まる数学用のあれこれが使えるようになります:

In [ ]: np.pi   # 円周率
Out[ ]: 3.141592653589793

In [ ]: np.e    # 自然対数の底
Out[ ]: 2.718281828459045

丸めて文字列にするには format() を使います:

In [ ]: format(np.pi, ".4f")
Out[ ]: '3.1416'
In [ ]: np.sin(np.pi / 2)
Out[ ]: 1.0

In [ ]: np.sin(np.pi)
Out[ ]: 1.2246467991473532e-16

数値計算の誤差のため sin(π) は 0 にならず,1.22 × 10-16 という小さな値になりました。

関数の括弧を閉じないとどうなるでしょうか。

In [ ]: np.sin(np.pi/2
   ...: )
Out[ ]: 1.0

このように,続きの入力を促すプロンプト ... が出ますので,入れ忘れた ) を入力してEnterを押します。あるいは,わけがわからなくなったなら Control+C で止まります(Emacs中では Control-C を2回)。

ヘルプを読む

例えば print() という関数のヘルプを読むには,生の Python では help(print) としますが,IPython や Jupyter Notebook では ?print または print? と打ち込みます(うまくいかない場合は help(print) も試してください):

In [ ]: ?print
Docstring:
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file:  a file-like object (stream); defaults to the current sys.stdout.
sep:   string inserted between values, default a space.
end:   string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
Type:      builtin_function_or_method

これで改行をなくすには end='' または end="" とすればよいことが推測できます(Python ではシングルクォート ' とダブルクォート " はまったく同じ意味です):

In [ ]: print("Hello", end=""); print(" World")
Hello World

? または ?? を前置または後置することでヘルプが表示される IPython の機能は,自分の作ったオブジェクト等にも適用されます:

In [ ]: x = [2, 3, 4, 5]

In [ ]: ?x
Type:        list
String form: [2, 3, 4, 5]
Length:      4
Docstring:  
Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list.
The argument must be an iterable if specified.

浮動小数点表示の精度は,例えば %precision 3 で小数第3位まで,%precision %.7g で7桁精度になります。 %precision だけ打てばデフォルトに戻ります。

このほか,Tab キーによる補完,%pwd%cd 何々 によるディレクトリ表示や移動,環境変数を表示する %env,実行時間を計測する %timeit 何々,シェルでコマンドを実行する !command など,豊富な命令が使えます。詳しくは,? だけ打ち込むと出てくる IPython のヘルプ,%magic と打ち込むと出てくるマジックコマンドのヘルプをご覧ください。なお,デフォルトでは % を省略できていしまうので要注意です。省略できないようにするには %automagic off と打ち込みます。

終了のしかた

Pythonは quit() または exit() で終了します。IPythonは quit または exit でも終了します。

ひつじがnひき

眠れない夜は,ひつじを数えてみましょう🐑🐑🐑🐑🐑🐑🐑🐑🐑🐑。

for i in range(1, 11):
    print("ひつじが", i, "ひき")

range(1, 11) は 1 以上 11 未満の整数を表します。Pythonはインデント(字下げ)でブロック構造を表しますので,必ず上の2行目は(半角の)スペースかタブでインデントします。多くの Python プログラマは(半角の)スペース4個でインデントする(そうなるようにテキストエディタを設定している)と思います。

ひつじが 1 ひき
ひつじが 2 ひき
ひつじが 3 ひき
ひつじが 4 ひき
ひつじが 5 ひき
ひつじが 6 ひき
ひつじが 7 ひき
ひつじが 8 ひき
ひつじが 9 ひき
ひつじが 10 ひき

もしもプログラムを間違えて止まらなくなったら,Ctrl + C を入力します(Emacs 環境なら Ctrl + C を2回入力します)。

眠れない夜がまだまだ続くときは,ひつじを数える関数を作りましょう。

def hitsuji(n):
    for i in range(1, n+1):
        print("ひつじが", i, "ひき")

これで hitsuji(100) と打てば,ひつじが100ひき数えられます。

文字列に値を割り込ませる方法として "ひつじが {} ひき".format(i) あるいは f"ひつじが {i} ひき" という書き方もできます。中括弧の中に例えば :2d のような書式指定をすれば2桁右詰めになります:

for i in range(1, 11):
    print("ひつじが {:2d} ひき".format(i))

for i in range(1, 11):
    print(f"ひつじが {i:2d} ひき")

"ひつじが %2d ひき" % i のような古いC言語スタイルの書式指定もできます。次の例はいずれも出力が '円周率はだいたい 3.1416 です。' になります:

In [ ]: "円周率はだいたい {:.4f} です。".format(np.pi)
In [ ]: f"円周率はだいたい {np.pi:.4f} です。"
In [ ]: "円周率はだいたい %.4f です。" % np.pi

フィボナッチ数列

Python では複数の代入を並行して行うことができます。このことを使えば,フィボナッチ数列の生成が次のように少しだけ簡単に書けます:

a, b = 1, 1
while a < 100:
    print(a)
    a, b = b, a+b

リストの形で返す関数にしてみます:

def fib(n):
    """n未満のフィボナッチ数列を返す"""
    r = []          # 空のリスト
    a, b = 1, 1
    while a < n:
        r.append(a) # リストにアペンド
        a, b = b, a+b
    return r

先頭に """...""" の形で与えたものは関数の説明(docstring)です。説明はヘルプに表示されます:

In [ ]: ?fib
Signature: fib(n)
Docstring: n未満のフィボナッチ数列を返す
File:      ...
Type:      function

"""...""" または '''...''' は途中で改行が入ることを許す文字列です。説明(docstring)は途中で改行が入ることが多いので,一般に """...""" が使われます。ただ,上の例のように1行だけの場合は,"..." でもかまいません。

実行してみます:

In [ ]: fib(100)
Out[ ]: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

フィボナッチ数列のn番目を返すには次のように再帰を使うのが簡単です:

def fibn(n):
    if n < 3:
        return 1
    else:
        return fibn(n-2) + fibn(n-1)

テストしてみます:

In [ ]: [fibn(n) for n in range(1, 11)]
Out[ ]: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

他の言語のように,最初に一定の長さの配列を宣言しておきたい場合は,次のように,あらかじめ(例えば)0 を100個並べたものを作っておくことができます:

a = [0] * 100
a[0] = a[1] = 1
for i in range(2, 100):
    a[i] = a[i-2] + a[i-1]

0 の代わりに,未定義であることを示す None を使うほうがいいかもしれません。


Last modified: