-
TIL 2023.03.31내일배움캠프 2023. 3. 31. 22:04
오늘은 어제 알고리즘 세션에서 배운 정렬 알고리즘을 분석해봤는데 새로운 걸 알게 되었다.
my_string_list[num1], my_string_list[num2] = my_string_list[num2], my_string_list[num1]
이런식으로 a, b = b, a 하면 서로 바뀌게 된다. 대박
그리고 팀과제 해설 강의에선 알게된 게 정말 많다.
딕셔너리의 활용이 정말 무궁무진한데,
class BaseCharacter: def __init__(self, name, hp, normal_power): self.name = name self.max_hp = hp self.current_hp = hp self.normal_power = normal_power self.actions = { "1": { "verbose": "일반 공격", "action": self.normal_attack, } } class Player(BaseCharacter): def __init__(self, name, hp, mp, normal_power, magic_power): super().__init__(name, hp, normal_power) self.max_mp = mp self.current_mp = mp self.magic_power = magic_power self.actions["2"] = { "verbose": "마법 공격", "action": self.magic_attack, } self.actions["3"] = { "verbose": "특수 공격", "action": self.special_attack, }
이런 식으로 클래스 이닛 안에 딕셔너리로 공격방식을 만들어 놓고
print("행동을 선택해주세요") # actions : {"1": {verbose: 일반공격, action: normal_attack}} for k, v in player.actions.items(): print(f"{k} : {v['verbose']}") # input("1 : 일반 공격, 2 : 마법 공격 ...") action = input("선택 : ") player.actions[action]["action"](monsters[selected_monster])
이렇게 만든 딕셔너리를 포문으로 돌려 출력하는 기발한 방법이 있었다.
이렇게 되면 클래스 내의 actions에만 공격 방식을 추가해주면 자동으로 출력되는 것에도 추가되기 때문에 휴먼에러를 방지할 수 있다.
또 if문 남발하지 않고 인풋으로 숫자를 입력받아
plyer.actions의 [입력받은 숫자의 키] [의 액션이라는 키를 가진 밸류(메쏘드)]() 로 메쏘드를 바로 호출할 수 있다.
Immutable과 Mutable
Immutable 객체는 수정이 불가능하고 int, float, str, tuple 같은 자료형이 있다.
Mutable 객체는 수정이 가능하고 list, dict 가 그렇다.
a = "asdf" a_ = a a_ + "123" print(a)
하면 asdf123 이 출력될까?
아니, asdf 가 출력된다.
문자열은 Immutable하기 때문에 a_ = a 라고 선언해줘도 다른 주소에 할당 되고. a_ 을 수정한다고 a에 영향을 주지 않는다.
Mutable한 리스트는 어떨까
a = [1, 2, 3] a_ = a a_.append(4) print(a)
여기선 [1, 2, 3, 4] 가 출력된다. 리스트는 Mutable하기 때문에 다른 변수로 선언해줘도 같은 주소에 할당된다. a_를 건드리면 a도 영향을 미친다.
'내일배움캠프' 카테고리의 다른 글
TIL 2023.04.03 (0) 2023.04.03 WIL 내일배움캠프 3주차 (0) 2023.03.31 TIL 2023.03.30 (0) 2023.03.30 TIL 2023.03.29 (0) 2023.03.29 TIL 2023.03.28 (0) 2023.03.28