요즘 udemy에서 100 Days of Python을 듣고 있다.
요늘은 4일차.
for 루프에 대해 공부했다.
내용은 쉬웠지만, 언제나 그랬듯이 혼자 해보라고 하면 어렵다.
내가 해야할 미션은 랜덤으로 비밀번호를 만드는 것이다.
나는 아래와 같이 짰다.
이렇게 하고 출력하면,
1. 문자를 몇 개 설정할 것인지 묻고,
2. 특수기호를 몇 개 설정할 것인지,
3. 숫자를 몇 개 설정할 것인지 묻는다.
그 다음 문자열로 랜덤으로 출력해주는 것이다.
나는 챗GPT를 이용해서 하나하나 기능을 만들어가며 아래와 같이 짰다.
import random
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
symbols = ['!', '#', '$', '%', '&', '(', ')', '*', '+']
print("Welcome to the PyPassword Generator!")
nr_letters = int(input("How many letters would you like in your password?\n"))
nr_symbols = int(input(f"How many symbols would you like?\n"))
nr_numbers = int(input(f"How many numbers would you like?\n"))
random_letters = random.sample(letters, nr_letters) # 3개 선택 (중복 없음)
print("".join(random_letters))
random_symbols = random.sample(symbols, nr_symbols) # 3개 선택 (중복 없음)
print("".join(random_symbols))
random_numbers = random.sample(numbers, nr_numbers) # 3개 선택 (중복 없음)
print("".join(random_numbers))
print("".join(random_letters),end="")
print("".join(random_symbols),end="")
print("".join(random_numbers))
먼저, random 모듈을 import해줘야 사용이 가능하다.
그리고, random.sample 함수를 썼다.
random.sample 함수는 파이썬에서 주어진 리스트나 시퀀스에서 원하는 개수만큼
랜덤하게 선택된 요소들을 반환하는 함수이며, 이 함수는 중복 없이 샘플을 선택한다.
예를 들어
random_symbols = random.sample(symbols, nr_symbols) # 3개 선택 (중복 없음)
의 경우 letter 리스트에서 사용자에게 입력받은 숫자만큼의 요소를 뽑아준다.
이렇게 기호, 숫자를 모두 만들었다.
하지만 짜면서 뭔가 잘못하고 있다는 생각을 했다.
오늘 배운게 for 루프인데... for문을 써야 정상일텐데?
하지만, 하던 것은 계속 해보자. 삽질을 하더라도 다 파면 그만이지 뭐.
아님 말고~ 이런 생각을 하면서 계속 해보기로 했다.
모로 가도 서울만 가면 된다는 말이 있지 않은가!
뽑아주는 것은 잘 했다.
그런데 또 문제가 발생했다.
어떻게 문자열(string)으로 만들 수 있는가?
또 묻는다. GPT야 알려줘!
"".join()은 파이썬에서 문자열을 특정 구분자로 결합할 때 사용하는 함수이다.
주어진 리스트나 튜플의 요소들을 하나의 문자열로 합칠 때 유용하다.
예시
words = ["안녕", "세상", "좋은", "하루"]
result = " ".join(words) # 단어들을 공백(" ")으로 연결
print(result) # "안녕 세상 좋은 하루"
하지만 비밀번호에는 공백이 없어야 한다.
그러므로, ""으로 하면 된다.
세 번째 문제
print를 했을 때 자동으로 줄바꿈이 생긴다!!
즉,
abc
@#
123
이렇게 출력되는 문제를 발견했다.
도와줘. 피티야.
바로 알려줬다.
print() 함수 뒤에 end=""를 붙여주면 해결된다.
end=""는 파이썬의 print() 함수에서 출력 후 줄바꿈을 변경하는 옵션이다.
기본적으로 print() 함수는 출력을 한 뒤 자동으로 줄바꿈(\n)을 추가한다.
하지만 end=""를 사용하면 줄바꿈 없이 출력할 수 있다.
""대신 " "를 하면 한 줄 띄기가 되고,
""대신 " - "를 하면 공백( ) + 대시(-)로 구분할 수 있게 된다.
결과적으로 문자기호숫자 순서로 출력이 된다.
하지만, 이렇게 짜는게 답이 아니라는 것은 알고 있었다.
for문을 써야한다.
왜? for문에 있는 과제니까!!
도저히 몰라서 컨닝을 잠시 했다!!
for문과 range()함수를 쓰더라...
너무나 간단했다. 황당했다. 난 뭘 한 거지?
아래와 같이 하면 된다.
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
symbols = ['!', '#', '$', '%', '&', '(', ')', '*', '+']
print("Welcome to the PyPassword Generator!")
nr_letters = int(input("How many letters would you like in your password?\n"))
nr_symbols = int(input(f"How many symbols would you like?\n"))
nr_numbers = int(input(f"How many numbers would you like?\n"))
password = ""
for letter in range(1,nr_letters+1):
password += random.choice(letters)
for number in range(1,nr_numbers+1):
password += random.choice(numbers)
for symbol in range(1,nr_symbols+1):
password += random.choice(symbols)
print(password)
역시 for 루프문을 써야했고,
random.choice를 쓰면 됐다.
range(1,5) 함수를 분석하면
1,2,3,4 가 출력된다.
따라서, 멈추는 숫자 +1를 해줘야 끝까지 출력된다.
print("랜덤 순서로 섞인 요소들:")
for item in password_list:
print("".join(item),end="")