【Python】ゾロ目の判定

Pythonでゾロ目を判定するプログラムについて解説します。



ゾロ目とは

ゾロ目とは2桁以上で同じ数字になることをいいます。

例えば11や222や3333などです。

ゾロ目を判定するコード

コード例


# 打ち込んだ整数がゾロ目であるか判定する

def doublet_check(check_value: str) -> bool:
  """ゾロ目かどうか判定"""
  for i in range(1, len(check_value)):
    if check_value[0] != check_value[i]:
      return False
  return True


while True:
  input_value = input('2桁以上の正の整数 : ')
  if ((len(input_value) >= 2)
      and (input_value.isdigit())
      and (input_value[0] != '0')):
    break

idx = doublet_check(input_value)

if idx == 0:
  print('ゾロ目ではありません。')
else:
  print('ゾロ目です。')

実行結果(1)

2桁以上の正の整数 : 1
2桁以上の正の整数 : -1
2桁以上の正の整数 : 02
2桁以上の正の整数 : 022
2桁以上の正の整数 : 22
ゾロ目です。

実行結果(2)

2桁以上の正の整数 : 23
ゾロ目ではありません。

1文ずつ内容の解説をします。

def doublet_check(check_value: str) -> bool:

defで始まる文は関数定義の関数頭部です。

defは関数定義の開始を表し、doublet_checkは関数名、()の中は仮引数並びです。

:よりインデントが一段深いスイートが関数本体になります。

関数は呼び出されるまでは実行されず、実際に実行されるにはwhile trueという文からになります。

そのあとのidx = doublet_check(input_value)という文で初めて関数が実行されます。

今回の場合はdoublet_check(input_value)という文のinput_valueが実引数でこれが関数内の仮引数check_valueに代入されて関数が実行されます。

なお: strや -> boolはアノテーションでプログラムの読み手に使えるコメントみたいなもので動作に影響はありません。

“""ゾロ目かどうか判定"""

“""…"""の形式は文書化文字列というもので関数の仕様を説明するコメントです。

"’…"’でも動作はしますが一般的には"""…"""という形式がよく使われます。

for i in range(1, len(check_value)):

for文によってrange関数で生成された数列を取り出しています。

len(check_value)は仮引数として渡された文字列の文字数、例えば12345なら5文字なので5となりますのでrange関数の範囲は(1,5)すなわち1から4です。

if check_value[0] != check_value[i]: return False

仮引数として渡された文字列がゾロ目であるかどうかの判定をしています。

判定方法は仮引数の1文字目(インデックス0)と2文字目(インデックス1から最後まで)が等しいか調べています。

!=は等しくないという意味でインデックス0とiが等しくない場合はこのif文によりスイートのbreak文が実行されます。

例えば11211ならi = 2のとき0と等しくないことが判定されます。

関数は受け取った仮引数を処理(今回の場合はゼロ目かの判定)を行い返却値を返します。

このスイートで返却するのはFalseです。

return True

上のif文ではゾロ目でないかどうかを判定してゾロ目でない場合if文が実行されるようになっていました。

すべての文字列が等しかった場合はfor文が終了しこのbreak文により返却値としてTrueを返します。

対応しているのが前のif文でなくfor文なのでインデントの深さもfor文と同じになります。



while True:

whileは~している間という意味でfor文同様に繰り返し文です。

その条件がTrueなので永遠と繰り返されるようになっています。

このような永遠に繰り返すループを無限ループといいます。

input_value = input('2桁以上の正の整数 : ')

input関数でキーボードから2桁以上の正の整数を入力させて変数input_valueに代入しています。

ただキーボードで入力されるのが2桁以上の正の整数でない場合があります。

その場合はその後のifの条件を満たさずにwhile True:によりまた入力を促すようにしています。

len(input_value) >= 2

len(input_value)はinput関数で入力された文字数です。

その文字数が2文字以上ならこの条件を満たします。

これにより0~9までの1桁の数値を入力は受け付けられないようにできます。

input_value.isdigit()

.isdigitは数字かどうかを判定します。

2文字以上を満たしてもそれが数字であるとは限りません。

例えばaaなどのアルファベットや-1などの記号をつけた入力は無効にできます。

input_value[0] != '0’

入力された文字列の1文字目が0でないかどうかを判定します。

仮に2文字以上で数字文字でも01などは2桁とはいえませんのでこれらを無効にさせます。

break

if文により正しく2桁の正の整数が入力された場合に実行されます。

break文はループ本体を強制的に終了できるのでwhile文の繰り返しを終了させられます。

2桁の正の整数が入力されると入力の促しは終わって下の文が実行されるようになります。

idx = doublet_check(input_value)

doublet_check(input_value)は関数呼び出しです。

この呼び出しで初めて関数が呼び出されます。

関数定義のdef文はこの呼び出しの前に置かなければなりません。

()の中が実引数でこれが関数定義の仮引数check_valueに代入されます。

その仮引数は関数内でゾロ目かどうかの判定が行われ、その結果に応じて返却値としてTrueかFalseになって返ってきます。

なので変数idxにはTrueかFalseのどちらかが入っています。

if idx == 0: print('ゾロ目ではありません。’)

bool型の論理値は内部的にFalseは0、Trueは1として表されています。


# FalseとTrueが内部的に0と1であるかを確認

print(f'False = 0 : ', False == 0)
print(f'True  = 1 : ', True  == 1)
False = 0 :  True
True  = 1 :  True

そのためidx == 0ならFalseつまりゾロ目でないのでprint関数で「ゾロ目ではありません。」と表示しています。

else: print('ゾロ目です。’)

idx != 0すなわちidx == 1つまりゾロ目なのでprint関数で「ゾロ目です。」と表示しています。

if文の条件式をidx == 1にすればprint関数で表示させる文章は逆になります。