3

私は次の問題を提起されました:

関数 postalValidate(S) を定義します。この関数は、最初に S が有効な郵便番号を表しているかどうかをチェックします。まず、すべてのスペースを削除します。残りは L#L#L# の形式である必要があります。ここで、L は文字 (小文字または大文字) であり、# は数字です。S が有効な郵便番号でない場合は、ブール値の False を返します。S が有効な場合は、同じ郵便番号を L#L#L# というナイス形式で返します。ここで、各 L は大文字です。

これが私のコードです:

def postalValidate(S):
S = S.replace(" ", "")
   for c in range(0, 4, 2):
      if S[c].isalpha() == True:
         x = True
   for c2 in range(1, 5, 2):
      if S[c2].isdigit() == True:
         y = True
   if x == True and y == True:
            return S.upper()
   else:
      return False

問題は、次のエラーが発生することです。

UnboundLocalError: 代入前にローカル変数 'y' が参照されました

これを手伝っていただければ幸いです。

4

1 に答える 1

3

問題は、条件S[c2].isdigit() == Trueが満たされない場合、変数yが割り当てられないため、後で True かどうかを確認できないことです。Falseこれを回避する最も簡単な方法は、事前に の値を割り当てることです。

y = False
for c2 in range(1, 5, 2):
    if S[c2].isdigit():
       y = True

いくつかのメモ:

  1. 節で明示== Trueする必要はありません。であるかどうかをチェックし、あなたの場合はすでに等しいです。ifif condbool(cond)TruecondTrue

  2. 関数の結果にrangeは、2 番目の引数は含まれません。

    In [1]: list(range(0, 4, 2))
    Out[1]: [0, 2]
    

    おそらくそれに 1 を追加する必要があります。

    In [2]: list(range(0, 5, 2))
    Out[2]: [0, 2, 4]
    

また、スライス表記を使用してループを完全に回避することもできます。

したがって、いくつかの最適化により、コードの長さを短縮できます。

def postValidate(s):
    s = s.replace(' ', '')
    if len(s) == 6 and s[0:5:2].isalpha() and s[1:6:2].isdigit():
       return s.upper()
    return False
于 2013-03-31T12:27:51.100 に答える