パスワードを生成するsecretsライブラリー

①使い方
import secrets
import string

chars = string.ascii_letters + string.digits   ※文字列の文字と数字を合わせて変数に代入している
passwd = "".join(secrets.choice(chars) for i in range(8))  ※secrets.choice()でできる

print(passwd)


②大文字のアルファベット、小文字のアルファベット、数字を2文字以上の条件付きのパスワード作成

import secrets
import string

chars = string.ascii_letters + string.digits
# ここを修正してください
while True:
    passwd = "".join(secrets.choice(chars) for i in range(8))
    chk1 = any(c.islower() for c in passwd)
    chk2 = any(c.isupper() for c in passwd)
    chk3 = len([c for c in passwd if c.isdigit()]) >=2
    
    if chk1 and chk2 and chk3:
        break
        
print(passwd)



解説
・大文字のアルファベットを1文字以上含むこと:any(c.islower() for c in passwd)
・小文字のアルファベットを1文字以上含むこと:any(c.isupper() for c in passwd)
・数字を2文字以上:len([c for c in passwd if c.isdigit()])


・all(イテラブル)は、イテラブルの全てが真のときに真になる組み込み関数であり、any(イテラブル)は、イテラブルのいずれかが真のときに真になる組み込み関数です。
・「allは全部成立かどうか、anyはどれか成立かどうか」と覚えましょう。
・これらを組み合わせてany(c.islower() for c in passwd)は、「1文字以上大文字を含む」ときTrueです。

・for c in passwd: パスワード文字列 passwd を一文字ずつ取り出して変数 c に代入します。
・if c.isdigit(): 文字 c が数字であるかどうかを確認します。isdigit() メソッドは文字が数字であれば True を返します。
・[c for c in passwd if c.isdigit()]: リスト内包表記を使って、パスワード内の数字のリストを生成します。
・len([c for c in passwd if c.isdigit()]): 生成した数字のリストの長さ(要素数)を取得します。つまり、パスワード内に含まれる数字の数を数えます。
・>= 2: 数字の数が2以上であるかを確認します。もし2以上であれば、True になります。それ以外の場合は False になります。
・chk3 = len([c for c in passwd if c.isdigit()]) >= 2: 上記の結果を変数 chk3 に代入します。
要するに、このコードはパスワード内に数字が2つ以上含まれているかどうかを判定しています。chk3 が True であれば条件が満たされています。