2018年6月22日金曜日

【Python】学校のカリキュラムをあてにしたら駄目 edxでプログラミングの学習をしてみよう(特に留学希望者)

大学レベルの授業をオンラインで受講できる edX というサイトがあります。 プログラミング、工学、統計などを学習することができます。 使用されてる言語は英語ですが、自分のペースで(self-paced)いろんな学習ができます。 もちろん無料です。

私は 「Pythonでプログラムの初歩を学習できるコース」 (MITの授業) を受講することを勧めます。 プログラミングの学習と並行して英語も学べるから一石二鳥です。

見方を変えると、英語でプログラミングを学ぶ事は2重にハードですが、得るものは大きいと思います。 英語とプログラミングに興味ある人におすすめします。特に留学希望者。

手っ取り早くプログラミングを学びたい人は日本語のオンライン学習サイト( Aidemy, progate など )で学習したほうがいいです。

とにかく、小学校、中学校、高校のカリキュラムをあてにしない方がいいです。 学習コンテンツがネット上にこれだけあるのですから、 自分が学ぶ事を自分自身で決めていい気がします。

追記: "Python" でedxの授業を検索 したら、Python入門のコースが他にもありました。好きなコースを受講してください。 ちなみにデータサイエンスのコースもありました。使用言語はもちろん英語ですが。

Pythonは重要なプログラミング言語

Pythonは初心者向き&強力

Pythonは重要なプログラミング言語です。 いろんな業界で活躍しているし 、今後も活躍するであろうプログラミング言語です。

Pythonはグラフを描いたり、絵を描いたり、科学計算をしたり等、比較的カンタンに何でもできます。 特に科学計算に強いと言われています。 だから、エンジニア以外の人も学習したほうがいいです。

教育用によく使われてるらしいです。 海外の高校生もPythonを学習してます。 Pythonがプログラミング初心者向きでかつ強力だからでしょう。

いろんな業界が情報技術と融合していく

未来のPythonは今で言うエクセルみたいな存在になってると思います。 いろんな人がPythonを使いこなすようになります。 たぶん、いろんな業界が情報技術と融合していきます。

例えば、医者はプログラムを使って患者を診断するようになると思います。 「癌がプログラムで検知されるようになった」みたいなニュース をたまに見ることがあります。 もしかしたら、プログラミングは医学部の必修科目になるかもしれません。 現在、 ごく少数の医学研究科の大学院生がPythonを学んでるらしいです。

現在、工学を学んでる人にとって、プログラミングは重要です。 でも、今後、工学だけでなく、医学、生物学、化学、薬学を学んだり研究したりするのにも、 プログラミングが重要になるかもしれません。

だから、世界中の国がプログラミング教育に力をいれているのでしょう。

プログラミング=文明の利器

ふつうの人間がコンピュータの知能を借りることで、高度なパフォーマンスを発揮できます。 だから、プログラミングを学ばない事は損です。 文明の利器(プログラミング)を使いこなして、競争力を高めましょう。

ほとんどの人は電卓があったら、電卓で計算すると思います。 私はPythonという文明の利器があるから、Pythonを使います。 Pythonは電卓ほどカンタンではありませんが、比較的使いやすいプログラミング言語です。

私はなんとなくタートルグラフィックスで図を描いてみたら、 たまに面白い事をひらめきます。 コンピュータの計算力を借りたら、何かいい事があります。

私は昨日やっと中間試験を解き終わったところ

私もedxでPythonの学習をしています。 昨日、やっと中間試験(midterm exam)を解き終えました。

プログラムのコードを書く問題は全問正解でした。 ○×クイズはかなり不正解でしたが。 少し難しい問題もあったかもしれないです。

私がPythonの学習を始めたのは3月末くらいです。 まず、1~2週間かけて、 CodingBat の問題(英語)をぜんぶ解きました。 この時点で、Pythonの基本的な計算ができるようになっていました。

edxで学習し始めたのは4月末からです。 5月頃、タートルグラフィックスにハマりました。 結構だらだらと学習しています。 そのせいで学習進度が遅れています。 2018年6月22日時点で、まだ4週目です(ぜんぶで7週)

最近、タートルグラフィックスの本を買ったので、edXと同時並行で学習しています。

edxの授業を少し紹介

私がedxの授業を受けてるとき、面白いと思ったプログラムがあったので紹介します。

それはフィボナッチ数列の値を求める再帰的プログラムの改良版です。 シンプルですが、私はそれを見た事も作った事もなかったので驚きました。

フィボナッチ数列とは

フィボナッチ数列Fn (n=1,2,3,...) とは、1,1,2,3,5,8,13,21,34,55,89,144,233, ... のように、「一つ前の項と二つ前の項の和」で構成されている数列です。

再帰的なフィボナッチ数列のプログラム(非効率)

フィボナッチ数列(Fibonacci numbers) を求める再帰的な(recursive) プログラムを下に書きました。 ふつうに書いたので、ものすごく非効率なプログラムになっています。

32番目(F32=2178309) 以降になると、計算の遅さが目立ち始めます。 計算時間が0.5秒くらいかかるかもしれません。

ソースコードはこちら。 pythonファイルをダウンロードしてダブルクリックするとプログラムが起動します。

import timeit

# 再帰的にフィボナッチ数列を求めるプログラム(効率は悪い)
def fib(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fib(n-1) + fib(n-2)

i = 32
tic = timeit.default_timer() # 処理を開始する直前の時間
print ("f{0}={1}".format(i, fib(i)))
toc = timeit.default_timer() # 処理を完了した直後の時間
print("processing time: "+ str(toc-tic) + " [s]\n") # 処理にかかった時間

input("press any key to exit")

再帰的なフィボナッチ数列のプログラム(改良版)

でも、少し工夫して、重複した計算を減らせば、驚くほど計算速度が速くなりました。 処理時間は 0.00014秒 くらいでした。 再帰的なフィボナッチ数列のプログラム(改良版)の ソースコードはこちら

import timeit # 小さなコード断片の実行時間計測するモジュール

# 再帰的なフィボナッチ数列の関数を効率的にする
def fib_efficient(n, d):
    if n in d:
        return d[n]
    else:
        d[n] = fib_efficient(n-1, d) + fib_efficient(n-2, d)
        return d[n]

d = {0:0, 1:1, 2:1}
i = 32
tic = timeit.default_timer() # 処理を開始する直前の時間
print ("f{0}={1}".format(i, fib_efficient(i, d)))
toc = timeit.default_timer() # 処理を完了した直後の時間
print("processing time: "+ str(toc-tic) + " [s]\n") # 処理にかかった時間

input("press any key to exit")

フィボナッチ数列の値を一度計算したら、辞書d に記録しています。 すると、何回も同じ値を計算する手間を省くことができます。

forループを使ったフィボナッチ数列のプログラム

通常、forループやwhileループを使用した繰り返し的(iterative) な手法で フィボナッチ数列の値を求めます。

これが一番速いと思います。 処理時間は 0.00013秒くらいでした。 ソースコードはこちら です。

import timeit

# 繰り返し的にフィボナッチ数列の値を求める
def fib_iter(n):
    if n == 1 or n == 2:
        return 1
    after = 1 # f_n = f_2
    before = 1 # f_{n-1} = f_1
    # f3,f4,f5,....
    for i in range(n-2):
        tmp = after
        after = after + before
        before = tmp
    return after

i = 32
tic = timeit.default_timer() # 処理を開始する直前の時間
print ("f{0}={1}".format(i, fib_iter(i)))
toc = timeit.default_timer() # 処理を完了した直後の時間
print("processing time: "+ str(toc-tic) + " [s]\n") # 処理にかかった時間

input("press any key to exit")

結論

たぶん「繰り返し的なプログラム」が一番速いです。 しかし、工夫して再帰的なプログラムを書けば、処理速度があまり落ちないことに感心しました。 MITの先生すごいです。

異文化という感じがしました。 日本語で検索しても、「再帰的に書かれたフィボナッチ数列のプログラムは効率が悪い」というものばかりでしたから。

ハノイの塔のプログラムはもう少し速くなるのかなと思いました。

0 件のコメント:

コメントを投稿

投稿されたコメントは承認後に公開されます。