応用プログラミング及び実習 2019年度 第1回 Notebook

Python プログラミングの初歩 (1)

この資料中に説明なくページ番号が出てくる場合,教科書のページ番号を表しています.

数値を使う (pp.48-50)

pp.48,49を読んで理解したら,以下のセルを実行しなさい.このセルを選択した状態(左側に縦棒がついた状態)で,次のいずれか

  • ↑の三角形のボタンを押す
  • メニューから Run > Run Selected Cell
  • Shift + Enter
In [ ]:
5-5+1+9

以下のセルに,教科書で↑に続いて載っている式を一つずつ書いて実行しなさい.

In [ ]:
 
In [ ]:
 

↑にもうひとつセルを追加(「+」ボタン)して,p.49の累乗(べき乗)を使った式の例を書いて実行しなさい.

p.50を表も含めて読んで理解したら,以下にp.50下部の2つの式を計算するセル2つを挿入して実行しなさい.

以下にセルを作り,4649 を 18 で割った余りを求めなさい.

以下にセルを作り,2の64乗を求めなさい.

教科書ではここでは説明されていないが,除算演算子 / は,C言語などと異なるふるまいをするので要注意.以下を実行して確認しよう.

In [ ]:
# 例1    Python では # 以降の部分はコメントになる
5 / 3
In [ ]:
3 / 5     # 例2

C言語の場合,演算対象の数がいずれも整数型(例えばint型)だった場合,その範囲で除算を行う = 小数点以下を切り捨てた整数値が得られた.したがって,上記の例1の結果は 1 に,例2の結果は 0 になった.

しかし Python の場合は上記のような結果が得られる.整数の範囲で除算をさせたい場合は // という演算子を用いる

In [ ]:
5 // 3
In [ ]:
3 // 5

Python がこのようなふるまいをするようになったのは実はバージョンが 3 になって以降である.Python3 が登場したのは比較的最近のことであり,以前のバージョンである Python2 もまだまだ現役で使われているので注意が必要である.

実は Python2 と 3 で互換性のないところは他にもある.興味のあるひとは教科書13章を読みましょう.

変数を使う (pp.51-54)

pp.51,52を読んで理解したら,以下のセルを実行しなさい.実行しても何も出力されない.

In [ ]:
champernowne = 0.12345678910
In [ ]:
champernowne_19 = 0.1234567891011121314

教科書では説明されていないが,次のようにprint関数を用いることで,変数の値を出力させることができる.

In [ ]:
print(champernowne)

上記のセルを修正して,もう一つの変数の方の値を出力させてみよう.

「champernowne って何やねん」ってひとは,Wikipediaの「チャンパーノウン定数」へ.

p.53を読んで理解したら,以下のセルを順次実行しなさい(importなんたら,NumPyがどうたら,という話は今はわからなくて構わない).

In [ ]:
import numpy as np   #  教科書と違い, NumPy という科学技術計算モジュールから π の値を得ている
pi = np.pi                     #  np.pi が円周率 π を表す定数
print(pi)
In [ ]:
diameter = 12756.274
pi*diameter
In [ ]:
cal_per_1kg = 7200
cal_per_1minjog = 7.76

min_to_lose1kg = cal_per_1kg/cal_per_1minjog
hours_to_lose1kg = min_to_lose1kg/60
print(hours_to_lose1kg)

以下は,上記を応用して,脂肪を1グラム燃やすのに何分/何秒ジョギングすればよいか計算しようとしたものである. 要修正箇所を修正して,正しい結果を求めなさい.

In [ ]:
cal_per_1g = cal_per_1kg            # この行だけ修正が必要
min_to_lose1g = cal_per_1g/cal_per_1minjog
print(min_to_lose1g)        # 分単位
print(min_to_lose1g*60)  # 秒単位

Python の変数名のつけ方について,p.53-54 に説明がある.時間に余裕のあるひとはそこを読もう.

その最後に説明されている Python の予約語(特別な意味を持つものとして「予約」されてるので変数名に使えないもの)は,以下のセルを実行すれば確認できる.

In [ ]:
import keyword
#keyword.kwlist  # 行頭の#を削除して実行すれば,予約語を一覧できる

文字列を使う (pp.55-58)

pp.55,56を読んで理解したら,次の2つのセルを実行しなさい.

In [ ]:
spam = "spam"
spam
In [ ]:
a_lylic = "でもね私のエネルギーは"
a_lylic

上記の文字列はダブルクォーテーション"で囲んで定義されているが,教科書に説明されているように,Pythonの文字列はシングルクォーテーション'で囲んで定義してもよい.ただし,ペアは両方同じ種類でないといけない.上記の文字列定義のどちらか一方をシングルクォーテーションを使うように書き直して実行してみなさい.

ちなみに,C言語では文字列を char の配列として扱っていた.CとPythonでは文字列の扱い方が全く異なる.それに,C の場合,シングルクォーテーションは1文字だけ,ダブルクォーテーションは文字列,と使い分けていた.

p.57を読んで理解したら,次のセルを実行しなさい.

In [ ]:
a_lylic = a_lylic + "すでにインフィニティだよ。"
a_lylic

教科書ではこの部分には書かれていないが,文字列に対して* 演算子を使って自然数を掛けると,その数ぶん元の文字列を繰り返した文字列が得られる.

In [ ]:
spam*3
In [ ]:
100*a_lylic

複合演算子,型について (pp.58-63)

この部分は教科書では「文字列を使う」の一部となっていますが,内容的には文字列以外の話を含んでいるので,この資料ではセクションを独立させて説明することにしました.

pp.58,59を読んで理解したら,次のセルを実行しなさい.

In [ ]:
lylic2 = "ずっと笑顔ばかりを選んで"
lylic2 += "泣き顔見せるのを迷ってた"
lylic2
In [ ]:
x = 60
x -= 1
x *= 100
x += 63
x

C言語等と違い,Python にはインクリメント演算子 ++ やデクリメント演算子 -- は存在しない.以下はエラーになる.

In [ ]:
x++

値を1つ増やしたければ,+= 1とする

In [ ]:
x += 1
x

pp.60,61を読んで理解したら,次のセルを実行しなさい.

In [ ]:
day = 25
date = day + "日"

上記がエラーになる理由は,「変数dayが表す整数型の値」と「文字列"日"」という,データ型が異なるもの同士を+演算子によって加算しようとしたからである.この例の場合,変数dayが文字列を表すならばエラーにはならない.以下を実行してみよう.

In [ ]:
day = "25"
date = day + "日"
date

C言語で変数を使う場合,int, float, double, char等の型をあらかじめ指定して宣言する必要があった. int x と宣言した変数xに異なる型の値を代入しようとすると,エラーになるか,または無理やり変換される(x = 1.23とした場合など).

しかし,Pythonの場合,変数を使う際に「この変数は○○型」とあらかじめ決めておく必要はない.上記の変数dayの使用例から分かるように,25を代入することではじめは整数を表していた変数に,あとで"25"という文字列を代入しても問題ない.変数dayは最初は整数型だったが,後から文字列型に変化した,ということになる.

よだんだよん)プログラミング言語の世界では,C言語のように変数の型を宣言時に決めておく(後で変えられない)ものを静的型付け,Python のようにあらかじめ決めておかない(実行中に変えられる)ものを動的型付けという.詳しいことが知りたいひとはこちらへ:

上記は「Pythonにはデータ型の区別がない」ということを意味しているわけではないことに注意.Pythonにもデータ型の区別はある.これまでに,整数型浮動小数点型文字列型の3種類が登場している.

組み込み関数(Pythonに標準で用意されている関数)の int(), float(), str() を使うことで,データ型を変換できる.pp.61,62を読んで理解したら,次のセルを結果がどうなるかよく考えながら実行しなさい.

In [ ]:
int(46.49)
In [ ]:
int("18"*3)  # 文字列として *3 してから int に変換するから...
In [ ]:
int("hoge")
In [ ]:
float(1)
In [ ]:
float("1.23e+1")
In [ ]:
str(5959)
In [ ]:
str(123/10)

次のようにすれば,dayは整数型のままで望みの結果が得られる.

In [ ]:
day = 25
date = str(day) + "日"
date

リストを使う(前半, pp.63-68)

ついでに簡単なグラフの描画も

pp.63-65を読んで理解したら,次のセルを実行しなさい.

In [ ]:
tokyo_temps = [15.1, 15.4, 15.2, 15.4, 17.0, 16.9]  # 1950, 1960, 1970, 1980, 1990, 2000年の東京都の平均気温
In [ ]:
# 以下は,Notebook上でグラフを描くための準備.今は何やってるかわからなくてもよい
%matplotlib inline
import matplotlib.pyplot as plt
In [ ]:
# リスト tokyo_temps の要素番号(0, 1, ...)を横軸に,要素の値を縦軸にグラフを描く.デフォルトは折れ線グラフ.
plt.plot(tokyo_temps)

pp.65-67を読んで理解したら,次のセルを実行しなさい.

In [ ]:
tokyo_temps[0]
In [ ]:
tokyo_temps[1]
In [ ]:
tokyo_temps[5]
In [ ]:
tokyo_temps[5] - tokyo_temps[0]

ここまでの話から,PythonのリストはC言語の配列に似てるように思えるかもしれません.しかし,実際には結構違うところがあります.どこが違うか考えながらこの先の学習を勧めてみましょう.

In [ ]:
tokyo_temps[6]  # このリストは要素数が 6 個だから,要素番号(インデックス)は 0 から 5 まで.だからこれは...
In [ ]:
tokyo_temps[-1]  # これはどうなる? C言語の配列だったらまともな動作はしないが...
In [ ]:
tokyo_temps[-2]
In [ ]:
tokyo_temps[-6]
In [ ]:
tokyo_temps[-7]

pp.67-68を読んで理解したら,次のセルを実行しなさい.

In [ ]:
e_tokyo_temps = [13.6, 13.5, 14.2, 14.8, 14.8]   # 1900, 1910, 1920, 1930, 1940年の東京都の平均気温
tokyo_temps2 = e_tokyo_temps+tokyo_temps
tokyo_temps2
In [ ]:
plt.plot(tokyo_temps2)

(よだんだよん) リストの話からはずれた余談.plt.plot() に2つのリストを指定すると,1つ目を横軸,2つ目を縦軸の値として使ってグラフを描いてくれる.2つのリストは要素数が一致してないといけない.

In [ ]:
y = [1900, 1910, 1920, 1930, 1940, 1950, 1960, 1970, 1980, 1990, 2000]
plt.plot(y, tokyo_temps2)

チェック

TAさんに課題ex01Aのチェックを受ける際は,以下のセルを実行して「OK!」が出ているようにしてください.

In [ ]:
# 以下のコードは,この notebook を(それなりに)ちゃんと実行したかどうか確認するためのものです.
# 中身の理解は不要です.

def check(key, n):
    import os
    import pickle
    fn = '/roes/sample/takataka/aprog/cellnumbers.pickle'
    if os.path.isfile(fn):
        with open(fn, 'rb') as f:
            data = pickle.load(f)
        if key in data:
            if n >= data[key]:
                print('{0} n = {1} ... OK!'.format(key, n))
            else:
                print('どこかちゃんと実行できてない所があるようです')
        else:
            print('ごめんなさい,うまく確認できませんでした')
    else:
        print('この環境では確認できないようです')

check('01note', len(In))
In [ ]: