ブログ


スパイシー技術メモ


CheckIO Pythonの文字列操作の基本

CATEGORY: プログラム

CheckIO 第三問 パスワードの強度をチェックするモジュールを書け!

・パスワードは、10文字以上であること
・数値・大文字・小文字が、少なくても1文字以上づつ、含まれること

ポイントとしては以下の通りでしょうか。
(1) 文字数
(2) 文字列に特定の文字集合の文字が含まれるか

(1)ですが、最初ドキュメントみて、countメソッドだと早とちりしましたが、エラーがでたので再度調べたところ、len関数のようです。不思議。

http://docs.python.jp/3/library/functions.html#len
len(s)
オブジェクトの長さ (要素の数) を返します。引数はシーケンス (文字列、タプル、またはリスト) かマッピング (辞書) です。

(2)findメソッドで検索できますが、in演算子のほうがおすすめのようです。

str.find(sub[, start[, end]])
文字列のスライス s[start, end] に sub が含まれる場合、その最小のインデクスを返します。オプション引数 start および end はスライス表記と同様に解釈されます。 sub が見つからなかった場合 -1 を返します。

ノート find() メソッドは、 sub の位置を知りたいときにのみ使うべきです。 sub が部分文字列であるかどうかのみを調べるには、 in 演算子を使ってください

大文字、小文字、数値をメソッドを使って判定しようかと思いハードコードにしようと思いましたが、定数があるようでしたので、そちらを利用します。

6.1.1. 文字列定数

string.ascii_upperrcase ... 大文字 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
string.ascii_lowercase ... 小文字 'abcdefghijklmnopqrstuvwxyz'
string.digits ... 文字列 '0123456789'

ざっくり適当に書いてみました。今回は、ループが2重なのがダメなコードですね。1回のループですませたいところです。

def checkio(data):
    if len(data) < 10:
        return False
    if not contains(data,string.ascii_uppercase):
        return False
    if not contains(data,string.ascii_lowercase):
        return False        
    if not contains(data,string.digits):
        return False
    return True
def contains(original,letters):
    for letter in letters:
        if letter in original:
            return True
    return False

ということで、ループ回数を減らすためにダサイコード(笑)にしてみました。


def checkio(data):
if len(data) < 10:
return False
hasUpper = False
hasLower = False
hasDigit = False
for letter in data:
hasUpper = hasUpper or letter.isupper()
hasLower = hasLower or letter.islower()
hasDigit = hasDigit or letter.isdigit()
return hasUpper and hasLower and hasDigit






プレスリリース

人気ブログ記事

採用情報

最新ブログ記事








ページの先頭へ