본문 바로가기

About coding/Today I learned

2023년 03월 27일 TIL

문제:

게임만들기 개인 과제 중에 아래처럼 인풋 값을 주고 사용자가 선택할 기회를 주는 부분이 있었는데,

import time

# 2단계: 주인공 속성 고르기


# 불속성, 얼음속성, 독속성 주인공슬라임의 체력, 기술 세팅해서
# 해당 속성 선택 시 앞으로 영구적으로 해당 속성에 해당하는 함수가 캐릭터 값에 적용되도록 해야함.

while True:
    slimetype = input(
        "\n\n\n\n\n\n\n\n당신은 슬라임으로 다시 태어났습니다. \n어떤 슬라임이 되시겠습니까? \n\n1.불 2.얼음 3.독 \n\n위 세가지 속성 중에 고르세요. \n\n\n\n\n 답변: ")

    if slimetype == "불" or "1.불" or "1":
        print("\n\n\n잘 하셨습니다!! \n당신은 이제부터 불 속성 슬라임 입니다!!")
        # 불 슬라임 모드로 함수 선택
        break
    elif slimetype == "얼음" or "2.얼음" or "2":
        print("\n\n\n잘 하셨습니다!! \n당신은 이제부터 얼음 속성 슬라임 입니다!!")
        # 얼음 슬라임 모드로 함수 선택
        break
    elif slimetype == "독" or "3.독" or "3":
        print("\n\n\n잘 하셨습니다!! \n당신은 이제부터 독 속성 슬라임 입니다!!")
        # 얼음 슬라임 모드로 함수 선택
        break
    else:
        print("\n잘못 골랐습니다. 장난하지 마세요. ^^ㅋ\n3초 후 다시 묻겠습니다.")
        time.sleep(3)

# 배틀 단계로 넘어가야함

내가 아무리 1.불 2.얼음 3.독

이렇게 써 놨어도 혹시 사용자가 "1" 이라던가 "불" 이라던가

간단하게 대답하는 걸 대비해서 여러 답안의 가능성을 열어주고 싶었다. 그래서 if 문과 elif 문에서 slimetype 값을 검증할 때 or 을 사용해 여러 선택지를 감안해 보려고 했는데, 위에 처럼 코딩하면

무조건 답이 불속성 슬라임으로 귀결되거나 else:로 빠져서 장난하지 말라고 나오는 등 이상한 현상이 일어난다.

 

시도:

우선은 괄호로 안 묶어서 그런가? 해서 괄호로 묶어보았다.

if slimetype == ("불" or "1.불" or "1"):
        print("\n\n\n잘 하셨습니다!! \n당신은 이제부터 불 속성 슬라임 입니다!!")
        # 불 슬라임 모드로 함수 선택
        break

결과는 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 안된다.

한 3분 정도 고개를 갸웃갸웃하다가 gpt 한테 물어보기로 했고, 해결했다 ㅋㅋ

gpt는 이렇게 답변하면서, 또 '괄호로 묶으라(???)'고 했다. 아까 이미 괄호로 묶어봤는데 안 되던데?

근데 자세히 보니 코드블럭 속에 내용물은 달랐다. 개떡같이 말해도 소떡같이 알아 듣기로 하고,

아~  if 문에서 slimetype == " " 부분을 각각 or 마다 정해주라는 거구나!! 하고 그대로 적용해 보았다 ㅋㅋ

 

해결:

결과는 성공했다!

while True:
    slimetype = input(
        "\n\n\n\n\n\n\n\n당신은 슬라임으로 다시 태어났습니다. \n어떤 슬라임이 되시겠습니까? \n\n1.불 2.얼음 3.독 \n\n위 세가지 속성 중에 고르세요. \n\n\n\n\n 답변: ")

    if slimetype == "불" or slimetype == "1.불" or slimetype == "1":
        print("\n\n\n잘 하셨습니다!! \n당신은 이제부터 불 속성 슬라임 입니다!!")
        # 불 슬라임 모드로 함수 선택
        break
    elif slimetype == "얼음" or slimetype == "2.얼음" or slimetype == "2":
        print("\n\n\n잘 하셨습니다!! \n당신은 이제부터 얼음 속성 슬라임 입니다!!")
        # 얼음 슬라임 모드로 함수 선택
        break
    elif slimetype == "독" or slimetype == "3.독" or slimetype == "3":
        print("\n\n\n잘 하셨습니다!! \n당신은 이제부터 독 속성 슬라임 입니다!!")
        # 얼음 슬라임 모드로 함수 선택
        break
    else:
        print("\n잘못 골랐습니다. 장난하지 마세요. ^^ㅋ\n3초 후 다시 묻겠습니다.")
        time.sleep(3)

이렇게 해놓고 터미널에 실험삼아 3을 입력해보면, 결과가 독 속성에 해당하게 잘 나와야한다.

이렇게 해보면~

짜잔! ㅋㅋㅋ 이제 잘 나온다.

 

알게된점:

1. if 문이나 elif 문에서 조건을 걸 때는, 당연히 비교하고자 하는 애들을 세트로 묶으면서 or 이나 and를 주어야 한다는 것!

2. 어려운 점을 만나면 당황하지 말고 검색을 해서 답을 찾자! ㅎㅎ 그리고, 검색의 길을 떠나다가 갑자기 내가 어디까지 생각을 하고 있었나 까먹어버리는 경우가 있다. 그럴 때를 대비해서 노트에 내 의문점과 생각의 꼬리의 꼬리를 무는 과정을 기록하면서 답을 찾아나가야 한다. 헨젤과 그레텔의 콩 처럼! 코딩은 고도의 지력이 필요해서, 생각이 길어지다 보면 뇌 용량 초과로 갑자기 여긴 어디 난 누구? 가 될 수도 있다 ㅋㅋㅋ

 

 

 

그 외 새로 배운 작은 내용:

_glob 라이브러리.

from pprint import pprint
import glob

글롭은 내 폴더, 파일들의 경로를 오가며 해당 경로에 있는 내용물들을 조회할 수 있게 한다.

글롭으로 조회한 후에는 open문법을 사용해 경로의 수많은 파일들의 이름을 일괄적으로 변경하거나, 텍스트 파일들의 내용을 모두 읽어서 한 군데에 저장 할 수도 있다. pprint와 궁합이 좋아서 같이 쓴다.

# ./는 현재 python 파일이 위치한 경로를 의미합니다.
# *은 "모든 문자가 일치한다" 라는 의미를 가지고 있습니다.
# ./venv/*은 venv 폴더 내 모든 파일들을 의미합니다.
path = glob.glob("./venv/*")
pprint(path)


# **은 해당 경로 하위 모든 파일을 의미하며, recursive 플래그와 같이 사용합니다.
# recursive를 True로 설정하면 디렉토리 내부의 파일들을 재귀적으로 탐색합니다.
path = glob.glob("./venv/**", recursive=True)
pprint(path)

 

 

 

 

_open 문법.

파이썬에서 파일을 열 때는 open 문법을 쓰면 됨

f = open("경로와파일이름","어떤모드로 열건지", encoding="utf-8")

문자 깨짐 현상이 있을 땐 encoding 지정을 신경쓴다. 기본적으론 utf-8이면 무탈.

어떤 모드로 열 건 지 선택지는 : w기존내용에덮어쓰기 , a 추가로이어쓰기, r 그냥읽기모드 가 있다.

 

 

 

위에서 연 파일의 내용 수정하기

f.write("원하는 내용 작성")

여는 파일을 f 라는 변수에 할당하였으므로 쓰기/닫기 등 추후 작업에 f.어쩌구 모양으로 쓰면 된다.

 

내용을 다 적었으면 꼭 닫아주어야 한다.

f.close()

 

 

_open 문법을 with open으로 쓰면 더 편리: 굉장한 장점: 따로 클로즈 해주지 않아도 된다.

with open("file.txt", "r", encoding="utf-8") as r:
    # readlines는 파일의 모든 내용을 list 자료형으로 한번에 읽어들입니다.
    print(r.readlines())

as r: 하면서 앞에서 여는 파일을 r이라는 변수에 바로 할당.

r.readlines() 하면서 파일을 읽음.

쓰기모드로 하고 싶으면 as w: 하고 print(w.readlines()) 하면 됨.

 

_readlines가 아니라 readline 하면 파일의 내용을 한 줄 씩 읽을 수도 있는데, 이렇게 하면 됨.

with open("file.txt", "r", encoding="utf-8") as r:
    while True:
        # readline은 파일을 한 줄 씩 읽어들입니다.
        line = r.readline()

        # 파일 끝까지 텍스트를 읽어들였다면 반복문을 중지합니다.
        if not line:    #line의 내용이 아무것도 없으면 False, not이랑 만나면 True 그럼 다음줄에서 break.
            break

        # 텍스트의 줄바꿈 문자 제거
        line = line.strip()
        print(line)

while True: 로 주어서 무한 정 읽게 한 다음에, 언제까지? if not line: 으로 더 이상 라인이 없을 때 break 그만두게 하면 됨.

 

 

_csv 파일은 Comma-Sepparated Values 였구나

 

 

 

_데코레이터 예제. @데코레이터: 미리 데코레이터함수라는 장치를 만들어 놓고 하위의 def wrapper(): 에서 임의의 함수 func()에 대한 요사스럽고 음흉한 작정을 꾸며둔 뒤에 추후 코딩 시, 어떤 함수 윗줄에 '@데코레이터함수' 만 써주면 해당 함수가 실행될 때 데코레이터함수가 함께 실행되도록 장치하는 기술.

# 입력받은 인자에 2를 곱해주기
def double_number(func):
    def wrapper(a, b):
        # 함수에서 받은 인자에 2를 곱해줍니다.
        double_a = a * 2
        double_b = b * 2

        return func(double_a, double_b)

    return wrapper

@double_number
def double_number_add(a, b):
    return a + b

def add(a, b):
    return a + b

print(double_number_add(5, 10))
print(add(5, 10))

# result output
"""
30
15
"""

 

 

_오늘 해 보고 있는 이상한 짓: string 문자열들 사이에 공백을 제거하고 .을 하나만 넣으려면 어떻게 해야할까.

string = "가나.   .다아자자자자자.    .자자자aaaBB.   .BBB"

splitted_string = string.split(".")

sum = []

for a in splitted_string:
    a.strip()
    stripped = (a.strip())
    sum.append(stripped)
    # b = ''.join(s for s in stripped)
# print(sum)

result = ' '.join(a for a in sum)

real_result = result.replace(" ", ".")

print(real_result)

음음

string = "가나.   .다아자자자자자.    .자자자aaaBB.   .BBB"

splitted_string = string.split(".")

sum = []

for a in splitted_string:
    a.strip()
    stripped = (a.strip())
    sum.append(stripped)
    # b = ''.join(s for s in stripped)
# print(sum)

result = ' '.join(a for a in sum)

real_result = result.replace(" ", ".")

real_real_result = real_result.replace("..", ".")
print(real_real_result)

결과

DONG HYUN LEE@DESKTOP-AE57O4H MINGW64 ~/Desktop/study
$ "c:/Users/DONG HYUN LEE/Desktop/study/venv/Scripts/python.exe" "c:/Users/DONG HYUN LEE/Desktop/study/main.py"
가나.다아자자자자자.자자자aaaBB.BBB
(venv)

ㅋㅋㅋㅋㅋㅋ 해냈다...

어설프지만ㅋㅋ 낙서하며 문자열 연산 연습하기...

 

 

_리스트 조작법

요소 추가법들

# 리스트 요소삽입
# insert(a, b) a번째에 b를 넣어라
number_list.insert(0, 10)
print(number_list) # [10, 4, 3, 1, 0]


# 요소 추가
number_list.append(0)
print(number_list) # [1, 3, 4, 0]


# 리스트 확장
# extend(list)
number_list.extend([5,6,7])
print(number_list) # [4, 3, 1, 5, 6, 7]

요소 삭제법들

# 요소 삭제하기
del number_list[1]
print(number_list) # [1, 3, 4]


# 리스트 요소제거
# remove(x) 첫번째로 나오는 x를 제거해라
number_list.remove(10)
print(number_list) # [4, 3, 1, 0]


# 리스트 요소 꺼내기
# pop() 제일 마지막 요소를 꺼냄
print(number_list.pop()) # 0
print(number_list) # [4, 3, 1]

요소 수정법

# 값 수정하기
number_list[1] = 5
print(number_list) # [1, 5, 3, 4]

'About coding > Today I learned' 카테고리의 다른 글

2023년 03월 29일  (0) 2023.03.29
2023년 03월 28일 TIL  (0) 2023.03.28
2023년 03월 24일 TIL  (0) 2023.03.26
2023년 03월 23일 TIL  (2) 2023.03.23
2023년 03월 22일 TIL  (0) 2023.03.22