通常のrangeの使い方
Pythonにおいてfor文で1から10までループさせて処理をする場合、range関数を使い”range(10)”としたくなりますが、上手くいきません。
#1 rangeによるforループ
print('range(10)')
for i in range(10):
print(i, end=' ')
print('\n', 'range(1, 11)')
for i in range(1, 11):
print(i, end=' ')
print('\n', 'range(1, 10,2)')
for i in range(1, 10, 2):
print(i, end=' ')
range(10)
0 1 2 3 4 5 6 7 8 9
range(1, 11)
1 2 3 4 5 6 7 8 9 10
range(1, 10,2)
1 3 5 7 9
3行目のようにrange(10)とすると0から9までのループになってしまいます。1から10というようにする場合はrange(1,11)というように「まで」の2つ目の引数を11と+1する必要があります。また、1,3,5,7,9というように2ずつ増えるようにしたい場合は、3つ目の引数に2のように増やしたい値を指定します。
range関数で逆にループする
次に、10,9,8・・・1というように逆にループを回したい場合は、次のよういくつかの方法があります。
#2 rangeによる逆forループ
print('range(10, 0, -1))')
for i in range(10, 0, -1):
print(i, end=' ')
print('\n', 'reversed(range(10)')
for i in reversed(range(10)):
print(i, end=' ')
print('\n', 'range(10)[::-1]')
for i in range(10)[::-1]:
print(i, end=' ')
range(10, 0, -1))
10 9 8 7 6 5 4 3 2 1
reversed(range(10)
9 8 7 6 5 4 3 2 1 0
range(10)[::-1]
9 8 7 6 5 4 3 2 1 0
3行目のように、range(10, 0, -1)というように3つ目の引数を-1とすると10から1までのループになります。2つ目の引数を0というように終点-1とする必要があり、個人的にはしっくりしません。そこで、6行目のようにrange(10)にreserved関数を適用します。range関数の内容を単純に反転させてくれるので、すっきりすると思います。また、reserved関数は覚えずらいので、スライスで[::-1]とすると、リストの中身は反転します。
reversed関数と間違えやすいreserveメソッド
前節でreserved関数は覚えずらいとしたのは、よく似たものとしてreserveメソッドという曲者があるためです。
#3 reverseメソッド
r =range(10)
print(r)
l=[i for i in r]
print(l)
l.reverse()
print(l)
l.reverse()
print(l)
range(0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
まず、前提としてrange(10)をrという変数に代入して中身を確認すると、”range(0,10)”となりリストではなく”0から9までの数列”ということを言っています。これ対し、リスト内包表記を使いリストに変換してlという変数に代入すると、0,1,2・・・9というように数字が入ったリストになります。これにreserveメソッドを適用して中身を見ると、リストは反転しています。リストの中身が変わってしまうので注意が必要です。ちなみに、もう一度reserveメソッドを適用すると元に戻ります。
まとめ
階乗を計算するときなど、forループを反転させる必要があるときにはミスをしやすくなるので注意が必要です。また、リスト内包表記については別に考えます。