CourseraでPython for Everybodyを受講してみた(実践編)

前回の準備編に引き続き、ミシガン大学がCoursera上で開講しているオンライン講座"Python for Everybody"を受講した記録です。準備編はこちらからどうぞ↓

1.Week 1

<テキストの範囲>
Chapter 1: Why should you learn to write programs?

私たちはユーザーとしてさまざまなテクノロジーに接している、という話からコンピュータの有用性、そしてプログラムを書くモチベーションについて説明されます。講義の名のとおり、プログラミングをやってみたいすべての人を対象としていますので、最初の掴みの部分は丁寧すぎるくらいの解説です。

ハードウェアについては、入力装置や記憶装置の機能などを、実際にマザーボードやハードディスクなどを見せてもらいながら行われます。自作PCを構築したことがある人であれば馴染みの深いものかもしれませんが、プログラミング初心者やパソコンの内部を見たことがない人は新鮮だと思います。

ハードウェアの要素として、以下の装置がそれぞれどのような機能を持つか頭に入れておきます。

- Input & Output Devices
- Central Processing Unit
- Main Memory
- Secondary Memory

Week 1はプログラムの課題はなかったのでサクサク進みました。


2.Week 2

<テキストの範囲>
Chapter 1: Why should you learn to write programs? のつづき

まずはPython Playgroundというツールについてのデモを動画で行ってくれます。使い方はシンプルで、コードを左側のボックスに書いてRun Python3というボタンを押すだけ。このツールを使って簡単なコードを書き、Pythonを走らせることができます。

Week 2で初めての課題が登場。クロスレビューは指示にしたがって課題をアップロードするとともに、他人がアップロードした課題について評価・評点をつける仕組みとなっています。世界中の人がトライしている内容ですので、指示通りにできていないものもあります。その場合は、課題の指示内容をコメントしてあげましょう。


3.Week 3

<テキストの範囲>
Chapter 1: Why should you learn to write programs? のつづき

いよいよプログラミング!さあがんばろう!!まずはPythonの起動から。プログラムのメニューからAnacondaを起動して、pythonとコマンドラインに書き、起動します。すると、画面上にそのままプログラムを書くことができます。

画像1

おお、本当に起動した!はじめましてPython!!えっと、最初だからとりあえずはお約束のHello World!!からですね。

print('Hello World!!')

おお、本当に表示された!感動!!

コマンドラインに直接プログラムを打ち込む場合、終了するにはquit()というコマンドを使います。

この講義ではプログラムの構文についても学習します。以下の4つの要素については動画の中で簡単な説明があります。
- Variable(変数)
- Operator(演算子)
- Constant(定数)
- Function(関数)

また、フローチャートについても説明があります。具体的にはsequential stepとconditional stepの違いが解説されます。フローチャートの見方を抑えておくと、以後の講義やコースで役立ちます。軽くifやfor、whileなどの構文も出てきますが、実際にコードを書く実践は後の週で触れられますので流れを把握するとよいと思います。

Pythonは他の言語よりも柔軟な操作ができるという利点があるものの、エラーメッセージはそれほど親切ではありません。何行目でエラーが発生したかは知ることができますが、その原因がどのようなものかを知るのは難しいことがあります。ある時は変数の移り変わりを逐一チェックしたり、またある時はループが正常に稼働しているかチェックしたりと、一つ一つコードを紐解いていかないとエラーの原因を特定できないことがあります。エラーの種類は以下のサイトに詳しい解説があります。


4.Week 4

<テキストの範囲>
Chapter 2: Variables, Expressions, and Statements

まずは定数(constant)の解説から。以下のプログラムを見てみましょう。

print(123) #...[1]
print(98.6) #...[2]
print('Hello World!') #...[3]

この3行のプログラムでは、それぞれ3つのデータをprintという命令で出力をしています。[1]は整数、[2]は小数、[3]は文字列ですね。それぞれのデータは変数ではありません。

変数を扱うには、次のように書きます。

x = 5
print(x)

このプログラムでは、1行目でxという変数に5を代入する命令をしています。そして、2行目で変数xを出力する命令をしています。

他の言語とは異なり、Pythonは変数の型の宣言が不要であるケースが多いです。変数の型の宣言とは、ざっくり言うと、ある変数xが整数であるとか、文字列であるとかをあらかじめ定義しておくことを言います。VBAなどでは以下のように書いて変数xが整数型であることを宣言する必要があります。

Dim x As Integer

変数に使えない語はreserved wordsといい、False, None, True, and, as, break, if, tryなどの語をいいます。これらはPythonにおいて命令であったり条件式であったり、別の意味を持っているものですので変数に使うことができません。どうしてもこのような語を用いたい場合は、アンダーバー"_"などを用いてreserved wordsとは別物であることを示してあげる必要があります。

また、数値が先にきてしまう変数は定義できません。

Pythonでは、大文字と小文字を区別します。以下の命令を実行すると、どう表示されるでしょうか・・・?

j = 3
J = 5
print(J)

画面に表示される数値は5になっていると思います。

上記のルールに従えば、変数に名前を自由につけられることになりますが、プログラムをするのは人間ですから、変数名は分かりやすいものが好まれます。他人が読んでも理解できるよう、変数名に気を付けたいものですね。

次に、演算子について触れていきます。四則演算は+, -, *, /を用いますが、Pythonではこのほかに、べき乗を**、剰余を%で表します。すなわち、

n = 23 % 5
print(n)

この結果は23÷5=4あまり3ですから、3が出力されることになります。計算の順序は、カッコで括られた中→べき乗→乗除→加減→左から右へ、の順になります。

変数の型が分からなくなったら、typeという関数で調べることができます。

n = 23 % 5
type(n)

intは整数型、floatは浮動小数点型、strは文字列型を表します。型を強制的に変換させるときは、

n = float(5 / 7)
print(n)

このように書いてあげるとよいでしょう。ちなみに、Python3は自動的に型を変換してくれる機能が備わっています。Python2では上記の表示結果は0と整数型のままになってしまいます。

文字列を入力するには、以下のようにinputを用います。

str_name = input('Who are you?')
print('Welcome', str_name)

このプログラムでは、一度Who are you?という文字が表示されてからキーボードでの入力のためプログラムが一旦停止し、ユーザー側が入力してエンターキーを押すと2行目が実行されます。


5.Week 5

<テキストの範囲>
Chapter 3: Conditional Execution

次に、if文による条件式を見ていきましょう。

x = 1
if x < 10:
    print('Small!!')
if x > 20:
    print('Big!!')
print('Finish!!')

条件を満たすとき、インデントで半角4字繰り下げされた式が実行されます。このプログラムの場合、変数xは1ですから一つ目のif条件式は満たすためSmall!!は表示されますが、二つ目のif条件式は満たさないためBig!!は実行されません。

Atomというエディタを使うと、上記のように構文が色分けされるので非常に便利です。

次に、ネスト構造を見ていきます。この構文では、一つ目の条件式を満たしたうえで二つ目の条件式を判定します。

x = 1
if x < 100: #...[1]
    print('x is smaller than 100.')
    if x < 50: #...[2]
        print('x is smaller than 50.') #...[3]
print('done!')

ここでは、[1]式によって変数xの条件が判定され、文字列が出力されます。さらに、インデントが続きますので、[1]式を満たしたうえで[2]の条件が判定され、さらに条件を満たすので[3]が実行される、という仕組みになります。

それでは、条件を満たさないときの命令はどのように書けばよいでしょうか?

x = 1
if x < 5:
    print('x is smaller than 5.')
else:
    print('x is not smaller than 5.')
print('done!')

このように、elseという構文で「もしifに書かれている条件を満たさなかったら以下を実行する」と命令することができます。

少し複雑な命令として、elifという条件式を追加することができます。これは、「ifを満たさないときに、次の条件を判定する」というものです。したがって、elifの条件を満たさなかったら、elseの命令を実行することになります。

x = 30
if x < 5: #...[1]
    print('x is smaller than 5.')
elif x < 100: #...[2]
    print('x is smaller than 100.') #...[3]
else: #...[4]
    print('The number is too big.')
print('done!')

このプログラムの場合、[1]によってxが5未満かが判定されますが、条件を満たさないためelifの[2]を判定します。この条件は満たすため、[3]が実行されます。どの条件を満たさない場合は[4]が実行されますが、この例では[4]は実行されません。

エラーを判定する時は、try, exceptという条件を付けてみます。

x = input('Please input numbers:')
try:
    x = int(x)
except:
    x = -1
print(x)

このプログラムは、tryの中でエラーが起きたらexcept文を実行するというものです。したがって、変数xにBobという文字を入力すると、-1が出力されることになります。tryの途中でエラーが発生した場合は、エラーが発生した以降の文は実行されません。


6.Week 6

<テキストの範囲>
Chapter 4: Functions

次に、関数を定義する方法を学びます。関数はdefという命令で定義することができます。条件式と同様、インデントされた部分までが関数の範囲になります。

def fff():
   print('Hello!')
   print('Here is Karaage!!') #...[1]

fff() #...[2]
print('It is nice day!!')
fff() #...[3]

このプログラムでは、[1]までが関数の範囲です。関数fffは2行を出力するような命令のセットと理解できます。つまり、[2]という命令で関数fffを呼び出し、2行を出力し、その下にあるprint文で1行を出力し、さらに[3]で関数fffを呼び出し2行を出力します。したがって、結果は・・・

Hello!
Here is Karaage!!
It is nice day!!
Hello!
Here is Karaage!!

このような形になります。くどいですね。

少し用語の解説をすると、関数はArguments, Parameters, Resultsといった要素を持ちます。

big = max('Hello world')
print(big)

このようにプログラムしたとき、maxは関数ですが、Hello worldというカッコで括られたデータはargument(引数)といい、関数に渡される文字列や変数を指します。関数内では、渡されたデータをparameter(パラメータ)として、処理を実行します。その結果をresultという形で返すことになります。関数の結果がbigという変数に代入される仕組みとなっています。引数は複数指定できますが、関数側でも同じ数のパラメータが必要となりますので注意しましょう。

def addtwo(a, b):
    added = a + b
    return added

x = addtwo(3, 5) #...[1]
print(x)

このプログラムでは、addtwoという関数に2つのパラメータを入れる形にしています。[1]で、3と5を引数としてaddtwo関数を呼び出し、return式で結果を返していますね。その結果がxに代入され、xの結果8が出力されるはずです。


7.Week 7

<テキストの範囲>
Chapter 5: Iteration

さぁ、最後のセクションです。有限ループや無限ループを駆使してより複雑なプログラムを書いていきましょう。まずはWhile文によるループです。

n = 5
while n > 0: #...[1]
    print(n)
    n = n - 1
print(done!!)
print(n)

while文は、条件が正しい間インデントされた構文を繰り返します。したがって、nの値が変わらなければ(もしくはnが増えていけば)ループは終わらないことになります。永久にwhile文が繰り返されるので、done!!という出力が実行されず、無限ループとなってしまいます。

無限ループを強制的に抜け出す方法には、breakという命令を挿入します。

while True: #...[1]
    str_name = input('Enter name? ')
    if str_name == 'END': #...[2]
        break
    print(str_name)
print(done!!)

[1]のwhile Trueというループは、条件が示されていませんが無限ループを構成しています。条件がありませんが「真(True)である間繰り返す」命令です。

入力された文字列にしたがって、[2]でENDと入力されたかを判定します。条件を満たしていれば、breakが実行されるため、ループを抜け出すことができます。

発展形として、ループを強制的に続ける方法があります。

while True:
    str_name = input('Enter name? ')
    if str_name == '#' #...[1]
        continue
    if str_name == 'END': #...[2]
        break
    print(str_name) #...[3]
print(done!!)

このプログラムでは、[1]の条件を満たすように文字列#が入力されると、[3]が実行されず強制的にループが戻ります。無限ループを抜けるには、ENDと入力して[2]を実行させる必要があります。

続いて、for文による有限ループを見ていきましょう。

for i in [5, 4, 3, 2, 1]:
    print(i)
print('Done!!')

for文では、iという変数をinの後にくる順番で変化させて繰り返す、というループを作ります。このプログラムでは、

5
4
3
2
1
Done!!

と出力されます。Pythonでは数字だけでなく、文字列の順番なども指定できます。

friends = ['Tanaka', 'Suzuki', 'Sato']
for i_friends in friends:
    print('Hello', i_friends)
print('Nice to meet you!!')

このプログラムでは、friendsの中に3つの文字列があります。for文で繰り返されるi_friends変数は、Tanaka→Suzuki→Satoと値を変えていきます。従来、他のプログラム言語ではカウンタという形でforの後にカウンタを指定するように、

for i = 1 to 100 'これはVBAの場合ですよ!

と記述することが多かったのですが、Pythonでは文字列をそのまま順番に実行していくことが可能です。したがって先のプログラムの出力は、

Hello Tanaka
Hello Suzuki
Hello Sato
Nice to meet you!!

というように表示されます。

これらを応用して、与えられたデータから最も大きい数を探し出すプログラムを書いてみましょう。

largest_number = -1 #...[1]
for i_number in [3, 8, 25, 1, 47, 33]: #...[2]
    if i_number > largest_number: #...[3]
        largest_number = i_number #...[4]
    print('so far the largest number is:', largest_number) #...[5]

print('Here is the largest number:', largest_number)

まず、[1]で最大数を持つ変数に仮の数値を入れておきます。次に、[2]でfor文によるループを作り、インデントすることでループのたびに[3]のif文を実行するようにします。条件を満たすときのみ、[4]の命令を実行します。VBAなどの他のプログラム言語とは異なり、変数i_number自体はカウンタではなく、データそのものを参照していることに注意してください。

今後の演習にも使えることですが、変数がどのように変化しているかを確認するためにも、[5]のように適宜変数の結果を出力しておくと、どこでプログラムがおかしく挙動しているかを診断することができます。


8.コースの修了

全部の課題を終えるとコース修了となり、修了証明書(Course Certificate)がもらえます。任意ですが、今後よりよい講座にするためのサーベイに答えます。

画像2

※名前と証明書のURLはマスクしてあります

1コースを終えただけでも証明書をもらえるのは嬉しいですね。やり遂げた感があります。なお、コース修了の証明書はLinkedinやFacebook等で共有することもできます。

それでは、次のコースのエントリもお楽しみに!

この記事が気に入ったらサポートをしてみませんか?