2018年7月3日火曜日

【edX】「Pythonを使った計算機科学とプログラミングの入門」受け終わりました ぼちぼち良い成績

Introduction to Computer Science and Programming Using Python" (Pythonを使った計算機科学とプログラミングの入門) の授業を受け終わりました。 成績は A (97%)だったので、ぼちぼち良いです。

これは edX というサイトで行われている授業です。 マサチューセッツ工科大学 や ハーバード大学などの先生がedXで授業を行ってくれます。

時間に縛られる事なく、自分のペースでいろいろな授業を受けることができます。 もちろん、無料です。 このような形式の授業は MOOC(Massive Open Online Courses) と呼ばれています。

どんな形式の授業なのか

合計7週、講義12回、簡単な演習問題たくさん、難しい問題集6個

私が受けたMITの授業は合計7週分あります。 講義(lecture)は12回分あります。

1週あたり2回弱の講義がある感じです。 週の終わりに問題集(problem Set)を解きます。 これが1週間分の内容です。

もちろん、自分のペースで受けて構いません。 一週間分の内容を一日で終わらせていいし、一週間以上かけてもいいです。

どんな講義?

講義の内容を簡単に説明します。 10分程度の講義動画を見た後、いくつか簡単な演習問題(Exercise) を解きます。 1講義あたり、動画の数は5本くらい、演習問題の回数は5回くらいです。

例えば、1回目の講義は「Python入門」 です。 変数や四則演算についての内容です。 Python Shell を使います。

2回目の講義は「プログラムのコア要素」。 forループやwhileループが出てきます。

講義動画:英語の学習にも使える

講義動画には英語字幕が付いています。 必要ならば、英語字幕をつけてください。 講義資料(handouts)をダウンロードしましょう。 講義で使われてるPDFファイルやPythonプログラムが圧縮されれています。 非常に便利です。

動画には英語字幕が付いているので、リスニングに自信がない人も安心して見ることができます。

100%の内容を即座に理解できなくても、なんとか講義についていけます。 重要そうだけどよく分からなかった所を読み直してみてください。

私はたまに英語の辞書を引きました。

演習問題:プログラムのわずかな違いを理解できる

演習問題(Exercise)の役割は何を分からないか浮き彫りにする事だと思います。 その観点でいうと、演習問題が優秀でした。

例えば、sに文字列"Test"が代入されているとして、 s.lower とPython shellに入力したらどうなると思いますか? 下のようになります。

>>> s = 'Test'
>>> s.lower
<built-in method lower of str object at 0x03269120>
>>> s.lower()
'test'
>>> s
'Test'

※一つ一つの行をPython shellにコピー&ペーストするのが面倒な人は、 mutable_and_immutable_datas_20180703.py のテキストを一気に Python shell にコピー&ペーストしてください。

s.lower は 文字列ではなくて、lower というメソッドそのものです。 つまり、文字列ではなくて、メソッドをprintしていたわけです。

ちなみに、lower は 「小文字に変換した文字列」 を返すメソッドです。 「sを小文字に変換した文字列」を出力したいなら、s.lower() と入力します。

しかし、ここでも注意が必要です。 s.lower() は 文字列 s を変更しません。 ゆえに s は 一番最初'Test'のままです。

Python の 文字列型のデータは後から変更不可(immutable) です。 一番最後に文字列を追加することはできますが、 1番最初の文字を他の文字に差し替えるようなことはできません。

文字列sに新しい文字列を再代入して上書きする事はできます。

>>> s = 'immutable'
>>> s[0]
'i'
>>> s[0] = 'I'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> s = 'not'
>>> s
'not'
>>> s += ' mutable'
>>> s
'not mutable'

ゆえに、文字列は、 文字列メソッド を用いて、文字列自身を操作せず、 「変換された文字列のコピー」を返すのでしょう。

リスト(list)は文字列とは対照的です。 リストのメソッド はリストそのものを変更します。 リストは変更可能(mutable)だからです。

>>> animals = ['cat', 'dog', 'bird', 'fish']
>>> animals[0] = 'kitty'
>>> animals
['kitty', 'dog', 'bird', 'fish']
>>> animals.remove('bird')
>>> animals
['kitty', 'dog', 'fish']
>>> animals.insert(2, 'hawk')
>>> animals
['kitty', 'dog', 'hawk', 'fish']
>>> animals.sort()
>>> animals
['dog', 'fish', 'hawk', 'kitty']

データ型の特徴を具体的なコードで示してくれれば、 言葉でわざわざ説明をしてもらわなくても、なんとなく分かります。

上の例は私が適当に考えた物ですが、 確か似たような演習問題がありました。

演習問題は適当に作られているわけではないんですね。 「何かを理解して欲しい」という出題者の意図が組み込まれていた気がします。 微妙なニュアンスを理解させる問題が多かったかも。

そういった意味においても、MITの授業は優れていたと思います。 少し難しい物もありましたが。

問題集:解けたら楽しい

週の最後に問題集(problem set)を解きます。合計6個です(最後の週は無い)。 少し難しい問題もありますが、問題が解けると楽しいです。

やっぱり、実際にコードを書いているときが一番楽しいです。 解答欄にコードを貼ったら正解かどうか判定してくれます。 向こうのシステムを察する能力も重要です。

例えば、これは「与えられたアルファベットを組み合わせて単語を作るゲーム」です。 問題集にある問題なのでソースコードを貼ることはできません。

他にも、単語あてゲーム(hangman)、 メッセージクラスを定義してシーザー暗号(Caesar cipher)を作るプログラムなどを作りました。

自分が実際に書いたプログラムが動いてるのを見るのは楽しいです。

中間テスト、最終テスト

3週目の授業が終わったら、中間テスト(Midterm Exam) があります。 成績の4分の1を決めるテストです。

正直言って、中間テストは意外と難しいです。 テスト問題の詳細を話したらいけない決まりになっているので、細かい話はできません。

7週目の授業が終わったら、最終テスト(Final Exam)があります。 成績の4分の1を決めるテストです。

最終テストはそんなに難しくないです。 演習問題や問題集をしっかり解いて理解していれば、高得点をとれるでしょう。

授業の難易度

プログラミング初学者にとって少し難しめ

プログラミングの初学者とってやや難しいコースかもしれません。 最初は簡単ですが、真ん中あたりから難しくなります。 すでにプログラム言語を1つ以上習得してる人にとって、ちょうどいい難易度です。

それぞれのコースには、discussion というページがあって、そこで質問や話し合いが可能です。 英語が得意な人は質問を投稿すればよいと思います。 誰かが教えてくれるでしょう。 だから、言うほど難しいコースではない気がします。

python introduction でedxの授業を検索すれば、もう少し簡単そうなコースもあるので、 そのコースを受けてもいいかもしれません。

数学の知識が少し必要

数学の知識が少し必要でした。 例えば、プログラムの計算量を表すのに、O-記法 (Big O notation)が使われています。

例えば、

  • O(log x) は log x の定数倍(2*log x, 100*log x)みたいな物
  • O(x) は x の定数倍(2*x, 10*x など)みたいな物
  • O(x^2)は x^2 の定数倍(0.5*x^2, 10*x^2 など)みたいな物

数学的に正確に定義するならば、下のようになります。

「O(g(x))の計算量である」とは、 「xが十分大きい時、関数g(x)で割ると定数以下になる関数f(x)くらいの計算量である」 という意味です。

O-記法を使えば、xが十分に大きい時、計算量がどのようなスピードで増えるかを考える事ができます。

例えば、O(log x) は 対数的、O(x) は 線形的、O(x^c) は 多項式的、O(2^x)は指数関数的です。

下のグラフを見ても明らかなように、xが大きくなると、 指数関数の増加スピードは著しく速くなります。

高校を卒業するまでにPythonの基礎を学んだらいい

「工学部の学生だけがPythonを勉強すればいいだろ」と思う人もいるかもしれませんが、 これからの時代、Pythonはいろんな学問を学ぶのに必要になっていきます。 ゆえに、ほとんどの人がPythonを学習したら得します。

できることなら、高校生は高校卒業するまでにPythonの基礎を習得しておきたいです。 そうすれば、プログラミングを利用した大学の授業に抵抗を感じなくなります。

プログラミング学習において、基礎を習得するのが一番ハードルが高いです。 一つのプログラミング言語を習得したら、 他の言語を一人で習得する事が簡単になります。 だから、高校までに何か1つプログラミング言語を習得する事はとても重要なのです。

この授業はプログラミングの入り口だから、 英語と数学が得意な高校生が受けたら良い勉強になります。

数学が苦手な人は python introduction と検索して、数学があまり必要なさそうなコースを受ければよいかと思います。

世界中の人がedXなどで授業を受けている

オーストラリア、インド、イラン、ウクライナ、メキシコなど世界中の人がedXで学習しています。 「大学レベルの学習がしたいのにできない」という人が減っています。 教育格差が世界的に縮小している事が分かります。

こういう時、来るものを拒まず、世界中の人に学習機会を提供している所が 英語圏の国というかアメリカの良い点ですね。

英語が実質的に世界標準の言語ですから、アメリカを羨ましく思う人がいるでしょう。 でも、英語が世界に貢献している事は少なくないです。 そのことも知っておく必要がある気がします。

0 件のコメント:

コメントを投稿

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