04. プログラミングと基本のアルゴリズム

4.1 Colabの使い方

今回は,最初に Google Colaboratory (通称 Colab) に入って,Python の世界のみなさんに Hello と挨拶します。その後, Python の基本や,アルゴリズムを図で表現するフローチャートについても説明します。

Colabは,Google のクラウドサーバーでプログラムコードを実行できるサービスです。制約もありますが,環境構築という初心者が挫折しやすいプロセスが不要なので,初めてプログラミングに触れる入門者には適しています。それではColabから入ってください。

日本語

English

動画を振り返りながら,流れを確認していきましょう。Colab を開いたら,まずはノートブックを新規作成をクリックしてください。この作業は,Google Drive の画面からでも可能です。その場合には,左上にある「ドライブ」のすぐ下の「+ 新規」の選択肢から Google Colaboratory を選べば,新規ノートブックを作成できます。作成後には,ノートブックのファイル名を好きなファイル名(動画ではhello)に変更してください。

ノートブックの文字を入力するフィールドをセルと呼び,テキスト入力を行うテキストセルとプログラムコードを入力するコードセルの2種類があります。テキストセルにはmarkdown記法で,コードセルにはPythonコードで入力します。

それでは入力してみましょう。テキストにはPythonの世界にご挨拶と入れましょう。コードには,とりあえずprint("Hello World!")と入れて,実行してみましょう。このコードを,コード1とします。

コード 1

print("Hello World!")

さて,プログラムは言語なので,その意味や役割を解説していきましょう。printは,引数(丸カッコの中身)を表示するpythonの関数です。文字列を引数として扱う場合,Excelと同じように,Pythonでも""で囲います。実行して Hello World! が表示されたら成功です。もしエラーが出たら,単なるタイプミスでしょうから,落ち着いてコードを書き直し,再度実行してみてください。

この記念すべき最初のプログラムコードを保存しておきましょう。Colab上でファイルを保存するには,ファイル > 保存,あるいはCtrl or ⌘ + S で保存すれば,Google Driveに保存することができます。なお,すべての変更を保存しましたと出ていたら,すでにファイルがGoogle Drive上に保存されているということです。

Colabのショートカットキー

いま,保存に関してショートカットキーを紹介しましたが,Colabでも様々なショートカットキーを使うことができます。メニューのツール > キーボードショートカットで確認して使ってみてください。良く使うショートカットキーの一覧を挙げておきます(Macの人はCtrlを⌘ に変えてください)。

ショートカットキー 内容
Ctrl + M Hキーボード ショートカットを表示
Ctrl + Sノートブックを保存
Ctrl + M A上にコードセルを挿入
Ctrl + M B下にコードセルを挿入
Ctrl + M D選択したセルを削除
Ctrl + M Yコードセルに変換
Ctrl + M Mテキストセルに変換
Esc現在のセルの選択を解除
Ctrl + Enter現在のセルを実行
Alt + Enterセルを実行して新しいセルを追加
Shift + Enterセルを実行して次のセルを選択
Ctrl + F9ノートブック内のすべてのセルを実行
Ctrl + M I実行を中断
Ctrl + /現在の行をコメントにします
Shift + Tab現在の行のインデントを解除
Tab または Ctrl + Spaceオートコンプリート
Ctrl + Zセル内の変更を戻す
Ctrl + Shift + Z最後のセル操作を元に戻す
Ctrl + M Z最後のセル操作を元に戻す(同上)
Ctrl + D同じコード/テキストを選択
Ctrl + Hグローバル検索/置換

4.2. はじめてのPython

さて,Colabを使えるようになったので,ここからは動画が少なくなり,実習のための埋め込みコードが多くなります。

Pythonはインタプリタ言語と言われ,Pythonでプログラムを書いてもそれが OS上で直接実行されるわけではありません。下図のように,インタープリタと呼ばれる別のプログラムがOSの言語に変換されプログラムを実行します。

alternative

Pythonプログラムは,シェルでコマンドプロンプトに対して直接書き込んで実行することもできますが,拡張子.pyのつくファイルを作って,それを実行してもらうこともできます。なお,皆さんがすでにColabで作成したのは.ipynbという拡張子のファイルで,それはIPython Notebookの略,つまり,ノートブック形式のファイルです。これは,Jupyter Notebookと呼ばれるコード・データ・ドキュメントを一元管理できる便利なツールの形式で,それまでの記録を再現してくれます。このJupyter Notebookは.pyと相互に変換することもできます。

それではPythonの実習に入るために,一旦閉じた.ipynbファイルを開いてみましょう。Colabに入ると,最初の画面でファイルの一覧が出るので,そこからクリックで作成したファイルを開くことができますし,あるいは,Google Driveに入って,自分の保存したファイルをダブルクリックして開いても構いません。

組み込み型:基本的なデータのタイプ

プログラムを学ぶ基礎の基礎として,文字列数値の違いについて,確認しておきましょう。とりあえず,次のコード(コード2)を実行してみてください。

コード 2

print("2 + 3")
print(2 + 3)

2つのコードの内,上のコードだと文字列と判断されて2+3が,下のコードだと数値の計算と判断されて5が,出力結果として表示されたはずです。

先ほども説明しましたが,クォーテーションマークは,文字列として認識させる機能を持ちます。一般的な文字列(入力値を文字として扱って欲しい場合)はダブルクォーテーション(""識別子として使用する場合(変数名など,何かを指す場合)にはシングルクォーテーション(''にしている例を,多く見かけますが,どちらも文字列として認識するという点では同じです。自分の中で整合的に使っていれば,どの使い方が間違いということはありません。

インデックス

シーケンス型(sequence types)というのは,要素が一定の順番で並んでいる種類の型のことで,リスト型(lists)もそのひとつです。リスト型は統計でいう変数に相当するデータを格納することに用いる方法のひとつなので,よく使われます。

複数の同じ型の要素を順番に並べた一次元のデータ構造はベクトルと呼ばれ,これが統計用語の変数に相当します。統計用語の変数は,IT 用語の変数が意味する PC 上の番地にクラス・オブジェクトを格納するときの変数とは(重なってはいますが)異なります。Pythonのリスト型自体は異なる型の要素を含むことも可能ですが,すべての要素が一定の型であるリストはベクトルと見なされ、統計上は「変数」として利用されることがあります。ただし,データ分析においてベクトルは第8回で出てくる配列として扱うことの方が圧倒的に多いので,後に出てくるより複雑なPythonコードではリストと配列の変換がよく登場します。

それでは,インデックス(index)によるリストの要素の取り出しを実行してみましょう。例えば,3つの要素が入ったリストの各要素のインデックス番号は,0, 1, 2 です。イン デックスは 0 から始まることを覚えておいてください。では下記のようにインデックスを用いて n というリストから要素を取り出すと,どのような結果が出るでしょうか?次のコードはコード3です。

コード 3

 n = ["1番","2番","3番"]
print(n[0])
print(n[1])
print(n[2])
print(n[0:2])

インデックスの-1 は最後の要素,-2 は最後から 2 番目・・・となります。また,コロン (:)はコロンの前の要素からコロンの後の要素の手前までという意味になります。Excel と違って,コロンの後の要素のひとつ手前までです。コロンで終われば最後の手前の要素まで,コロンから始めれば最初の要素からとすることができます。次のコードはコード4です。

コード 4

 n = ["1番","2番","3番","4番","5番","6番","7番","8番"]
print(n[8])

要素が 8 つなので,インデックス 8 である 9 つ目の要素を取り出そうとするとエラーに なります。これに対して範囲の指定においては,存在しないインデックスを用いることが 可能です。コロンを 2 つ使って,「どこから:どこの手前まで:いくつずつ」という要素 の取り出し方で見てみましょう。これをステップといいます。ステップは,すべての要素のときには1,ひとつおきのときには 2,・・・となります。次のコードはコード5です。

コード 5

print(n[0:-1:3])
print(n[1:8:2])

n[0:-1:3] の例ではコロンの前の 0 で「1つ目の要素から」,コロンの間の-1で「最後の要素まで」,コロンのあとの 3 で 3 ステップごとに(2つおきに)となっています。n[1:8:2] の例では,2 つのコロンの間に要素 8 という実際には存在しない値になっていますが,その手前までの実際に存在する要素で範囲の指定を可能にしています。この値はどんなに大きくても構いません。

例えば,8 つの要素しかない変数に対して 55 番目の要素までの範囲を指定しても,それは可能です。コロンの前の-1 で「最後の要素から」,コロンの後の 55 でその手前の要素である 54 までの実際に存在する要素,つまり最後の要素である ‘8 番’ だけを取り出すことができます。次のコードはコード6です。

コード 6

print(n[-1:55])

リストから指定した要素を削除することもできます。削除には del を用います。8 番まであった n から 3 番までの n に戻しましょう。次のコードはコード7です。

コード 7

del n[3:]
n

四則演算,コメントアウト,変数と代入

Pythonの四則演算の演算子は+-*/で,これらはExcelと同じです。異なるのはべき乗で,Excelでは^でしたが,Pythonでは**です。また,整数除算の//と剰余の%も覚えておくと良いでしょう。次のコードはコード8です。Pythonを計算機代わりに使う方法はこちらを参考にしてください。

コード 8

print(11//4)
print(11%4)

それではいくつかの項目を学んでいきましょう。第1に,パウンド記号(#:シャープ,ハッシュ)の行はコード中に実行をしてもコードとは認識されず,コメントと認識されるのでメモとして使えます。これをコメントアウトと言います。 以下をコードで実行しても,上の行はコメントアウトとなるので,下の行のみコードとして実行されます。次のコードはコード9です。

コード 9

#print("2 + 3")
print(2 + 3)

第2に,変数にデータを代入するのに=を使うことです。プログラミングにおける変数とは,コンピュータ上でデータの値を格納する場所のことです。変数名=データ でデータを変数に格納できます。以下のように,自分で自分なりの文字列を変数に入れて,結合してみましょう。下記はコード10です。

ただし,文字列と数値の結合は出来ません。コンピュータ上の場所,つまり変数は,大文字と小文字を別ものと認識します。変数名は,すべて半角小文字にしましょう。全角だとエラーになります。小文字にするのは慣習です。変数名はアルファベットまたはアンダーバー(_)から始めることが出来ますが,数字から始めることはできません。2文字目以降であれば数字も使うことが出来ます。

コード 10

name1 = "Chikako"
name2 = "Takeishi"
print(name1 + " " + name2)

算術演算子の一覧表

算術演算子の一覧表を作っておきました。参考にしてください。

演算子説明
+a正数
-a負数
a + b加算
a - b減算
a * b乗算
a / b除算
a % ba を b で割った余り
a ** ba の b 乗
a // b切り捨て除算

標準入力,型の変換,関係演算子

標準入力とは,プログラムが実行環境からデータを受け取ることで,input を用います。 input 関数はデータを文字列として受け取ります。下記のコードを実行すると空欄が出現するので,そこに任意の文字を入力して,入力したデータを input 関数で受け取ってみましょう。下記はコード11です。

コード 11

name3 = input()
print(name3 + "にお知らせです。")

第4は,の変換です。Pythonの数値には主に2つの型(正確には3つの型)があります。整数型浮動小数点型,(3つ目は複素数)です。 整数(integer)にはint関数で,浮動小数点数 (floating point number)にはfloat関数で変換できます。文字列型 (string)には,str関数で変換できます。

つぎのコードの標準入力に任意の値を入力し,実行してみましょう。入力した値は戻り値となりますが,コードの 2 行目は実行されず,入力値に 1 が足された値は返されません。なぜでしょうか? それは上記で説明したように,input 関数は入力値を文字列として受け取るため,そのままでは計算できないからです。コード12を参照してください。

コード 12

number1 = input()
print(number1 + 1)

したがって,上記コード 2 行目の計算を可能にするには,input 関数で受け取った入力値が代入されている number1 というオブジェクトの型を,文字列から整数に変換してあげる必要があります。以下のコード13を実行してみましょう。

コード 13

number1 = input()
print(int(number1) + 1)

第5は,関係演算子(比較演算子)です。下記のコードで空欄にいろいろな整数を入力すると,19以下であればTRUE,19より大きければFALSEが戻り値として返ってきます。このTRUE, FALSEをブール型(bool型,boolean)といいます。下記はコード14です。

コード 14

n = int(input())
n <=  19

関係演算子(比較演算子)の一覧表

関係演算子(比較演算子)の一覧表も作っておきました。関係演算子は,何らかの条件に当てはまるかどうかをチェックしたり,その条件に当てはまるものだけを抽出する際によく使います。

演算子説明
a == ba が b と等しい
a != ba が b と異なる
a < ba が b よりも小さい
a > ba が b よりも大きい
a <= ba が b 以下である
a >= ba が b 以上である
a is ba が b と等しい
a is not ba が b と異なる
a in ba が b に含まれる (a, b は共に文字列,または,b はリストやタプル)
a not in ba が b に含まれない (a, b は共に文字列,または,b はリストやタプル)

4.3. 基本アルゴリズムのフローチャート

アルゴリズムとは,問題を解決するための,はっきりと決まった手順やルールの集まりのことを指しています。コンピューターは自分で考えることはできないので,「こうなったらこうする」というアルゴリズムに従ってしか動けません。なので,プログラミングというのは,コンピューターにやらせたいことを,アルゴリズムとして書いてあげることとも言えますね。

順次・分岐・反復

プログラミングで用いる基本のアルゴリズムは,順次と分岐と反復の3種類です。 以下の図はそれぞれについての簡単な処理手順を示しています。

alternative

if 文による分岐

第6は,制御フローについてです。ここでは分岐と反復の複合文である if と for を実習します。

Pythonのコードの書き方の特徴は,条件を設定したコードに半角コロン(:)を付し,その条件下で行われる処理については,インデント(字下げ)します。インデントは自動的に挿入されることが多いですが,自分で入力するときにはTabキーを用いず,スペースで入力することをお薦めします。 他のプログラミング言語を学んだことのある人は,こういったブロック区切りは{波括弧}で括っていたかもしれませんが,Pythonではインデントで行います。以下のような感じです。

この条件では:
    この処理を行う

Pythonでは,インデントがある=この行は,ある条件や関数などの中に入っているという意味になるので,「このコードはどこに属しているか」を示すための重要なルールになっています。インデントがずれるとエラーになったりするので,単純に見た目を揃えているだけでないことに注意しましょう。

では,if関数の場合です。以下のように,ifとコロンとの間に,関係演算子を使った条件を挟みます。そうするとその条件に当てはまるときだけ,インデントの段落を実行してくれます。下記はコード15です。

コード 15

n = int(input())
if n <=  19:
    print("あなたの飲酒は法律で禁止されています。")

条件に当てはまらない場合の処理を設定するには else を使います。elseの行末にもコロンを付けて,elseの時の処理をインデントします。 フローチャートとコードを下記に示します。下記はコード16です。

コード 16

n = int(input())
if n <=  19:
    print("あなたの飲酒は法律で禁止されています。")
else:
    print("あなたの飲酒は法律で認められています。")
alternative

ifとelseの間にelifを挿入すれば,さらに条件を加えていくことが出来ます。下記はコード17です

コード 17

n = int(input())
if n <  6:
    print("あなたは無料です。")
elif n < 13:
    print("あなたはこども料金です。")
else:
    print("あなたは大人料金です。")
alternative

For 文によるループ

つぎに,ループ処理のforについてです。ループ処理とは,同じ処理を繰り返すことで,そのためのfor文はfor ある値 in 範囲: のような形式をとります。「ある値」のところには変数が入ることもありますし,下記のコード18のようにiを入れこともあります。range()の中に数値がひとつの場合は,その数値が繰り返しの回数になります。

コード 18

like = "いいね!"
for i in range(3):
    print(like)
alternative

実際に for 文を用いる際には,in のあとに range で回数を指定するよりもイテラブルオブジェクトを用いることの方が多いかもしれません。イテラブルオブジェクトとはイテラブル(iterable),つまり繰り返し可能なオブジェクトのことで,例えばリストのようなシーケンス型のオブジェクトが含まれます。下記はコード19です。

コード 19

for i in n:
    print(f"{i}は表彰されます。")

While 文によるループ

ループ処理にはwhile を使うことができます。条件式が真である間,ループを繰り返すのが while 文で,while ある条件:のような形式をとります。

下記の例では,小学校の各学年初めは何歳かを出力するようにしています。最初に year=1 で 1 年生を設定し,小学生は 6 年生までなので,while 文で学年が 7 未満である 間だけループを繰り返すようにしています。

ループ処理が行われるインデントされた部分では,学年の値に 5 を加えた値を age という変数に代入するようにし,print 関数で,1 年生なら「小学 1 年生は 6 歳です。」と出力させるようにして,最後の行の累算代入演算子で year に 1 を足したものを year 変数に上書きしています。一巡目で year が 2 年生になったの で,インデントされている最初の行に戻って 2 年生は 2+5 で 7 歳となり・・・とループ を繰り返すというコードです。下記はコード20です。

コード 20

year = 1
while year < 7:
    age = year + 5
    print(f"小学{year}年生は{age}歳です。") 
    year += 1