Python range関数

Python学習【365日チャレンジ!】43日目のマスターU(@Udemy11)です。

いまさらながらですが、iPhoneのアプリやMacのアプリケーションってどのくらいのコードが積み重なってできているのか想像しただけでもそのコードを書いた人の凄さが感じられます。

何気なく使っているアプリは、今学習しているような単純な条件分岐がいくつも組み合わさってできてるわけで、さらにエラーが起こらないようにデバッグによるエラーチェックも必要不可欠です。

こういう作業をいろいろと考えていくと、アプリが完成するまでには大変な労力が費やされているんだろうな〜と改めて感心してしまいます。

以前学習させてもらった【世界一やさしいAndroidアプリ開発入門】講座では、最初に設計図をしっかり書くことが大切とありましたが、ほんと最初にしっかりとした地図を持っておかないと途中で挫折すること間違いなしです。

最終的にきちんとしたプログラムを書けるように、今日もコツコツと基礎基本の部分を学んでいきます!

昨日の復習

昨日は、for else文を学習しました。

if文やwhile文と違って、for文のループが最後まで実行されたあとに何かを出力したいときに使えるのがelse文です。

for name in ['Mike', 'Mark', 'Matt', 'Meg']:
    print(name)
else:
    print('I forgot first.')

出力結果

Mike
Mark
Matt
Meg
I forgot first.

for文ですべてのリストの出力が完了したあと、’I forgot first.’と出力して、ループを終了します。

break文でループを抜けるときは、else文は実行されませんが、continue文はループをスキップするものの、forループを完了するので、else文は実行されました。

for n in ['Mike', 'Mark', 'Matt', 'Meg']:
    if n == 'Matt':
        break
    print(n)
else:
    print('I forgot first.')
 
for n in ['Mike', 'Mark', 'Matt', 'Meg']:
    if n == 'Matt':
        continue
    print(n)
else:
    print('I forgot all.')

出力結果

Mike
Mark
Mike
Mark
Meg
I forgot all.

デバッグを使って、どのようにコードが実行されているのか確認しておけば、プログラミングのイメージがつかみやすくなるので、たまにはデバッグで動きを確認しましょう!

では、今日の学習、range関数に入りましょう。

range関数の使い方

普段エクセルを使う機会が多いので、range関数というと、セルの範囲に関係する関数なのかと思ってしまいます。

実際は、0から指定した値を取得する関数で、指定した値から値までを抽出したり、一つ飛ばしで数値を取得したりすることもできる関数です。

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

forループを使って、0から5までの数字を出力するコードを書くと上記のようになります。

出力結果

0
1
2
3
4
5

実際のプログラミングでこのようなコードを使うことはあまりないとは思いますが、このような場合、range関数を使えば、0から指定した値までの数値(index値)を取得できるので、次のように書くことができます。

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

index値を途中から取得したい場合は次のように記載します。

for i in range(2, 6):
    print(i)

出力結果

2
3
4
5

一つ飛びで取得したい場合は、最後に飛ばす数字を付け加えます。

for i in range(2, 6, 2):
    print(i)

出力結果

2
4

また、5回同じ文字を出力したい場合にindex値と合わせて出力することも可能です。

for i in range(5):
    print(i, 'Same')

出力結果

0 Same
1 Same
2 Same
3 Same
4 Same

index値は0から始まるので、リストのindexの値と実際の数字が違うと未だに頭がこんがらがってしまうことがあるのですが、range関数の場合は、5回繰り返したい場合は、そのまま5で大丈夫です。

出力される変数iのindex値は、0から始まり最後は4になるので、間違えないようにしましょう。

変数はアンダースコアで代用する

プログラミングの中では、rangeで使われるindex値は必要がないことがほとんどなので、index値を取得する変数を【_(アンダースコア)】で代用することがあるそうです。

for _ in range(5):
    print('Yes!')

出力結果

Yes!
Yes!
Yes!
Yes!
Yes!

コードの中に_(アンダースコア)が変数として指定されているときは、range関数で取得しているindex値を利用していないと理解しておきましょう。

逆順を取得するには

renge関数でindex値を取得できることは理解できたと思いますが、以前学習したリストのreverseメソッドを使えば、逆順のindex値を取得することが可能のように思えたので試してみました。

a = list(range(5))
a.reverse()
for i in a:
    print(i)

出力結果

4
3
2
1
0

最初は、一気に【list(range(5)).reverse()】と書いて、inのあとに入れてみたのですが、案の定エラーで【iterable(反復可能オブジェクト)】じゃないと起こられたので、変数aにリスト化したrange関数を代入してから、リスト型のreverseメソッドで逆順にしました。

できるにはできたのですが、もっと短いコードで書けないかと調べてみると、イテレータ※を返すreversed()関数というのがあったので、試してみました。
※イテレーター:繰り返し値を取り出すことのできるもの。詳細は【Python公式サイトの用語集】参照

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

出力結果

4
3
2
1
0

変数の代入とメソッドを使った逆順変換を省けたので、2行に収まりました。

試行錯誤してますか?

今回の逆順表示も過去に習った知識を活用しつつ、ネットを調べることでなんとか目的の結果にたどり着くことができました。

コードがうまく動かなかないときは、単純にparenthesの丸括弧を忘れていたり、コロンを付け忘れていたりすることが多いので、基本的なことを見直しましょう。

エラーには、何がだめなのか原因が記載されていて、単純なコードの間違いは【^(carret)】でその場所を指摘してくれています。

Python エラー警告

コードの書き方に問題がないのであれば、タイプが間違っているなど、表示されているエラーに答えが書かれているので、注意してエラーの文書を読んでみましょう。

英語が苦手な場合も、Google翻訳などを活用すれば、だいたい何が悪いのかわかるはずです。

エラーが起こったときに試行錯誤しながら、問題を解決できれば、次に同じようなエラーが起こったときもより速く解決方法にたどり着けるはずです。

好奇心にしたがって、どんどんコードを書いてみてください。

それでは、明日もGood Python!