티스토리 뷰
[Python] 6자리의 패스워드 생성기 프로그램 (과제 : 적어도 하나의 숫자를 가지도록 소스 변경)
또야 2021. 3. 31. 21:32
알파벳 소문자와 숫자를 랜덤하게 조합한
6자리의 패스워드를 생성해보자.
(1) genPass() 함수를 작성한다.
(2) random 모듈의
randrange() 함수를 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import random
def genPass():
alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
password = ""
for i in range(6):
index = random.randrange(len(alphabet))
password = password + alphabet[index]
return password
print(genPass())
print(genPass())
print(genPass())
|
cs |
- 결과
- 설명
alphabet에 소문자와 숫자를
문자열로 선언한다.
password는 비워둔다.
6자리의 암호이므로
for i in range(6)로 선언하고,
index = random.randrange(len(alphabet))을 하면
index는 alphabet의 길이만큼 랜덤하게 설정된다.
이를 alphabet[index]에 넣어주면
문자열 인덱싱을 하여
alphabet의 랜덤한 한 글자를 뽑아
password에 글자를
6번 더해주는 것이다.
+ 과제
패스워드가 적어도
하나의 숫자를 가지도록
소스를 변경하여 보자.
- 첫 번째 구상 :
반복 횟수를 구분하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import random
def genPass():
alphabet = "abcdefghijklmnopqrstuvwxyz"
number = "0123456789"
password = ""
iter = random.randrange(1,7)
for i in range(iter):
index_n = random.randrange(len(number))
password = password + number[index_n]
for i in range(6 - iter):
index_a = random.randrange(len(alphabet))
password = password + alphabet[index_a]
return password
print(genPass())
print(genPass())
print(genPass())
|
cs |
- 위와 같이 구상한 이유
적어도 하나의 숫자를 가지면 되므로
반복 횟수 변수인 iter를
random.randrange(1,7)로 설정하여
패스워드에
최소 1개 ~ 6개의 숫자가 추가되고,
영소문자는 패스워드의 개수를
6자리에서 뺀 만큼 추가하기로 하였다.
예를 들어 숫자가 4개 설정되면,
영소문자는 2개가 설정되는 것이다.
- 결과
최소 한 자리의 숫자가
패스워드에 포함되는 것은 성공했지만,
무조건 숫자가 영소문자 앞에
배치된다는 점,
연속된 숫자 / 연속된 영소문자라는
틀이 있는 데이터라는 점에서 아쉬웠다.
다른 방법을 도전!
- 두 번째 구상 :
any함수를 이용한 조건 검사
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import random
def genPass():
alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
password = ""
for i in range(6):
index = random.randrange(len(alphabet))
password = password + alphabet[index]
if any(a.isdigit() for a in password) == True:
return password
elif any(a.isdigit() for a in password) == False:
return genPass()
print(genPass())
print(genPass())
print(genPass())
print(genPass())
print(genPass())
print(genPass())
|
cs |
- 설명
기존의 틀은 유지하되,
for문을 다 돌고나면
any() 함수를 이용하여
숫자가 최소한 하나라도 있으면
password를 반환하고,
하나도 없으면 genPass() 함수를
다시 호출하도록 구상했다.
any() 함수는 안의 인자가
하나라도 참이 되면 참을 반환한다.
any(a.isdigit() for a in password)는
password 안을 한 글자 씩 돌면서,
숫자가 있는지 검사한다는 것이다.
- 결과
(1)
(2)
(3)
3번의 실행 모두 정상적으로,
만족할 만한 결과가 도출되었다.
any 함수를 어떨 때 쓰면 적절할지도
생각하게 되어 좋았다.
이보다 좋은 풀이가 있는지
꼭 알고싶다.
'Programming Language > Python basic' 카테고리의 다른 글
[Python] 무명 함수(람다식) (0) | 2021.04.01 |
---|---|
[Python] 사용자로부터 2개의 정수를 받아 크기 순으로 반환하는 함수 작성 (0) | 2021.03.31 |
[Python] 정수를 입력 받아 소수인지 판별하는 프로그램 (0) | 2021.03.31 |
[Python] 파이썬에서의 변수는 객체를 참조하는 이름표이다 (0) | 2021.03.31 |
[Python] 파이썬 문자열 출력 기초 / len(), ''', \n, \', %s 등 (0) | 2021.03.31 |
- Thanks for comming.
- 오늘은
- 명이 방문했어요
- 어제는
- 명이 방문했어요