Lesson 2

基礎文法

Lesson 2 Chapter 1
インデントについて

小説など文章を記述する際には、その文章をすっきり見せるために段落や改行といった書き方のルールがあります。プログラミングも文章同様に、その構造を見易く、且つわかり易くするためのルールが存在します。それが、インデントです。このChapterではインデントとは何か、そして、Pythonにおけるインデント使用時のルールを解説します。

インデントとは

プログラミング言語を用いて人間が記述をした文字列のことを、ソースコードと言います。成し遂げたい処理を実現させるためにプログラミングをするわけですが、場合によっては、大量にソースコードが記述されることもあります。

また、完成したプログラムへの機能追加やバグ修正など更新作業が発生した際には、他人のソースコードを読み解いて作業をするといったことも当たり前に発生します。

ソースコードを自分にも他人にも、出来る限り読み易くするためにインデントが利用されます。インデントとは字下げの意味であり、ソースコードを読み易くするためのルールであると同時に、Pythonではプログラムの纏まりをインデントで判断するため、インデントの誤りはエラーに繋がります。

Pythonのインデントルールについて

合計点数が60点以上であれば合格、そうでなければ不合格とする以下のような判定プログラムを例に、インデントあり・なしのソースコードを見比べてみましょう。(例文のためプログラムは日本語で記述しています)

インデントありのソースコードは、1・3行目が点数を判定する処理であり、2・4行目は判定した結果に応じて合格/不合格を画面出力する処理となります。
判定処理と出力処理の区別がし易いように、2・4行目の開始をインデント(字下げ)しています。

インデントにはTabやスペースを利用しますが、Pythonではスペースを4つ使うことがルールとして決められています。また、Pythonにおいてインデントはソースコードを見易くするためだけでなく、インデントを誤るとエラーになるため、基本ルールを守りコーディングすることが重要です。

インデントあり
if(合計点が60点以上なら)
    '合格'と出力する
else(60点以上でないなら)
    '不合格'と出力する
インデントなし
if(合計点が60点以上なら)
'合格'と出力する
else(60点以上でないなら)
'不合格'と出力する

Lesson 2 Chapter 2
Hello World

Pythonに標準で用意されている文字出力の関数を使用して、簡単な文字出力を2つの方法を用いて実行してみましょう。関数とは何かについては、後のレッスンで詳しく解説するので、このChapterでは、関数は何らかの機能であると覚えていただければ問題ありません。

対話モードを利用した文字出力

Windowsの場合はコマンドプロンプト、macOSの場合はターミナルを起動させ、"python"と入力し実行してください。「>>>」という文字(プロンプト)の表示を確認できれば準備は完了です。

Pythonの起動が確認できたら、以下のコマンドを入力し実行してください。

>>> print('Hello, World!')

Lesson1のChapter5での動作確認時同様に、以下の文字列が出力されます。

Hello, World!

次に、HelloとWorldをカンマ(,)区切りで入力します。HelloとWorldはそれぞれシングルクォーテーション(')で囲んでください。Pythonは、シングルクォーテーションで囲んだ範囲を文字として認識します。囲まなかった場合はエラーとなります。

>>> print('Hello', 'World!')

最初のコマンド実行結果とは違い、HelloとWorldの間がスペースで区切られ出力されていることが確認できます。

Hello World!

print関数は、Pythonに標準で用意されている文字出力関数です。printに続いて記述した括弧内の値を引数といって、出力したい文字を引数に記述します。

ファイルに保存したプログラムを利用した文字出力

デスクトップに「test.py」というファイル名のテキストファイルを作成し、以下の内容を記述してください。

test.py
print('Hello, World!')

ファイル作成後、Windowsの場合はコマンドプロンプト、macOSの場合はターミナルを起動させ、以下のコマンドを実行して「test.py」を作成したデスクトップに移動します。

cd desktop

デスクトップへ移動後に以下のコマンドを実行します。対話モードと同様の出力結果が得られるはずです。

python test.py

ファイルの拡張子

Pythonのプログラムファイルであることを示すために、ファイルの拡張子には「.py」を付けます。

Lesson 2 Chapter 3
四則演算

このChapterでは数値の扱いについて解説していきます。Pythonでは整数をint型、浮動小数点数をfloat型という型として扱い、四則演算を用いた計算が可能です。実際に、四則演算を使用して数値を扱い、その結果を確認していきましょう。

Windowsの場合はコマンドプロンプト、macOSの場合はターミナルを起動させ、"python"と入力しPythonを起動させ準備してください。

足し算(加算)

演算子"+"を使用して、足し算を行います。

>>> 3 + 3
>>> print(3 + 3)

出力結果

6

引き算(減算)

演算子"-"を使用して、引き算を行います。

>>> 6 - 4
>>> print(6 - 4)

出力結果

2

掛け算(乗算)

演算子"*"を使用して、掛け算を行います。

>>> 3 * 3
>>> print(3 * 3)

出力結果

9

括弧で囲むとそのまとまりが先に計算されます。算数の考え方と全く同じです。

>>> (10 - 6) * 2
>>> print((10 - 6) * 2)

出力結果

8

割り算(除算)

演算子"/"を使用して、割り算を行います。

>>> 4 / 2
>>> print(4 / 2)

出力結果

2.0

割り算のみ浮動小数点で出力されます。

以下の割り算を実行します。

>>> 8 / 5
>>> print(8 / 5)

出力結果

1.6

出力結果は、1.6となり浮動小数点で出力されることが確認できます。

割り算で整数部のみ出力したい場合は、"//"を利用します。

>>> 8 // 5
>>> print(8 // 5)

出力結果

1

割り算の剰余(余り)

演算子"%"を使用して割り算を行うことで、余りのみが出力されます。

>>> 17 % 3
>>> print(17 % 3)

出力結果

2

Lesson 2 Chapter 4
文字列型

このChapterでは文字列の扱い方について解説していきます。コンピュータは数値を扱うことが基本であるため、文字列を扱う場合には文字列データであるということをコンピュータに明示する必要があります。Pythonでは文字列をstr型という型として扱います。print関数を使用して文字列を扱い、どのようにしてコンピュータに文字列データであることを示すのか、そのルールと文字列に対して行える操作について確認していきましょう。

Windowsの場合はコマンドプロンプト、macOSの場合はターミナルを起動させ、"python"と入力しPythonを起動させ準備してください。

文字列の記述方法

文字列として扱いたいデータの集まりを、ダブルクォーテーション(")か、シングルクォーテーション(')で囲います。

>>> print("Hello")
>>> print('Hello')

ダブルクォーテーションか、シングルクォーテーションのどちらで囲んだ場合も出力結果は同じです。

出力結果

Hello

シングルクォーテーションの扱い方

「I can't belive it」のように文字列の中でシングルクォーテーションを扱いたい場合は、どのように記述するべきでしょうか。まず以下の記述で実行します。

>>> print('I can't belive it')

出力結果

SyntaxError: invalid syntax. Perhaps you forgot a comma?

この記述では、何処からどこまでが文字列であるかを判別できず、エラーであることを示す「SyntaxError」が出力されます。

文字列を囲んでいるシングルクォーテーションをダブルクォーテーションに修正してください。

>>> print("I can't belive it")

出力結果

I can't belive it

シングルクォーテーションのみを使用した場合は、以下のように記述します。

>>> print('I can\'t belive it')

表示したいシングルクォーテーションの前にバックスラッシュ(\)を付けることで、正常に「I can't belive it」と出力されるはずです。

ダブルクォーテーションの扱い方

次に、文字列の中でダブルクォーテーションを扱う場合の記述方法を確認します。

「say "I can't belive it"」と出力させます。

>>> print('say "I can\'t belive it"')

出力結果

say "I can't belive it"

ダブルクォーテーションのみを使用した場合を考えます。まず、以下の記述で実行してみてください。

>>> print("say "I can\'t belive it"")

出力結果

SyntaxError: invalid syntax. Perhaps you forgot a comma?

構文エラーである「SyntaxError」が出力されます。
ダブルクォーテーションが複数使用されているため、何処からどこまでを文字列とすればよいのかを判別できなくなっています。

正しい記述は以下のとおりです。シングルクォーテーションの時と同様に、表示させたいダブルクォーテーションの前にバックスラッシュ(\)を付けて実行してみてください。シングルクォーテーションの前に付けたバックスラッシュは不要になります。

>>> print("say \"I can't belive it\"")

出力結果

say "I can't belive it"

改行の扱い方

文字列に改行を加えたい場合は、以下のように改行したい文字列の前に"\n"を付けて記述します。

>>> print('Hello.\nGoodBye.')

出力結果

Hello.
GoodBye.

raw文字列の扱い方

ディレクトリを表現したい場合などは、以下のような記述が考えられますが、実行すると\nameの先頭\nを改行と判定してしまいます。

>>> print('C:\name1\name2\name3')

出力結果

C:
ame1
ame2
ame3

このような場合は、rawデータ(生データ)として扱うために、"r"を付けて記述します。

>>> print(r'C:\name1\name2\name3')

出力結果

C:\name1\name2\name3

文字列の連結

文字列同士を連結させる場合は、"+"を利用します。

>>> print('Pyt'+'hon')

"+"を利用せずに、以下の方法でも連結が可能です。

>>> print('Pyt''hon')

出力結果

Python

以下のような文字列と数値の連結はエラーになります。

>>> print('平均点は' + 65 + '点')

出力結果

TypeError: can only concatenate str (not "int") to str

数値を文字列に変換するstr関数を利用するか、シングル(ダブル)クォーテーションで囲み、数値を文字列として扱うことで連結が可能になります。

>>> print('平均点は' + str(65) + '点')
>>> print('平均点は' + '65' + '点')

出力結果

平均点は65点

文字列の繰り返し

同じ内容の文字列を繰り返す場合は、"*"を利用します。

>>> print('Hello.' * 3)

出力結果

Hello.Hello.Hello.

連結と繰り返しを同時に使用して、文字を出力します。

>>> print('say.' + 'Hello.'* 3)

出力結果

say.Hello.Hello.Hello.

Lesson 2 Chapter 5
リスト型

リストは、シーケンスデータを扱うことが可能な型の一つです。シーケンスデータとは、順番に並んだ連続したデータを意味します。Chapter4の文字列もシーケンスデータの一種ですが、リストには文字列とは違った特徴があり、Pythonでは頻繁に利用される重要なデータ型です。このChapterではリストの作成(定義)方法から、リストに対して行える操作を学ぶことでリストの特徴を掴んでいきます。

Windowsの場合はコマンドプロンプト、macOSの場合はターミナルを起動させ、"python"と入力しPythonを起動させ準備してください。

リストの定義

リストを定義するには、角括弧[]内に値をカンマ(,)区切りで記述します。

>>> lst = [1,2,3,4,5,6,7,8,9]

これでリストが定義されました。今回は、「lst」という配列名を使用していますが、配列名は任意の値で設定可能です。リストの定義が完了したら、配列名「lst」を入力して実行してください。

>>> lst

出力結果

[1,2,3,4,5,6,7,8,9]

このように配列名を指定することで、リスト内の値を取り出すことが可能です。

インデックスを使用した要素の取り出し(スライス)

リストに定義した一つひとつの値は、要素と呼ばれます。要素の一つひとつには番号が付いており、それをインデックスといいます。このインデックスを利用することで、要素を色々な方法で取り出すことが可能です。この操作をスライスといいます。先程は、配列名を指定しリストの要素全てを取り出しましたが、今度は、リストの要素一つのみを取り出します。

>>> lst = [1,2,3,4,5,6,7,8,9]
>>> lst[0]

出力結果

1

インデックスの"0"を指定すると、リストの要素"1"が取り出されました。インデックスは、"0"から始まる事に注意してください。それでは、リストの要素"3"を取り出してみましょう。

>>> lst[2]

出力結果

3

続いて、色々な方法で要素を取り出してみます。複数の要素を取り出すには、インデックスをコロン(:)で区切り指定します。

要素の"1"から"2"までを取り出します。

>>> lst[0:2]
>>> lst[:2]
>>> lst[-9:-7]

出力結果

[1, 2]

要素の"3"から"5"までを取り出します。

>>> lst[2:5]
>>> lst[-7:-4]

出力結果

[3, 4, 5]

取り出し範囲について

インデックスを使用した要素の取り出しでは、指定した一つ前の要素までを取り出します。[2:5]の指定では、インデックスNo.5の"6"まで([3, 4, 5, 6])ではなく、インデックスNo.5の一つ手前となる"5"まで([3, 4, 5])が取り出されます。

要素の"2"から最後までを取り出します。

>>> lst[1:]
>>> lst[-8:]

出力結果

[2, 3, 4, 5, 6, 7, 8, 9]

全ての要素を取り出します。

>>> lst[:]

出力結果

[1, 2, 3, 4, 5, 6, 7, 8, 9]

最後から順に要素を取り出します。

>>> lst[::-1]

出力結果

[9, 8, 7, 6, 5, 4, 3, 2, 1]

指定した数だけスキップして要素を取り出します。

>>> lst[::2]

出力結果

[1, 3, 5, 7, 9]

ネストされたリストの作成

ネストとは入れ子の意味であり、リスト内にさらにリストを作成します。
最初に2つのリストを定義します。

>>> lst1 = [1,2,3]
>>> lst2 = ['a','b','c']

文字列の定義

文字列を定義する際は、ダブルクォーテーション(")か、シングルクォーテーション(')で囲います。

2つのリストが定義出来たら、2つをまとめるリストを新たに定義します。

>>> lst3 = [lst1,lst2]

3つ目のリストが定義できたら、「lst3」を確認してみてください。ネストされたリストが作成されていることが確認できるはずです。

>>> lst3

出力結果

[[1, 2, 3], ['a', 'b', 'c']]

ネストされたリストの要素の取り出し

ネストされたリストの要素を取り出します。

>>> lst1 = [1,2,3]
>>> lst2 = ['a','b','c']
>>> lst3 = [lst1,lst2]
>>> lst3[0]

出力結果

[1, 2, 3]

次に、"c"を取り出します。

>>> lst3[1][2]

出力結果

'c'

リストの操作

定義したリストを操作することで、リスト内の要素に変更を加えることが可能です。
以下のリストを定義します。

>>> lst4 = ['a','b','c','d','e','f']

リストの定義が完了したら、「lst4」を確認してください。

>>> lst4

出力結果

['a', 'b', 'c', 'd', 'e', 'f']

要素"a"を大文字に変更します。

>>> lst4[0] = 'A'

再度、リスト「lst4」を確認してみましょう。"a"が"A"に変わっているのが確認できるはずです。

>>> lst4

出力結果

['A', 'b', 'c', 'd', 'e', 'f']

次は、スライスを利用して複数の要素に変更を加えます。

>>> lst4[1:4] = ['B','C','D']
>>> lst4

出力結果

['A', 'B', 'C', 'D', 'e', 'f']

要素の削除も可能です。以下を実行した後に配列「li4」を確認してください。指定した要素が削除されていることが確認できます。

>>> lst4[4:6] = []
>>> lst4

出力結果

['A', 'B', 'C', 'D']

リストの追加メソッド

リストには、リストに対する手続きがいくつも用意されています。これを「メソッド」といいます。覚えておくと便利なメソッドをいくつか紹介します。
まずは、以下のリストを定義します。

>>> lst5 = [10,20,30,40,50]

リストにデータを追加するメソッド「append」を使用して、要素を追加します。

>>> lst5.append(60)

配列名を指定して要素が追加されているか確認します。

>>> lst5

出力結果

[10, 20, 30, 40, 50, 60]

appendで指定した60が、リストの最後に追加されます。

次は、要素を追加するメソッド「insert」を使用します。

>>> lst5.insert(0,5)

appendとは違い、追加したい場所のインデックスを指定する必要があります。リストの先頭に追加するため、インデックスNo.0を指定したのち、追加したい値:5を指定しました。

>>> lst5

出力結果

[5, 10, 20, 30, 40, 50, 60]

リストの削除メソッド

削除するメソッドを確認していきます。メソッド「del」を使用してリスト内の最後の40を削除します。削除したいインデックスNoを指定します。

>>> lst5 = [10,20,30,40,50]
>>> del lst5[3]
>>> lst5

出力結果

[10, 20, 30, 50]

次は、メソッド「pop」を使用します。

>>> lst5.pop(1)

出力結果

20

コマンドの実行と同時に20が表示されるはずです。delは削除でしたが、popは取り出しを意味します。このため取り出した要素を表示したわけです。

「lst5」を確認してください。delと同じく指定した要素が削除されているはずです。

>>> lst5

出力結果

[10, 30, 50]

今まではインデックスを指定して要素の削除を行いましたが、今度は要素を指定して削除を行うメソッド「remove」を使用します。

>>> lst5.remove(30)
>>> lst5

出力結果

[10, 50]

使用可能なメソッドの確認方法

リストのメソッドには説明した以外にも、並び替え等多くのメソッドが準備されています。リストで使用可能なメソッドを以下のコマンドで確認できるので、参考にしてみてください。
・print(help(list))

演算子を使った追加・連結

文字列の時と同様に、演算子を使って要素の追加やリストの連結が可能です。

以下の2つのリストを作成してください。

>>> lst6 = ['Blue' ,'Green','red']
>>> lst7 = ['Black','White','Gray']

"+"演算子は、リスト同士を結合して新たなリストを作成します。

>>> lst8 = lst6 + lst7

「lst8」を出力してリスト内の要素を確認しましょう。2つのリストが連結されています。

>>> lst8

出力結果

['Blue', 'Green', 'red', 'Black', 'White', 'Gray']

元々のリストに要素を追加するには、"+="演算子を使用します。

>>> lst6 += lst7

「lst6」を出力してみると、連結された結果が確認できるはずです。

>>> lst6

出力結果

['Blue', 'Green', 'red', 'Black', 'White', 'Gray']

リストのコピー

リストのコピーにはバグに繋がる注意点があります。分かりにくい点でもあるので、実際に出力結果を見ながら説明をしていきます。

以下のリストを作成します。

>>> cp1 = [1,2,3,4,5]

作成したリスト「cp1」を新しいリスト「cp2」へコピーします。

>>> cp2 = cp1

「cp2」の内容を確認しましょう。「cp1」がコピーされています。

>>> cp2

出力結果

[1, 2, 3, 4, 5]

次に、「cp2」の要素を変更します。

>>> cp2[0] = 10

「cp1」・「cp2」の内容をそれぞれ確認します。

出力結果

>>> cp1
[10, 2, 3, 4, 5]
>>> cp2
[10, 2, 3, 4, 5] 

「cp2」の要素が変更されていることに加えて、「cp1」も変更されているはずです。これは値がコピーされたのではなく、メモリのアドレスがコピーされる参照渡しが行われたためです。メモリのアドレスをコピーしたので、「cp1」・「cp2」ともに同じアドレスを参照しています。このため、「cp2」の要素を変更したようでも、実際は「cp1」も参照している同じアドレスに格納された値を変更した事になります。結果どちらの要素も変更されてしまったわけです。値のみコピーしたい場合は、メソッド「copy」を使用します。

もう一度リストを作成し直します。

>>> cp3 = [10,20,30,40,50]

copyメソッドを使用して、値をコピーします。

>>> cp4 = cp3.copy()

「cp4」の内容を出力して、「cp3」の要素がコピーされていることを確認してください。

>>> cp4

出力結果

[10, 20, 30, 40, 50]

「cp4」の要素を変更します。

>>> cp4[0] = 100

「cp3」・「cp4」の内容をそれぞれ確認します。

出力結果

>>> cp3
[10, 20, 30, 40, 50]
>>> cp4
[100, 20, 30, 40, 50]

「cp4」のみ要素が変更されています。このように参照渡しと値渡しのコピーの違いを理解したうえでリストのコピーを使用することが重要です。

Lesson 2 Chapter 6
if文

Pythonのプログラムは、基本的には上から下に実行されます。しかし、それだけでは実現できる処理が限られてしまいます。例えば、試験の点数が平均点以上であるかを判定させたり、年齢が20歳以上の場合は入場を許可するなど、ある条件によって実行すべきプログラムを制御する必要性が出てきます。そこで利用されるのが、今回解説する条件分岐のif文です。ある条件によって実行するプログラムを分岐させて制御することが可能になります。

今回は、サンプルコードをテキストファイルに記述して拡張子「.py」として保存してください。作成したファイルを実行することで処理結果を確認していきます。

if文の使い方

ある値とxに代入した値を比較し、大きい・小さいを判定して結果を出力するコードを記述します。まずは、xに代入した値が50より大きい場合に、出力処理を実行するコードです。これは、条件式が真(True)の場合の処理です。
if文と合わせて変数の使い方も覚えましょう。以下のサンプルコードでは、「x = 60」といったコードを記述していますが、"x"が変数です。変数とは、値を格納するための箱です。「変数名 = 値」で定義可能です。変数名は任意であり、値は数値や文字列等を指定します。

インデントについて

Pythonのコードを記述する際は、Chapter1で説明したインデント(字下げ)に注意してください。スペース4つを使用したインデントを忘れないようにしましょう。

test.py
x = 60
if x > 50:
    print('OK')

実行すると、以下のように出力されます。

OK

変数xの値を40に変更して、再度実行してください。

test.py
x = 40
if x > 50:
    print('OK')

変数xが50より大きくなかった場合の条件をプログラムしていないため、画面には何も出力されません。これは、条件式が偽(False)の場合のプログラムが記述されていないからです。

条件式が偽の時の処理

先程使用した「test.py」に、条件が偽(False)の場合の処理を追加しましょう。if〜elseという構文を記述します。

test.py
x = 40
if x > 50:
    print('OK')
else:
    print('NG')

出力結果

NG

変数xが50より大きくなかった場合の条件式が実行され、「NG」が出力されました。

条件式の複数利用

if〜elif〜elseの構文を利用することで、複数の条件を利用することが可能になります。変数xの値を100に変更し、100と一致した場合に"Perfect"を出力する条件処理を追加してみましょう。

test.py
x = 100
if x > 50:
    print('OK')
elif x == 100:
    print('Perfect')
else:
    print('NG')

出力結果

OK

想定した出力結果の"Perfect"ではなく"OK"が出力されました。これは、冒頭でも述べたとおり、上から順にプログラムが処理され、if文の最初の50より大きい場合に"OK"を出力する条件が真となり、その時点で処理が完了しているからです。

elifの条件が処理されるようにコードを修正します。変数xの値を0に変更して、elifの条件も0の場合に"Zero"を出力するよう変更して、実行してください。

test.py
x = 0
if x > 50:
    print('OK')
elif x == 0:
    print('Zero')
else:
    print('NG')

出力結果

Zero

最初の条件である50より大きい場合が偽となり、次のelifの条件が処理されて真と判定されたため、"Zero"が出力されました。

if文で使用可能な比較演算子

if文の条件式で使用可能な比較演算子は以下の表のとおりです。

演算子 説明
> 左辺の値が、右辺の値より大きい
左辺の値が、右辺の値より小さい
== 左辺の値と、右辺の値が等しい
>= 左辺の値が、右辺の値より大きいか等しい
左辺の値が、右辺の値より小さいか等しい
!== 左辺の値と、右辺の値が等しくない
in 左辺が右辺に含まれている
not in 左辺が右辺に含まれていない
is 左辺と右辺のオブジェクトが等しい
is not 左辺と右辺のオブジェクトが等しくない

値を比較するだけではなく、要素の集合に対しての判定や、オブジェクトの判定にも演算子の使用が可能です。

オブジェクト

プログラムが処理や操作をすることが可能で、型を持つデータが「オブジェクト」です。Chapter3では、数値にはint型やfloat型があり、Chapter4では、文字は文字列型であると解説しましたが、これらもオブジェクトです。

in演算子

以下のコードは、演算子inを使用して変数xの値:3がリスト内の要素に含まれるかを判定しています。リスト内に3が存在するため判定は真となり、"OK"が出力されます。

test.py
lst = [1,2,3,4,5]
                    x = 3
if x in lst:
    print('OK')

出力結果

OK

is演算子

is演算子は、オブジェクトを比較します。以下のコードでは、まず変数のxとyに値を代入した後に型を取得するtype関数を使用して、xとyそれぞれの型を出力しています。

test.py
x = 15
y = 15.0

print(type(x))
print(type(y))

出力結果

<class 'int'>
<class 'float'>

print関数の出力結果から、変数xはint型であり、変数yはfloat型であることが確認できます。xとyは、値は一緒でも型が違っています。

次に、==演算子とis演算子を使用した2つのif文を記述し実行結果を確認します。

test.py
x = 15
y = 15.0

print(type(x))
print(type(y))

if x == y:
    print('Equal')
else:
    print('not_Equal')

if x is y:
    print('OK')
else:
    print('NG')

出力結果

<class 'int'>
<class 'float'>
Equal
NG

値を比較する==演算子を使用した結果は真と判定され"Equal"が出力されていますが、オブジェクトを判定するis演算子を使用したif文では、不一致と判定され"NG"が出力されました。

論理演算子の使い方

if文で複数条件を指定する場合は、論理演算子を使用します。Pythonで使用可能な論理演算子は以下の表のとおりです。

演算子 説明
and XとYのどちらも真の場合のみ真となり、それ以外は偽(複数の条件が全て成立する場合に真)
or XとYどちらかが真の場合に真となり、それ以外は偽(複数の条件いずれかが成立する場合に真)
not Xが真の場合は偽となり、Xが偽の場合は真(条件が成立しなければ真)

and演算子

以下がand演算子の使用方法です。変数のxとyのどちらも5より大きいという条件を満たしているため、真であると判定され"True"が出力されます。

test.py
x = 10
y = 10
if x > 5 and y > 5:
    print('True')
else:
    print('False')

出力結果

True

or演算子

以下がor演算子の使用方法です。変数xのみしか5より大きいという条件を満たしていませんが、or演算子はxとyのどちらかが真であれば真と判定されるため、"True"が出力されます。

test.py
x = 10
y = 1
if x > 5 or y > 5:
    print('True')
else:
    print('False')

出力結果

True

not演算子

以下がnot演算子の使用方法です。変数xは10であり、100であるという条件が成立しないため、"True"が出力されます。

test.py
x = 10
if not x == 100:
    print('True')
else:
    print('False')

出力結果

True

Lesson 2 Chapter 7
for文

コンピュータは、同じ処理を何度も繰り返し実行することを得意とします。このChapterではその繰り返し処理を指示する方法を解説します。

for文とは

for文とは、ループ処理を意味します。同じ処理を繰り返したい時に利用可能な文法がfor文です。同じ処理を繰り返したい時に、同じプログラムを何度も記述するのは、コードが煩雑になり可読性が低下します。for文を利用することでプログラムが簡素化でき、可読性も向上します。

for文の使い方

for文を使用して、指定の文字列を繰り返し出力する処理を記述します。

for_test.py
test_str = 'HelloWorld'

for x in test_str:
    print(x)

出力結果

H
e
l
l
o
W
o
r
l
d

出力結果で確認できるとおり、'HelloWorld'から文字一つひとつを取り出して、print関数にて出力しています。これをfor文を使用しないで記述すると、以下のようにプログラムが煩雑になります。

for_test.py
print('H')
print('e')
print('l')
print('l')
print('o')
print('W')
print('o')
print('r')
print('l')
print('d')

リストを使ったfor文

次に、for文の具体的な使用方法として、リストを使ったfor文を見ていきましょう。

for_test.py
lst = ['Tokyo','Osaka','Nagoya','Sapporo']
                    for x in lst:
    print(x)

出力結果

Tokyo
Osaka
Nagoya
Sapporo

以下のように、for文内でリストを定義することも可能です。

for_test.py
for x in ['Tokyo','Osaka','Nagoya','Sapporo']:
    print(x)

出力結果

Tokyo
Osaka
Nagoya
Sapporo

イテレータ

for文にて大量のデータを繰り返し処理する場合に、メモリ消費量も増加する懸念があると考えるかもしれません。しかし、for文は繰り返す対象のデータをメモリに一度に読み込むのではなく、一つひとつ読み込みながら処理を実行します。これは、要素を反復して取り出すことのできる「イテレータ」というインターフェースを利用しているからです。このため、大量データの読み込み時においても、メモリを大量に消費することなく処理を実行することができます。

Lesson 2 Chapter 8
range()関数

Chapter7では、繰り返し処理のfor文を解説しましたが、このfor文で連続した大量の数値を出力させたい場合はどのようにすれば良いでしょうか。例えば、0〜100の数値を出力させたい繰り返し処理の場合、for文に0〜100を記述しなければいけなくなります。それは、あまりにもプログラムが煩雑になり、明らかに手間でもあります。そこで、Pythonには連続した整数値を発生させる関数「range」が標準で用意されています。range関数をfor文と合わせて使用することで、よりプログラミングらしい構造を作ることが可能になります。

range関数の使い方

range関数の利便性を把握するために、使用した場合とそうでない場合のコードを記述し、その差を確認していきましょう。まずは、以下のようにrange関数を使わないfor文を作成してみましょう。

for_test.py
lst = [0,1,2,3,4,5,6,7,8,9]
for x in lst:
    print(x)

出力結果

0
1
2
3
4
5
6
7
8
9

次に、range関数を使用したコードです。

for_test.py
for x in range(10):
    print(x)

出力結果

0
1
2
3
4
5
6
7
8
9

出力結果は同じですが、range関数を使用することで簡素なコードにすることが可能です。

開始要素と終了要素を指定した使用方法

以下のコードのように、開始要素や終了要素を指定して、range関数を使用することが可能です。

for x in range(5,10):
    print(x)

出力結果

5
6
7
8
9

ステップを指定した使用方法

ステップを指定することで、等差数列の生成が可能です。開始・終了要素に加えて、ステップを引数に指定することで、指定したステップ間隔で等差数列が生成されます。

for x in range(3,10,2):
    print(x)

出力結果

3
5
7
9

降順の生成も可能です。

for x in range(9,2,-2):
    print(x)

出力結果

9
7
5
3

range関数を利用したfor文の応用

range関数の便利な使用方法を紹介します。range関数で生成した連続整数値に加えて、文字列”Hello World"も合わせて出力するコードを記述します。

test_word = 'Hello World'

for x in range(5):
    print(x, test_word)

出力結果

0 Hello World
1 Hello World
2 Hello World
3 Hello World
4 Hello World

次に、range関数で生成した整数の出力は除き、range関数で指定した回数分の文字列のみを出力するコードに修正します。変数xをアンダースコア(_)に変更し、print関数の引数を文字列のみにすることで、range関数で指定した回数分の文字列のみが出力されます。

test_word = 'Hello World'

for _ in range(5):
    print(test_word)

出力結果

Hello World
Hello World
Hello World
Hello World
Hello World

Lesson 2 Chapter 9
break文とcontinue文とループのelse節

for文を使用した繰り返し処理中に、処理を途中で終了させたり、処理をスキップさせることが可能です。また、Chapter6のif文で利用したelse節がfor文でも使用可能なので、合わせて解説します。

break文を使用した繰り返し処理の中断方法

for文を使用した繰り返し処理において、ある条件の時のみfor文を終了させる場合には、「break文」を使用します。

以下のコードは、朝・昼・夕方・夜をそれぞれ出力する処理の中で、夕方の時はfor文を終了させます。

break_test.py
time_lst = ['morning','afternoon','evening','night']

for time in time_lst:
    if time == 'evening':
        break
    print(time)

出力結果

morning
afternoon

"evening"の時に、break文でfor文の繰り返し処理を途中終了させたので、"evening"と"night"は出力されていません。

continue文を使用した繰り返し処理のスキップ方法

「continue文」は、処理のスキップが可能です。夕方の時だけ出力処理をスキップさせます。

continue_test.py
time_lst = ['morning','afternoon','evening','night']

for time in time_lst:
    if time == 'evening':
        continue
    print(time)

出力結果

morning
afternoon
night

for文の処理は全て実行され"night"まで出力しましたが、"evening"のみcontinue文によって出力処理がスキップされています。

else節の使い方

「else節」は、for文の繰り返し処理が全て終了した後に実行されます。

else_test.py
time_lst = ['morning','afternoon','evening','night']

for time in time_lst:
    print(time)
else:
    print("the day is over")

出力結果

morning
afternoon
evening
night
the day is over

リスト内の要素、"morning"〜"night"までを全て出力した後に、「else節」以降の"the day is over"の出力処理が実行されています。

「break文」と「else節」を併用した場合は、break文で処理を終了させた時点でfor文の繰り返し処理全てが終了するため、else節も実行されません。以下のコードで動作を確認しましょう。

test.py
time_lst = ['morning','afternoon','evening','night']

for time in time_lst:
    if time == 'evening':
        print('go to dinner')
        break
    print(time)
else:
    print("the day is over")

出力結果

morning
afternoon
go to dinner

if文で判定した後にbreak文の記述があるため、"go to dinner"を出力後にfor文の処理全てが終了し、"the day is over"の出力処理は実行されていません。

Lesson 2 Chapter 10
pass文

プログラムを作成していくうえでは、あえて処理をさせたくない場合や、何かしらの処理を記述しないと文法上エラーとなってしまうことがあります。そのような時に必要となるのが、今回解説するpass文です。処理を飛ばすといった意味では、Chapter9で解説したcontinue文と同じではないかと思われるかもしれませんが、違いがあります。pass文の利用場面やcontinue文との違いについて理解を深めていきましょう。

pass文とは

pass文とは、文字通り"何もしない"文です。pass文を記述することで、読み飛ばすという処理が実行されます。

pass文の使い方

range関数を使用して、2の倍数の時のみ(2で割った余りが0)出力するコードで動作を確認しましょう。

pass_test.py
for x in range(10):
    if x % 2 == 0:
        print(x)
    else:
        pass

出力結果

0
2
4
6
8

2の倍数以外の時はelse節が処理されますが、pass文が記述されているため読み飛ばされています。

同じコードで、pass文のみを削除して実行してみます。

pass_test.py
for x in range(10):
    if x % 2 == 0:
        print(x)
    else:

出力結果

IndentationError: expected an indented block after 'else' statement on line 4

「IndentationError」が出力され、エラーとなりました。これはelse節には必ずコードを記述しなければいけないという、Pythonの文法上のルールがあるからです。このように、pass文は"何もしない"という処理を示すために使用します。

continue文との違い

Chapter9で学習したcontinue文とpass文は一見同じような処理ですが、continue文はそれ以降に記述された処理をスキップするのに対して、pass文は、それのみがスキップされるだけで、pass文以降の処理は実行されます。

少し分かりにくいので、実際の動作を確認して理解を深めましょう。まずは、continue文のコードです。

continue_test.py
time_lst = ['morning','afternoon','evening','night']

for time in time_lst:
    print(time)
    if time == 'evening':
        continue
        print('Chapter10')

出力結果

morning
afternoon
evening
night

次に、pass文のコードです。

pass_test.py
time_lst = ['morning','afternoon','evening','night']

for time in time_lst:
    print(time)
    if time == 'evening':
        pass
        print('Chapter10')

出力結果

morning
afternoon
evening
Chapter10
night

それぞれの出力結果を比較すると、違いが明らかになります。continue文の場合は、timeの値が"evening"の時に、"Chapter10"を出力することなく次の処理に遷移しています。pass文の場合は、あくまでpassのコードがスキップされたのみで、その後のprint関数による出力処理は実行されるので、"Chapter10"の出力が確認できます。

Lesson 2 Chapter 11
match文

Chapter6のif文では、50より大きい場合に文字列1を出力して、0の場合は文字列2を出力するといった条件式の複数利用を学びましたが、条件式で必要となるパターンが3つ、4つと多数になった場合、if文よりも効率的にプログラムを記述することが可能な構文に、match文があります。このChapterでは、パターンマッチによって処理を判別するmatch文について解説します。

match文とは

match文は、パターンにマッチするか否かによって処理を分岐する際に利用する構文です。match文は、Python3.10から追加された新機能です。Python3.9以前のバージョンでは使用不可です。

match文の使い方

match文を使用したコードと、そうでない場合のコードを比較しながら使い方について解説していきます。match文を使用しない場合でも、if〜elif〜else文を使用して同じ処理の記述が可能です。2つのコードを比較して、match文の優位性を解説します。まずは、match文を使用しないコードを記述します。

match1_test.py
time_lst = ['Morning','Afternoon','Evening','Night','Hello']

for time in time_lst:
    x = 'Good' + time
    if time == 'Morning':
        print(x)
    elif time == 'Afternoon':
        print(x)
    elif time == 'Evening':
        print(x)
    elif time == 'Night':
        print(x)
    else:
        print("GoodDay")

出力結果

GoodMorning
GoodAfternoon
GoodEvening
GoodNight
GoodDay

次に、match文を使用したコードです。パターン毎の処理を記述していきます。パターンにマッチしない場合は、caseにアンダースコア(_)を指定します。

match2_test.py
time_lst = ['Morning','Afternoon','Evening','Night','Hello']

for time in time_lst:
    x = 'Good' + time
    match time:
        case 'Morning':
            print(x)
        case 'Afternoon':
            print(x)
        case 'Evening':
            print(x)
        case 'Night':
            print(x)
        case _:
            print("GoodDay")

出力結果

GoodMorning
GoodAfternoon
GoodEvening
GoodNight
GoodDay

どちらも出力結果は同じになりますが、if〜elif〜else文で必要な「time ==」の記述がmatch文では不要となり、それぞれのパターンを順に記述するだけでよいため、コードが簡素になり可読性も向上しています。