Python演習3(応用)

if文と論理型

特定の状況によって命令を変えたい時、if文を使います。

まず、変数に値を代入します。

i = 2

以下のプログラムは、「もしiが2であれば"2desu"と表示する」ものです。

if i == 2:
    print("2desu")

このように、なにか条件を満たすときに処理を実行するのがif文です。if文は以下のように記述します。

if 論理式:
    命令1
    命令2
    ...

if文によって実行される命令は、「if文の中身」を表すために先頭に半角スペースを付けて区別します。これをインデントといいます。この例では半角スペースを4つつけています。

Warning

全角スペースは絶対に使わないでください。エラーになります。

論理式とは、TrueまたはFalseを返す式のことです。ifの後にあるi == 2は、よく見ると=が2つついています。これは、i2が等しいときにTrue(真)となる論理式です。そうでないときはFalseとなります。

つまり、論理式がTrueのときだけif文の中身が実行されるのです。

Tip

TrueFalseは論理を表す特別な名前なので、変数名には使えません。
ほかにも、予約語として使えない名前があります。
https://docs.python.org/3/reference/lexical_analysis.html?highlight=reserved#keywords

論理式の演算子には、==以外にも以下のようなものがあります。

演算子 結果
x < y xyより小さければTrue
x <= y xyより小さいか等しければTrue
x > y xyより大きければTrue
x >= y xyより大きいか等しければTrue
x == y xyの値が等しければTrue
x != y xyの値が等しくなければTrue

以下のプログラムは、「もしiが0より大きいなら"seinokazu"と表示する」ものです。

if i > 0:
    print("seinokazu")

Tip

論理型に対して、and, or, notを使った演算ができます。たとえば、(True or False) and (not False)Trueとなります。

課題

もしjが6未満なら、"6miman"と表示するプログラムを作成しましょう。jにいくつか値を入れて動作をテストしましょう。

課題

もしkが9以外なら、"9igai"と表示するプログラムを作成しましょう。kにいくつか値を入れて動作をテストしましょう。

if文の条件に当てはまらないときも別の処理をしたい場合、elifelseを使えます。

if 論理式1:
    命令...

elif 論理式2:
    命令...

elif 論理式3:
    命令...

...

else:
    命令...

elifはC言語のelse ifに相当します。その上までの論理式がFalseであり、その論理式がTrueのときに実行されます。

elseは、その上までの論理式がFalseのときに実行されます。

たとえば、変数が偶数か奇数かを表示するプログラムを作ります。

m = 11

if m % 2 == 0:
    print("even")
elif m % 2 == 1:
    print("odd")
else:
    print("not an integer")

コメント

Pythonでは、行の頭に#をつけると、その行はコメントアウトされ実行されなくなります。

プログラムの説明を書いたり、特定の命令を消して実行してみたいときに使います。

# If n > 2, print "n is bigger than 2"
n = 5
if n > 2:
    print("n is bigger than 2")

For文

プログラミングでは、同じ処理をデータを変えて、あるいは同じデータで繰り返し行いたい場合があります。そのようなときに使うのがFor文です。

試しに使ってみます。

for i in range(5):
    print("hello")

このプログラムは、

print("hello")
print("hello")
print("hello")
print("hello")
print("hello")

と同じ働きをします。

課題

"konnnichiwa"を10回表示するプログラムを作ってみましょう。

for文は、以下のように記述します。

for 変数 in イテラブルオブジェクト:
    処理
    処理
    ...

if文のときと同じように、for文の中の処理はインデントをつけます。

さて、耳馴染みのないイテラブルオブジェクト(iterable object)というのは、繰り返し可能な配列などのデータのことです。

先ほどの例ではrange(5)を使いましたが、これは0から4まで1ずつ増加する配列を作るための関数といえます。

この配列の要素が1つずつiに代入され、実行されます。

for i in range(5):
    print(i)

この例からも、iに順番に値が代入されていることが分かるでしょう。以下のプログラムはこれと同じ実行結果になります。

for i in [0, 1, 2, 3, 4]:
    print(i)

課題

2から10までの数字を1つ飛ばしで(2, 4, 6,...のように)表示するプログラムを書いてみましょう。いくつかの方法があります。

Tip

range()関数は、引数を1つとると、0からその引数の1つ前までの配列をつくるための関数です。

引数を2つとってrange(start, stop)とすると、startからstopの1つ前までの配列を作ります。

引数を3つとってrange(start, stop, step)とすると、startからstopの1つ前まで、step刻みの配列を作ります。

と、ここまで説明しておいて、実はrange()は配列を作っているわけではありません。考え方の便宜上そのように説明しています。

for文の中にif文を入れることもできます。その場合はさらにインデントをつけます。試しに、上の0から4を表示するプログラムを、「0から4のうち偶数だけを表示するプログラム」にしてみましょう。

for i in range(5):
    if i % 2 == 0:
        print(i)

次は、偶数のときはそのまま数を表示して、偶数でなければ"odd"と表示してみましょう。elseを使います。

for i in range(5):
    if i % 2 == 0:
        print(i)
    else:
        print("odd")

課題

1.1から30までの数字を画面に表示する
2.数字が3の倍数のときは数字の代わりに"Fizz"と表示する

プログラムを作成してください。

課題

(この課題は難しいため、全部の課題が終わってから取り組んでください)

1.1から100までの数字を画面に表示する
2.数字が3の倍数のときは数字の代わりに"Fizz"と表示する
3.数字が5の倍数のときは数字の代わりに"Buzz"と表示する
4.数字が3の倍数かつ5の倍数のときは数字の代わりに"FizzBuzz"と表示する

プログラムを作成してください。

この課題はFizzBuzzと呼ばれる有名なものです。ifやforといった基礎的なプログラミングの実力を持っているか試す良い問題です。FizzBuzzができれば、「プログラミング勉強中です!」と胸を張って言える実力があるでしょう。

関数

ここまで、みなさんは色々なプログラムを書きました。

その中で、print()type()に着目すると、これらの命令は処理(処理の対象データ)という形式で書かれていることに気付いたでしょうか。

こうした命令を関数といいます。かっこの中に入るデータを引数といいます。関数は、引数(ない場合もあります)を受け取って、それを使って何か一連の処理をしているものといえます。

たとえばtype(3)を実行すると、戻り値として<class 'int'>が返されます。これによって、関数を呼び出した元のプログラムに値を返すことができます。

a = type(3)
print(a)

type(3)を実行すると、関数が呼び出されて処理が行われます。そのあと、もとのプログラムに<class 'int'>という戻り値が返され、aにそれが代入されます。 戻り値は変数に代入せず使うこともできます。

print(type(3))

print()の戻り値を使っていないことに気が付きましたか?それぞれの関数によって、戻り値がないことや、あっても処理の都合で使わないこともあります。

課題

print(max(2, 5, 8)) はどんな動作をするでしょうか?max(n1, n2, ...)は引数の中で最も大きな値を返します。

関数の自作

関数は自分で作る(定義する)こともできます。たとえば、2つの数字を引数として受け取って合計を戻り値とするプログラムを作ってみましょう。

def mysum(a, b):
    c = a + b
    return c

関数の定義は

def 関数名(引数):
    処理1
    処理2 
    ...

    return 戻り値

という形式で書きます。

関数の中身がどこまでかを示すために、ifやforと同じくインデントをつけます。

同じプログラムで定義した関数は、定義の後(下)で使えるようになります。使ってみましょう。

a = mysum(3, 5)
print(a)

課題

3つの数字を引数として受け取り、合計を戻り値とするプログラムを作って動作を確認しましょう。

ここまでで、これからの演習の基礎となるPythonをマスターしました!課題などを繰り返し行い、言語に慣れていきましょう。

参考文献

ここで紹介したPythonの構文は、仕様のほんの一部です。さらに深くPythonを知ることで、もっと多くのことができるようになるでしょう。理解を深めたい皆さんのために参考文献を紹介します。

個別の関数の使い方はリファレンスでチェックしましょう。ちょっと分かりにくいかもしれませんが、正確に関数の機能を知ることができます。ネットにあるコード例と照らし合わせて確認するのが良いでしょう。

最速でひととおりのPython, NumPy, matplotlibの仕様を知ることができます。1週間くらいで一気にマスターしてしまえると思います。

Google Colabというサービスを使って、プログラミング以外の余計なことをなるべく考えずにPythonを学習できます。書籍以外でしっかりチュートリアルしたいならこれが一番良いと思います。

また、いろいろな書籍が図書館にあります。適当に手にとってみて、実際にコードを試してみてください。