<jupyter_start><jupyter_text>演習問題  画像サイズ<jupyter_code>input_msg = "画像サイズを入力してください: "
while True:
    img_size_str = input(input_msg)
    # 次回以降の入力はエラーのときなのでメッセージを更新
    input_msg = "画像サイズが不正です。もう一度入力してください: "
    # 画像サイズを' 'で分解
    img_size_str = img_size_str.split(" ")

    # 画像サイズをチェック
    if len(img_size_str) != 2:
        # エラーのときはwhileの先頭に戻る
        continue

    # numpyを使って数字であるかどうかをチェック
    import numpy as np
    if not all(np.char.isnumeric(img_size_str)):
        continue

    img_size = np.array(list(map(int, img_size_str)))
    if not all(img_size > 0):
        continue
    break<jupyter_output>画像サイズを入力してください:  -10 1
画像サイズが不正です。もう一度入力してください:  10 -10
画像サイズが不正です。もう一度入力してください:  0 10
画像サイズが不正です。もう一度入力してください:  10 0
画像サイズが不正です。もう一度入力してください:  200 500<jupyter_text>ブロックサイズ<jupyter_code>input_msg = "block_sizeを入力してください: "
while True:
    block_size_str = input(input_msg)
    # 次回以降の入力はエラーのときなのでメッセージを更新
    input_msg = "block_sizeが不正です。もう一度入力してください: "
    
    if not np.char.isnumeric(block_size_str):
        continue

    if int(block_size_str) <= 0:
        continue

    block_size = int(block_size_str)
    break

print("画像サイズ: {0[0]}x{0[1]}、block_size: {1}".format(img_size, block_size))<jupyter_output>block_sizeを入力してください:  -10
block_sizeが不正です。もう一度入力してください:  0
block_sizeが不正です。もう一度入力してください:  10<jupyter_text>ズルく見えるので、関数化してまとめて実行します<jupyter_code>def input_img_block_size():
    input_msg = "画像サイズを入力してください: "
    while True:
        img_size_str = input(input_msg)
        # 次回以降の入力はエラーのときなのでメッセージを更新
        input_msg = "画像サイズが不正です。もう一度入力してください: "
        # 画像サイズを' 'で分解
        img_size_str = img_size_str.split(" ")

        # 画像サイズをチェック
        if len(img_size_str) != 2:
            # エラーのときはwhileの先頭に戻る
            continue

        # numpyを使って数字であるかどうかをチェック
        import numpy as np
        if not all(np.char.isnumeric(img_size_str)):
            continue

        img_size = np.array(list(map(int, img_size_str)))
        if not all(img_size > 0):
            continue
        break

    input_msg = "block_sizeを入力してください: "
    while True:
        block_size_str = input(input_msg)
        # 次回以降の入力はエラーのときなのでメッセージを更新
        input_msg = "block_sizeが不正です。もう一度入力してください: "

        if not np.char.isnumeric(block_size_str):
            continue

        if int(block_size_str) <= 0:
            continue

        block_size = int(block_size_str)
        break

    print("画像サイズ: {0[0]}x{0[1]}、block_size: {1}".format(img_size, block_size))
input_img_block_size()
input_img_block_size()<jupyter_output>画像サイズを入力してください:  -10 1
画像サイズが不正です。もう一度入力してください:  abc
画像サイズが不正です。もう一度入力してください:  def hij
画像サイズが不正です。もう一度入力してください:  200 50ab
画像サイズが不正です。もう一度入力してください:  20abc 20bc
画像サイズが不正です。もう一度入力してください:  200 500
block_sizeを入力してください:  10ab
block_sizeが不正です。もう一度入力してください:  abc
block_sizeが不正です。もう一度入力してください:  10 20
block_sizeが不正です。もう一度入力してください:  10 
block_sizeが不正です。もう一度入力してください:  10<jupyter_text>発展問題見づらいので関数化してから実行してます<jupyter_code>def input_img_block_size_max_trial(repeat=3):
    input_msg = "画像サイズを入力してください: "
    on_error = True
    for i in range(repeat+1):
        img_size = None
        img_size_str = input(input_msg)
        # 次回以降の入力はエラーのときなのでメッセージを更新
        input_msg = "画像サイズが不正です。もう一度入力してください: "
        # 画像サイズを' 'で分解
        img_size_str = img_size_str.split(" ")

        # 画像サイズをチェック
        if len(img_size_str) != 2:
            # エラーのときはwhileの先頭に戻る
            continue

        # numpyを使って数字であるかどうかをチェック
        import numpy as np
        if not all(np.char.isnumeric(img_size_str)):
            continue

        img_size = np.array(list(map(int, img_size_str)))
        if not all(img_size > 0):
            continue

        # ここまでくれば正しいのでerrorフラグをクリア
        on_error = False
        # for文を抜ける
        break

    if on_error:
        print("画像サイズが不正です。終了します。")

    input_msg = "block_sizeを入力してください: "
    if not on_error:
        for i in range(repeat+1):
            block_size_str = input(input_msg)
            # 次回以降の入力はエラーのときなのでメッセージを更新
            input_msg = "block_sizeが不正です。もう一度入力してください: "

            if not np.char.isnumeric(block_size_str):
                on_error = True
                continue

            if int(block_size_str) <= 0:
                on_error = True
                continue

            # ここまでくれば正しいのでerrorフラグをクリア
            on_error = False
            # intに変換してfor文を抜ける
            block_size = int(block_size_str)
            break

        if on_error:
            print("block_sizeが不正です。終了します。")
        else:
            print("画像サイズ: {0[0]}x{0[1]}、block_size: {1}".format(img_size, block_size))
input_img_block_size_max_trial()
input_img_block_size_max_trial()
input_img_block_size_max_trial()
input_img_block_size_max_trial()<jupyter_output>画像サイズを入力してください:  200 abc
画像サイズが不正です。もう一度入力してください:  def hij
画像サイズが不正です。もう一度入力してください:  205j 200j
画像サイズが不正です。もう一度入力してください:  200 500
block_sizeを入力してください:  -10
block_sizeが不正です。もう一度入力してください:  10 abc
block_sizeが不正です。もう一度入力してください:  10abc
block_sizeが不正です。もう一度入力してください:  10<jupyter_text>関数を使うとfor文やif文のネストを減らせます処理が必要なくなったらreturnすればOKです。一般に、関数はprintではなくreturnして値を返すので、実際にプログラムを書くときにはreturn値でエラーが分かるようにしておきます。<jupyter_code>def input_img_block_size_max_trial_w_return(repeat=3):
    input_msg = "画像サイズを入力してください: "
    on_error = True
    for i in range(repeat+1):
        img_size = None
        img_size_str = input(input_msg)
        # 次回以降の入力はエラーのときなのでメッセージを更新
        input_msg = "画像サイズが不正です。もう一度入力してください: "
        # 画像サイズを' 'で分解
        img_size_str = img_size_str.split(" ")

        # 画像サイズをチェック
        if len(img_size_str) != 2:
            # エラーのときはwhileの先頭に戻る
            continue

        # numpyを使って数字であるかどうかをチェック
        import numpy as np
        if not all(np.char.isnumeric(img_size_str)):
            continue

        img_size = np.array(list(map(int, img_size_str)))
        if not all(img_size > 0):
            continue

        # ここまでくれば正しいのでerrorフラグをクリア
        on_error = False
        # for文を抜ける
        break

    if on_error:
        print("画像サイズが不正です。終了します。")
        # エラーのときはNoneを返却
        return None

    input_msg = "block_sizeを入力してください: "
    for i in range(repeat+1):
        block_size_str = input(input_msg)
        # 次回以降の入力はエラーのときなのでメッセージを更新
        input_msg = "block_sizeが不正です。もう一度入力してください: "

        if not np.char.isnumeric(block_size_str):
            on_error = True
            continue

        if int(block_size_str) <= 0:
            on_error = True
            continue

        # ここまでくれば正しいのでerrorフラグをクリア
        on_error = False
        # intに変換してfor文を抜ける
        block_size = int(block_size_str)
        break

    if on_error:
        print("block_sizeが不正です。終了します。")
        return None

    # うまく処理できたときだけ、tupleでimg_sizeとblock_sizeを返却
    return (img_size, block_size)
ret = input_img_block_size_max_trial_w_return()
if ret is not None:
    print("画像サイズ: {0[0]}x{0[1]}、block_size: {1}".format(ret[0], ret[1]))
ret = input_img_block_size_max_trial_w_return()
if ret is not None:
    print("画像サイズ: {0[0]}x{0[1]}、block_size: {1}".format(ret[0], ret[1]))
ret = input_img_block_size_max_trial_w_return()
if ret is not None:
    print("画像サイズ: {0[0]}x{0[1]}、block_size: {1}".format(ret[0], ret[1]))<jupyter_output>画像サイズを入力してください:  200 200
block_sizeを入力してください:  10
{'fraction_non_alphanumeric': 0.08923630326508024, 'fraction_numerical': 0.018954067515218595, 'mean_word_length': 2.869914346895075, 'pattern_counts': {'":': 0, '<': 20, '<?xml version=': 0, '>': 20, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '655246', 'license': 'BSD-3-Clause', 'n_tokens_mistral': 3715, 'n_tokens_neox': 3469, 'n_words': 417, 'path': 'exe10.ipynb', 'repo_name': 'pman0214/qu-kikan-prog-2020-enshu-answers', 'size': '7228'}