見出し画像

Python基礎4:ループ処理(for文, while文)

概要

 Pythonの基礎として繰り返し処理(ループ計算)を説明をします。

1.回数を指定したループ処理:For文

1-1.イテラブル(オブジェクト)とは

 For文を学習すると初めに”for <変数> in <イテラブルオブジェクト>”という説明がでてきます。
 イテラブル(オブジェクト)とは”For文などでループ処理できるやつ/値が分離できるやつ”くらいに考えれば問題なく使用できます。参考としてイテラブルとして扱えるオブジェクトは下記があります。

  • 文字列

  • リスト、タプル

  • 辞書

  • 関数で作成するオブジェクト(range()など)

1-2.イテラブルの単位取得:iter()/next()

 イテラブルは通常ループ処理で要素を取得できますが、iter()とnext()を使うことで1個ずつ取得が可能です。
 iter(<イテラブル>)でオブジェクトが出力され、next(<オブジェクト>)で処理すると各要素が順番に出力されます。要素数だけ処理すると最後は”StopIteration”エラーが発生します。

[IN]
nums = [1,2,3,4,5]

num = iter(nums)
print(num)
print(next(num))

[OUT]
<list_iterator object at 0x000001BC95D41370>
1

1-3.For文の基礎構文

 For文の構文は下記の通りです。ポイントは下記の通りです。

  • 変数の名前は自由につけてよいが可読性をあげるためにイテラブルの変数名が複数の場合は単数で命名する

  • forを改行した後はインデントを空ける

[For文の基礎構文]
for <変数> in iterable:
    <処理>

 実際に動くサンプルコードを記載すると下記の通りです。

[IN]
digits = [0, 1, 2, 3] #List

for digit in digits:
    print(digit)

[OUT]
0
1
2
3

1-4.For文でのelse

 (私は普段使用はしませんが、)for文の処理が終わった後に1回だけ処理を加えたい場合はelseを記載します。

[IN]
digits = [0, 1, 2, 3] #List

for digit in digits:
    print(digit)
else:
    print('for文の処理が終わりました')

[OUT]
0
1
2
3
for文の処理が終わりました

1-5.ループ処理の中断:break

 For文を途中で中断したい場合はbreakを使用します。例えばfor文の中にif文があり「特定条件になったらループを止めたい」場合などで使用します。

[IN]
digits = [0, 1, 2, 3] #List

for digit in digits:
    print(digit)
    break

[OUT]
0

 下記のように"for <var> in <iterable>: break"とすることでイテラブルの最初の値だけ抽出することも可能です(次節の通りスコープには注意)。

[IN]
digits = [0, 1, 2, 3] #List

for digit in digits: break

print(digit)

[OUT]
0

1-6.for文のスコープ

 スコープとは変数が利用できる範囲です。for文内の変数はグローバル変数扱いとなるため他の場所で定義した変数に影響を与えます。

[IN]
digit = 'digit初期値'
digits = [0, 1, 2, 3] #List

print('for文前',digit, digits)

for digit in digits:
    print(digit)
    
print('for文後',digit, digits) #digitはfor文の変数で使用しているため上書きされる

[OUT]
for文前 digit初期値 [0, 1, 2, 3]
0
1
2
3
for文後 3 [0, 1, 2, 3]

2.For文で使用する組み込み関数

 For文でよく使用される組み込み関数を紹介します。組み込み関数の意味に関しては下記記事をご確認ください。

2-1.指定した回数をループ:range()

 指定した回数ループしたい場合はrange(<int>)関数を使用します。1つの整数だけ指定した場合、変数に入る値は0~(指定値-1)となります。
 最初は違和感を感じますが出力値ではなくループ回数を指定していると考えれば腑に落ちると思います。

[IN]
for i in range(3):
    print(i)

[OUT]
0
1
2

 変数の初期値を指定するなら”range(<初期値>, <終り値+1>)”とします。

[IN]
for i in range(1, 3):
    print(i)

[OUT]
1
2

2-2.ループのindex番号を追加:enumerate()

 For文を処理する時にindex番号(何番目の値か)が欲しい場合があります。その時はenumerate(<iterable>)関数を使用します。出力として(<index>, <値>)のタプルで出力されるため変数を2つ記載します。

[IN]
words = ['apple', 'banana', 'orange']

for idx, word in enumerate(words):
    print(idx, word)

[OUT]
0 apple
1 banana
2 orange

2-3.複数イテラブルをループ処理:zip()

 複数のイテラブルをまとめてループ処理したい場合はzip()関数を使用します。zip()の出力はイテラブルオブジェクトのためfor文で値を取得できます。

[IN]
items = ['apple', 'banana', 'orange']
prices = [100, 200, 300]

print(zip(prices, items)) #zipオブジェクト

for price, item in zip(prices, items):
    print(price, item)

[OUT]
<zip object at 0x000002C5C66B8F40>

100 apple
200 banana
300 orange
[IN]
items = ['apple', 'banana', 'orange']
prices = [100, 200, 300]
areas = ['Aomori', 'Chiba', 'Tokyo']

for price, item, area in zip(prices, items, areas):
    print(price, item, area)

[OUT]
100 apple Aomori
200 banana Chiba
300 orange Tokyo

 イテラブルの数が異なる場合は一番短いものに合わせて出力されます。最長のイテラブルに合わせたい場合は”itertools”の"zip_longest"関数を指定します。

[IN]
for price, item, area in zip(prices, items, areas):
    print(price, item, area)

[OUT]
100 apple Aomori
[IN]
from itertools import zip_longest
for price, item, area in zip_longest(prices, items, areas, fillvalue='fill'):
    print(price, item, area)

[OUT]
100 apple Aomori
200 banana fill
fill orange fill

3.イテレータ生成関数:組み込み関数

 For文で使用できるイテラブルオブジェクトを生成する関数を紹介します。なお前述のzip()関数もこの関数に該当します。

3-1.練習用問題:FizzBuzz

 練習問題としてFizzBuzz問題を解いていきます。ルールは「3の倍数なら「Fizz」、5の倍数なら「Buzz」、両方の倍数(15の倍数)なら「Fizz Buzz」、いずれでもなければその数を言う」です。

 まずはFor文で出力させてみましょう。

[IN]
#FizzBuzz問題
for i in range(1, 101):
    if i%15 == 0:
        print('FizzBuzz')
    elif i%3 == 0:
        print('Fizz')
    elif i%5 == 0:
        print('Buzz')
    else:
        print(i)

[OUT]
1, 2, 'Fizz', 4, 'Buzz', 'Fizz', 7, 8, 'Fizz', 'Buzz', 11, 'Fizz', 13, 14, 'FizzBuzz',
16, 17, 'Fizz', 19, 'Buzz', 'Fizz', 22, 23, 'Fizz', 'Buzz', 26, 'Fizz', 28, 29, 'FizzBuzz', 
31, 32, 'Fizz', 34, 'Buzz', 'Fizz', 37, 38, 'Fizz', 'Buzz', 41, 'Fizz', 43, 44, 'FizzBuzz', 46,
47, 'Fizz', 49, 'Buzz', 'Fizz', 52, 53, 'Fizz', 'Buzz', 56, 'Fizz', 58, 59, 'FizzBuzz', 61,
62, 'Fizz', 64, 'Buzz', 'Fizz', 67, 68, 'Fizz', 'Buzz', 71, 'Fizz', 73, 74, 'FizzBuzz', 76,
77, 'Fizz', 79, 'Buzz', 'Fizz', 82, 83, 'Fizz', 'Buzz', 86, 'Fizz', 88, 89, 'FizzBuzz', 91,
92, 'Fizz', 94, 'Buzz', 'Fizz', 97, 98, 'Fizz', 'Buzz'

 これをシンプルに関数化して戻り値を取得しようすると関数内でreturnがかかった時点で処理が終わるため最初の数値しか得られません。

[IN]
def FizzBuzz(num=101):
    for i in range(1, num):
        if i%15 == 0:
            return 'FizzBuzz'
        elif i%3 == 0:
            return 'Fizz'
        elif i%5 == 0:
            return 'Buzz'
        else:
            return i

print(FizzBuzz(num=101))

[OUT]
1

 これを解消する場合は①空リスト作成、②Fob文でFizzBuzz化した値をリストに格納、③リストを出力 することで対応可能です。ただしリストに多くの値を保持するのはメモリ容量を使うため非効率※です。こちらの解消法としてジェネレーターがあります。
※最近のPCスペックは高く、初心者の頃は大容量のデータを扱うことがないため気になりませんが学んでいくほどメモリ問題にはぶつかります。

[IN]
def num2FizzBuzz(num):
    if num%15 == 0:
        return 'FizzBuzz'
    elif num%3 == 0:
        return 'Fizz'
    elif num%5 == 0:
        return 'Buzz'
    else:
        return num
    
def FizzBuzzbynum(num=101):
    output = []
    for i in range(1, num):
        output.append(num2FizzBuzz(i))
    return output

nums = FizzBuzzbynum(num=101)

print('変数のメモリ:',nums.__sizeof__())

[OUT]
[1, 2, 'Fizz', 4, 'Buzz', 'Fizz', 7, 8, 'Fizz', 'Buzz', 11, 'Fizz', 13, 14, 'FizzBuzz', 16, 17, 'Fizz', 19, 'Buzz', 'Fizz', 22, 23, 'Fizz', 'Buzz', 26, 'Fizz', 28, 29, 'FizzBuzz', 31, 32, 'Fizz', 34, 'Buzz', 'Fizz', 37, 38, 'Fizz', 'Buzz', 41, 'Fizz', 43, 44, 'FizzBuzz', 46, 47, 'Fizz', 49, 'Buzz', 'Fizz', 52, 53, 'Fizz', 'Buzz', 56, 'Fizz', 58, 59, 'FizzBuzz', 61, 62, 'Fizz', 64, 'Buzz', 'Fizz', 67, 68, 'Fizz', 'Buzz', 71, 'Fizz', 73, 74, 'FizzBuzz', 76, 77, 'Fizz', 79, 'Buzz', 'Fizz', 82, 83, 'Fizz', 'Buzz', 86, 'Fizz', 88, 89, 'FizzBuzz', 91, 92, 'Fizz', 94, 'Buzz', 'Fizz', 97, 98, 'Fizz', 'Buzz']

変数のメモリ: 888

3-2.高メモリ効率イテラブル:Generator

 関数で"return"ではなく”yield”を使用することでリストやタプルのようなイテラブルなオブジェクトを作成できます。このイテラブルをジェネレータと呼びます(詳細は下記記事参照)。特徴として下記があります。

  • リストやタプルはすべての要素をメモリ上に保持するが、ジェネレータは”処理ごとに新しく要素を生成して返す”ためメモリ使用量が小さい

  • メモリに乗せないため無限ループ関数も簡単に作成可能(リストやタプルでは不可能)

[IN]
import random
def infiniteroop():
    while True:
        yield random.randint(1,100)
        
for _ in infiniteroop():
    print(_)

[OUT]
無限に1~100の整数である乱数値を生成※実行した場合は手動で中断が必要
1
79
39
92

 FizzBuzz関数をジェネレータで作成すると下記の通りになります。

  • 関数をインスタンス化したときに生成される出力値は”ジェネレータ”である(通常の関数だと戻り値として数値などが生成される)

  • ジェネレータオブジェクトのメモリサイズは前のリストより小さい

  • ジェネレータはイテラブルのためfor文などで値の生成が可能である

[IN]
def FizzBuzzGenerator(num=101):
    for i in range(1, num):
        if i%15 == 0:
            yield 'FizzBuzz'
        elif i%3 == 0:
            yield 'Fizz'
        elif i%5 == 0:
            yield 'Buzz'
        else:
            yield i
        
fizzbuzzgen = FizzBuzzGenerator(num=101)
print(fizzbuzzgen)
print('変数のメモリ:',fizzbuzzgen.__sizeof__())

for i in fizzbuzzgen:
    print(i)

[OUT]
変数のメモリ: 96

1, 2, 'Fizz', 4, 'Buzz', 'Fizz', 7, 8, 'Fizz', 'Buzz', 11, 'Fizz', 13, 14, 'FizzBuzz',
16, 17, 'Fizz', 19, 'Buzz', 'Fizz', 22, 23, 'Fizz', 'Buzz', 26, 'Fizz', 28, 29, 'FizzBuzz', 
31, 32, 'Fizz', 34, 'Buzz', 'Fizz', 37, 38, 'Fizz', 'Buzz', 41, 'Fizz', 43, 44, 'FizzBuzz', 46,
47, 'Fizz', 49, 'Buzz', 'Fizz', 52, 53, 'Fizz', 'Buzz', 56, 'Fizz', 58, 59, 'FizzBuzz', 61,
62, 'Fizz', 64, 'Buzz', 'Fizz', 67, 68, 'Fizz', 'Buzz', 71, 'Fizz', 73, 74, 'FizzBuzz', 76,
77, 'Fizz', 79, 'Buzz', 'Fizz', 82, 83, 'Fizz', 'Buzz', 86, 'Fizz', 88, 89, 'FizzBuzz', 91,
92, 'Fizz', 94, 'Buzz', 'Fizz', 97, 98, 'Fizz', 'Buzz'

3-3.文字列の結合:str.join()

 イテラブルな文字列に対して各要素の間に指定の文字列を追加できます。

[IN]
words = ['apple', 'banana', 'orange']

'&'.join(words)

[OUT]
'apple&banana&orange'

3-4.イテラブル要素の並び替え:sorted()

 イテラブルな要素を並び替え(出力もイテラブルのまま)する関数としてsorted()があります。引数を指定することで逆順も可能です。

[IN]
import random 
random.seed(0) #乱数のシードを固定

nums = [random.randint(1, 100) for i in range(10)] #[50, 98, 54, 6, 34, 66, 63, 52, 39, 62]
print(nums)

nums_sorted = sorted(nums)
nums_sortedrev = sorted(nums, reverse=True)
print(nums_sorted)
print(nums_sortedrev)

[OUT]
[50, 98, 54, 6, 34, 66, 63, 52, 39, 62]
[6, 34, 39, 50, 52, 54, 62, 63, 66, 98]
[98, 66, 63, 62, 54, 52, 50, 39, 34, 6

 もし文字列と数値が混在するリストを並び替えようとするとエラーが発生するため、key引数×lambda式を指定することで対応できます。

[IN]
nums_mixed = [2, 5,'1', '4', 3, 7]
sorted(nums_mixed)

[OUT]
TypeError: '<' not supported between instances of 'str' and 'int'
[IN]
nums_mixed = [2, 5,'1', '4', 3, 7]
sorted(nums_mixed, key=lambda x: int(x))

[OUT]
['1', 2, 3, '4', 5, 7]

3-5.条件抽出:filter()

 指定した条件の値を抽出する場合は"filter(<条件式>,<イテラブル>)"を使用します。
 出力はオブジェクトのためlistへの変換やfor文などで値を取得できます。

[IN]
import random 
random.seed(0) #乱数のシードを固定

nums = [random.randint(1, 100) for i in range(10)] #[50, 98, 54, 6, 34, 66, 63, 52, 39, 62]

nums_big = filter(lambda x: x>=60, nums)
print(nums_big)
list(nums_big)

[OUT]
<filter object at 0x000001BC983A5CA0>
[98, 66, 63, 62]

3-6.関数処理の追加:map()

 指定した関数式をイテラブルの要素に適用させる場合は"map(<関数式>,<イテラブル>)"を使用します。
 出力はオブジェクトのためlistへの変換やfor文などで値を取得できます。

[IN]
nums = [1,2,3,4,5]

nums_10x = map(lambda x: x*10, nums)
print(nums_10x)
print(list(nums_10x))

[OUT]
<map object at 0x000001BC983A5FD0>
[10, 20, 30, 40, 50]

 map関数は複数のイテラブルを渡すことが出来ます(数は同じ必要がある)。サンプルとして①2つのListの文字列を”=”で結合、②間に"&"を加えることでクエリパラメータを作成可能です。

[IN]
args = ['dmmref', 'i3_ref', 'i3_ord', 'i3_pst']
values = ['midv00192', 'detail', '1', 'info_actress']

querys = map(lambda x, y: f'{x}={y}', args, values)
querys = list(querys)
print(querys)

queryparams = '&'.join(querys)
print('?'+queryparams)

[OUT]
['dmmref=midv00192', 'i3_ref=detail', 'i3_ord=1', 'i3_pst=info_actress']
?dmmref=midv00192&i3_ref=detail&i3_ord=1&i3_pst=info_actress

4.イテレータ生成関数:itertools

 前述の組み込み関数とは別によりループ処理で複雑な出力が出せる関数としてitertoolsがあります。本章ではこちらの機能の一部を紹介します。

4-1.組合せイテレータ:itertools.product()

 4-1-1.シンプルな使用方法

 ネスト構文は下記のようにFor文を重ねたものであり可読性が低いです。ネスト構文をシンプルに記載できる関数としてproduct()があります。

[IN]
nums = [1,2,3]
output1 = []

for i in nums:
    for j in nums:
        for k in nums:
            output1.append((i,j,k))

print(output1)

[OUT]
※3×3×3=27パターンの出力がでる

[(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 1), (1, 3, 2), (1, 3, 3),
(2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3),
(3, 1, 1), (3, 1, 2), (3, 1, 3), (3, 2, 1), (3, 2, 2), (3, 2, 3), (3, 3, 1), (3, 3, 2), (3, 3, 3)]

 productの引数:repeatに繰り返し回数を指定すれば$${イテラブル数^{repeat数}}$$分の出力が生成されます。

[IN]
from itertools import product

nums = [1,2,3]
output2 = []

for i in product(nums, repeat=3):
    output2.append(i)
    
print(output2)

[OUT]  ※上記と同じ出力
[(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 1), (1, 3, 2), (1, 3, 3), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 1, 1), (3, 1, 2), (3, 1, 3), (3, 2, 1), (3, 2, 2), (3, 2, 3), (3, 3, 1), (3, 3, 2), (3, 3, 3)]

 例えばですがジェネレータ関数×productを使えば簡単に6桁の数値を全種類作成することも可能です。

 4-1-2.itertools.productの応用:組合せ

 itertools.productを応用することで組合せ候補を簡単に作成することが出来ます。

【複数のリストの組み合わせ】
 複数のリスト間は一度すべてをListかTupleにまとめてproduct()で処理することで全組合せを出力できます。product(<lists>)だと出力はジェネレータのためlist()メソッドで処理することでListとして受け取れます。

$$
全組合せ=\prodリスト内の候補数
$$

[IN]
a = [1, 2]
b = [3, 4]
c = [5, 6, 7]
combs = list(product(a, b, c))
print(f'Type: {type(combs)}, Length: {len(combs)}')
combs

[OUT]
Type: <class 'list'>, Length: 12

[(1, 3, 5),
 (1, 3, 6),
 (1, 3, 7),
 (1, 4, 5),
 (1, 4, 6),
 (1, 4, 7),
 (2, 3, 5),
 (2, 3, 6),
 (2, 3, 7),
 (2, 4, 5),
 (2, 4, 6),
 (2, 4, 7)]

 一度リスト化してproduct()に渡す場合の注意点として"*args"で渡すこと。直接渡すとリストを1個の変数として認識するため1パターンのみしか出力されない

[IN]
a = [1, 2]
b = [3, 4]
c = [5, 6, 7]
datas = [a,b,c]
combs = list(product(datas))
combs

[OUT]
[([1, 2],), ([3, 4],), ([5, 6, 7],)]
[IN]
a = [1, 2]
b = [3, 4]
c = [5, 6, 7]
datas = [a,b,c]
combs = list(product(*datas))
combs

[OUT]
[(1, 3, 5),
 (1, 3, 6),
 (1, 3, 7),
 (1, 4, 5),
 (1, 4, 6),
 (1, 4, 7),
 (2, 3, 5),
 (2, 3, 6),
 (2, 3, 7),
 (2, 4, 5),
 (2, 4, 6),
 (2, 4, 7)]

【複数の組合せの組み合わせ】
 リストからproduct()で作成した組合せをさらに組み合わせることで候補を作成することもできます。

$$
全組合せ=2^2\times2=8通り
$$

[IN]
a = [1, 2]
b = [3, 4]
a_rep2 = list(product(a, repeat=2))
print(f'(product(a, repeat=2):', a_rep2)
combs = list(product(a_rep2, b))
print(f'Type: {type(combs)}, Length: {len(combs)}')
print(combs)

[OUT]
(product(a, repeat=2): [(1, 1), (1, 2), (2, 1), (2, 2)]
Type: <class 'list'>, Length: 8
[((1, 1), 3), ((1, 1), 4), ((1, 2), 3), ((1, 2), 4), ((2, 1), 3), ((2, 1), 4), ((2, 2), 3), ((2, 2), 4)]

 組合せ同士を複合すると候補数が急激に増えます。

$$
全組合せ=2^3\times 2 \times 3^2=144通り
$$

[IN]
import numpy as np
a = [1, 2]
b = [3, 4]
c = [5, 6, 7]

a_rep3 = list(product(a, repeat=3))
c_rep2 = list(product(c, repeat=2))
print(f'(product(a, repeat=3):', a_rep3)
print(f'(product(c, repeat=2):', c_rep2)
datas = [a_rep3,b,c_rep2]
combs = list(product(*datas))
print(f'Type: {type(combs)}, Length: {len(combs)}')
print(np.array(combs))

[OUT]
(product(a, repeat=3): [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]
(product(c, repeat=2): [(5, 5), (5, 6), (5, 7), (6, 5), (6, 6), (6, 7), (7, 5), (7, 6), (7, 7)]
Type: <class 'list'>, Length: 144
[[(1, 1, 1) 3 (5, 5)]
 [(1, 1, 1) 3 (5, 6)]
 [(1, 1, 1) 3 (5, 7)]
 [(1, 1, 1) 3 (6, 5)]
 [(1, 1, 1) 3 (6, 6)]
 [(1, 1, 1) 3 (6, 7)]
 [(1, 1, 1) 3 (7, 5)]
 [(1, 1, 1) 3 (7, 6)]
 [(1, 1, 1) 3 (7, 7)]
 [(1, 1, 1) 4 (5, 5)]
 [(1, 1, 1) 4 (5, 6)]
 [(1, 1, 1) 4 (5, 7)]
 [(1, 1, 1) 4 (6, 5)]
 [(1, 1, 1) 4 (6, 6)]
 [(1, 1, 1) 4 (6, 7)]
 [(1, 1, 1) 4 (7, 5)]
 [(1, 1, 1) 4 (7, 6)]
 [(1, 1, 1) 4 (7, 7)]
 [(1, 1, 2) 3 (5, 5)]
 [(1, 1, 2) 3 (5, 6)]
 [(1, 1, 2) 3 (5, 7)]
 [(1, 1, 2) 3 (6, 5)]
...
 [(2, 2, 2) 4 (6, 7)]
 [(2, 2, 2) 4 (7, 5)]
 [(2, 2, 2) 4 (7, 6)]
 [(2, 2, 2) 4 (7, 7)]]

5.条件を指定したループ処理:While

5-1.基礎構文

 For文はループ回数やイテラブルオブジェクトを指定しましたが、While文では”条件式”で判定させてFalseになるまでループ演算を行います。

[While構文]
while <条件式>:
    <処理>

  参考コードとしては下記の通りです。Trueの状態ではループが続いていることが確認できます。

[IN]
i = 0
while i<3:
    print(i, i<3)
    i += 1

[OUT]
0 True
1 True
2 True

 条件式はif文と同じ考え方のため下記のような条件式はすべてTrue扱いとなります。

[IN ※サンプルコード:すべて無限ループになります。]
while True:
    print('while文の処理')
    
while 1:
    print('while文の処理')
    
while 'A': #空文字でなければ何でもOK
    print('while文の処理')
    
while [1,2]: #空リストでなければ何でもOK
    print('while文の処理')
    
[OUT]
while文の処理 という文字列が無限に生成

5-2.while文でのelse

 elseを追加すると処理が終わった最後の1回のみ追加処理を実施します。

[IN]
i = 0
while i<3:
    print(i, i<3)
    i += 1
else:
    print('while文の処理が終わりました')

[OUT]
0 True
1 True
2 True
while文の処理が終わりました

5-3.ループ処理の中断:break

 ループ処理を中断したい場合は"break"を使用します。if文などの合わせて特定条件下でループ中断などが可能です。

[IN]
i = 0
while i<3:
    print(i, i<3)
    i += 1
    break
else:
    print('while文の処理が終わりました')

[OUT]
0 True

5-4.ループ処理のスキップ:continue

 特定の処理だけスキップしたい場合はcontinue文を使用します。

[IN]
i = 0
while i<10:
    if i%2 == 0:
        i += 1 #これがないとcontinueより下の処理がされないため無限ループになる
        continue #偶数の場合は処理をスキップ
    print(i, i<3)
    i += 1

[OUT]
1 True
3 False
5 False
7 False
9 False

参考資料

あとがき

 For文ごとき自分で調べれば十分だから記事に落とし込む必要がないと思っていた自分が恥ずかしい。
 やっぱり基礎のところは重要ということに改めて思い知らされました。



この記事が気に入ったらサポートをしてみませんか?