super().

깨달았다.내 super가 왜 자꾸 에러를 발생시키는지..

나는 지금껏 super()를 super.__init__으로 써왔다.... 바보가 따로 없다..

 

return

함수를 쓰면서 항상 많이 쓰던건데 이걸 떠올리지 못하고 몇시간씩 해맸다...

팀원에게 물어보니 바로 해결해주었네! 역시 동기가 짱이야! 하지만

내가 짱이어야하는데.. 다른 사람이 아닌 내가 잘해야하는데.. 바보가 따로 없다..

 

항상 디테일이 부족하다고 생각했왔는데 코딩에서 그러한 문제점이 발견되는구나..

하나를 보더라도 집중해서 제대로 이해하고 다음거를 보도록 하자.

밤톨! 할 수 있다.! 밤나무가 될때까지!

캐릭터와 몬스터를 생성해서 1VS1 싸우는 상황 구현하기.

우선 과제를 듣고 어디서 어떻게 해야할지 막막했다. 그래서 천천히 요구사항, 가이드, 힌트를 천천히 읽으면서 분석을 시작했다.

  • 요구사항
    • 이름을 입력해 플레이어를 생성할 수 있어야 합니다.
    • → 클래스에서 init 함수를 쓰면 되겠다!
    • 몬스터는 임의 생성할 수 있어야 합니다.
    • → 이것도 몬스터 클래스 만들어서 init 하면 되겠다!
    • while 반복문을 사용해 종료 조건을 충족할 때까지 턴제 플레이어와 몬스터간 전투를 반복 진행해야 합니다.
    • → 오! while를 어떻게 사용하는지 완전히 익혀놔야겠다!
    • 플레이어는 공격 타입을 선택할 수 있어야 합니다. ex) 일반공격 , 마법공격
    • → input을 이용해서 구현하면 될 것 같기는 한데.. 정확히는 모르겠다.
    • 몬스터는 일반 공격을 할 수 있어야 합니다.
    • → 함수를 이용해서 hp에서 감소시키면 되겠다!
    • 매 전투시 플레이어와 몬스터의 상태 정보를 출력해야 합니다.
    • → 일단 옼케!
    • 모든 공격은 캐릭터의 파워 기준으로 랜덤성을 가지고있어야 합니다. ex) 파워가 10인경우 일반공격은 8~12사이의 랜덤한 값으로 공격
    • 일단 옼케!
    • 몬스터나 플레이어의 HP가 0이되면 전투를 종료하고 승리 또는 패배를 출력해야 합니다.
    • → 일단 옼케!

가능한 기본 가이드를 지켜 과제를 진행해주세요

  1. 시작
    • 플레이어 생성 (Player)
      • 이름
      • HP
      • MP
      • 파워
      • 일반공격
      • 마법파워
      • 마법공격
    • 몬스터 생성 (Monster)
      • 이름
      • HP
      • 일반공격
  2. 전투
    • 몬스터와 턴제 전투 (While 반복문 사용)
      • 플레이어, 몬스터 상태 출력
      • 플레이어의 공격 방법 선택 (일반, 마법)
      • 플레이어 공격
      • 몬스터 공격
  3. 종료
    • 승리 or 패배

→ 가이드 순서를 따라서 코드를 작성해야겠다고 생각을 했다.

 

힌트

힌트의 코드가 각각 무엇을 의미하는지 공부를 하기 시작.

class Character:
    """
    모든 캐릭터의 모체가 되는 클래스
    """
    #인스턴스를 만드는 함수.각각의 변수에 인자를 저장한다.
    def __init__(self, name, hp, power): 
        self.name = name
        self.max_hp = hp
        self.hp = hp
        self.power = power

	#공격 함수
    def attack(self, other):
    #데미지가 공격력의 ± 2 사이 랜덤하게 선택.
        damage = random.randint(self.power - 2, self.power + 2)
    #1인자의 체력은 인자의 (hp - 데미지,0) 중 높은 수를 선택하게 되어있네.
    #이게 왜 필요하지?
        other.hp = max(other.hp - damage, 0)
    #어택 함수의 출력 문장.
        print(f"{self.name}의 공격! {other.name}에게 {damage}의 데미지를 입혔습니다.")
    #2아~ 인자의 hp가 0이면 출력문이 나오는거네..
        if other.hp == 0:
            print(f"{other.name}이(가) 쓰러졌습니다.")
    #수정할 것 :#1과 2. 인자의 체력이 0보다 작으면 출력이 나오도록 하고 max도 빼버린다.

	#상태를 확인하는 함수.
    def show_status(self):
    #현재hp / max hp가 출력 되네.
        print(f"{self.name}의 상태: HP {self.hp}/{self.max_hp}")

그리고 가이드를 보면서 코드를 작성하기 시작했다.

플레이어 생성 부분부터!

  • 플레이어 생성 (Player)
    • 이름
    • HP
    • MP
    • 파워
    • 일반공격
    • 마법파워
    • 마법공격
class Character:
    """
    모든 캐릭터의 모체가 되는 클래스
    """

    def __init__(self, name, hp, mp, power, magic_power):
        self.name = name
        self.max_hp = hp
        self.hp = hp
        self.max_mp = mp
        self.mp = mp
        self.power = power
        self.magic_power = magic_power
        print(f'{name}이(가) 생성되었다.')
        print(f'체력{hp}, 마나{mp}, 일반공격력{power} ±2, 마법공격력{magic_power} ±20')

일반공격과 마법공격 함수.

"""
일반공격 함수
"""
def attack(self, other):
    damage = random.randint(self.power - 2, self.power + 2)
    other.hp = other.hp - damage
    print(f"{self.name}의 일반공격! {other.name}에게 {damage}의 데미지를 입혔습니다.")
    if other.hp < 0:
        print(f"{other.name}이(가) 쓰러졌습니다.")

"""
마법공격 함수
"""
def magic_attack(self, other):
    damage = random.randint(self.magic_power - 20, self.magic_power + 20)
    self.mp = self.mp - 30
    print('마나 30 소비')
    other.hp = other.hp - damage
    print(f"{self.name}의 마법공격! {other.name}에게 {damage}의 데미지를 입혔습니다.")
    if other.hp < 0:
        print(f"{other.name}이(가) 쓰러졌습니다.")

 

이제 몬스터 차례!

  • 몬스터 생성 (Monster)
    • 이름
    • HP
    • 일반공격
class Monster():
    """
    모든 몬스터의 모체가 되는 클래스
    """
    def __init__(self, name, hp, power):
        self.name = name
        self.max_hp = hp
        self.hp = hp
        self.power = power
        print(f'{name}이(가) 생성되었다.')
        print(f'체력{hp},공격력{power} ±2')
        print(f'{name}이(가)와 조우했다.')

일반공격 함수

"""
일반공격 함수
"""
def attack(self, other):
    damage = random.randint(self.power - 2, self.power + 2)
    other.hp = other.hp - damage
    print(f"{self.name}의 일반공격! {other.name}에게 {damage}의 데미지를 입혔습니다.")
    if other.hp < 0:
        print(f"{other.name}이(가) 쓰러졌습니다.")

 

  • 이름을 입력해 플레이어를 생성할 수 있어야 합니다.
  • → 클래스에서 init 함수를 쓰면 되겠다!
  • 몬스터는 임의 생성할 수 있어야 합니다.
  • → 이것도 몬스터 클래스 만들어서 init 하면 되겠다!
  • while 반복문을 사용해 종료 조건을 충족할 때까지 턴제 플레이어와 몬스터간 전투를 반복 진행해야 합니다.
  • → 오! while를 어떻게 사용하는지 완전히 익혀놔야겠다!
  • 플레이어는 공격 타입을 선택할 수 있어야 합니다. ex) 일반공격 , 마법공격
  • → input을 이용해서 구현하면 될 것 같기는 한데.. 정확히는 모르겠다.
  • 몬스터는 일반 공격을 할 수 있어야 합니다.
  • → 함수를 만들고 이용해서 hp에서 감소시키면 되겠다!
  • 매 전투시 플레이어와 몬스터의 상태 정보를 출력해야 합니다.
  • → 일단 옼케!
  • 모든 공격은 캐릭터의 파워 기준으로 랜덤성을 가지고있어야 합니다. ex) 파워가 10인경우 일반공격은 8~12사이의 랜덤한 값으로 공격
  •  일단 옼케!
  • 몬스터나 플레이어의 HP가 0이되면 전투를 종료하고 승리 또는 패배를 출력해야 합니다.
  • → 일단 옼케!

요구사항 체크를 하고 뭘 할지 생각을 해봄.

while문을 이용해서 전투를 구현해보자 생각을 함.

일단 인스턴스를 만든다.

C1 = Character('용사', 100, 80, 20, 20)
M1 = Monster('발록',100,20)

그 밑에 while을 이용해서 둘 중 하나의 체력이 0보다 크면 서로 공격하게 만듦.

그리고 hp <=0 이면 끝내도록 함.

while C1.hp > 0 or M1.hp > 0:
    C1.attack(M1)
    M1.attack(C1)
    if C1.hp <= 0 or M1.hp <= 0:
        exit()

공격함수에 0 < 이면 쓰러졌다고 출력하게 되어 있어서 <=으로 수정함.

그리고 M1이 죽었는데도 발악하면서 또 공격을 하는 모습을 보여줌; 문제점 발견!!

용사의 일반공격! 발록에게 22의 데미지를 입혔습니다.
발록이(가) 쓰러졌습니다.
발록의 일반공격! 용사에게 22의 데미지를 입혔습니다.

체력이 0 이하가 되면 아무 행동도 못하도록 수정함.

그리고 C1이 죽으면 패배. M1이 죽으면 승리. 출력을 하도록 함.

while C1.hp > 0 or M1.hp > 0:
    if C1.hp <= 0:
    	print('패배..')
        exit()
    C1.attack(M1)
    if M1.hp <= 0:
    	print('승리!')
        exit()
    M1.attack(C1)

각각 행동 전에 체력을 확인하도록 함.

발록이 죽고 발악하지 않음. 오오~ 해결했어~~

결과 승리랑 패배까지 출력이 잘 되네!

발록의 일반공격! 용사에게 19의 데미지를 입혔습니다.
용사의 일반공격! 발록에게 20의 데미지를 입혔습니다.
발록이(가) 쓰러졌습니다.
승리!
  • 이름을 입력해 플레이어를 생성할 수 있어야 합니다.
  • → 클래스에서 init 함수를 쓰면 되겠다!
  • 몬스터는 임의 생성할 수 있어야 합니다.
  • → 이것도 몬스터 클래스 만들어서 init 하면 되겠다!
  • while 반복문을 사용해 종료 조건을 충족할 때까지 턴제 플레이어와 몬스터간 전투를 반복 진행해야 합니다.
  • → 오! while를 어떻게 사용하는지 완전히 익혀놔야겠다!
  • 플레이어는 공격 타입을 선택할 수 있어야 합니다. ex) 일반공격 , 마법공격
  • → input을 이용해서 구현하면 될 것 같기는 한데.. 정확히는 모르겠다.
  • 몬스터는 일반 공격을 할 수 있어야 합니다.
  • → 함수를 만들고 이용해서 hp에서 감소시키면 되겠다!
  • 매 전투시 플레이어와 몬스터의 상태 정보를 출력해야 합니다.
  • → 일단 옼케!
  • 모든 공격은 캐릭터의 파워 기준으로 랜덤성을 가지고있어야 합니다. ex) 파워가 10인경우 일반공격은 8~12사이의 랜덤한 값으로 공격
  •  일단 옼케!
  • 몬스터나 플레이어의 HP가 0이되면 전투를 종료하고 승리 또는 패배를 출력해야 합니다.
  • → 일단 옼케!

이제 공격을 선택 할 수 있도록 구현을 해보도록 했다. 해결이 하나씩 되면서 재미있어졌다.

참 웃기게도 과제를 받은 날 잠을 자는데 꿈에서도 코딩을 하기 시작했다. 공격 선택하는 부분은 input으로 하면 되겠다 생각을 하면서 잠이 깼다. 꿈인지 선잠 중 생각인지 정확히 모르겠다... 여튼!

while문을 공부를 하면서 선택지 중 input값으로 선택하는 예제가 있어서 바로 공부를 시작! 역시 input이 해결 방법이었어!

고맙습니다! 점프 투 파이썬! 쵝오!!

https://wikidocs.net/21

 

03-2 while문

[TOC] ## while문의 기본 구조 반복해서 문장을 수행해야 할 경우 while문을 사용한다. 그래서 while문을 반복문이라고도 부른다. 다음은 while문의 기본 …

wikidocs.net

프롬프트를 만들고 변수 = 0을 만들어 줬다. 변수를 안주며 에러가 난다!

prompt = """
... 1. 일반공격 : 데미지 20 ± 2
... 2. 마법공격 : 데미지 20 ±20 MP -30
... 3. 스테이터스 확인
... 4. 도망치기(게임종료)
... 행동선택: """
number = 0

그리고 C1의 공격일 때 행동을 선택해야해서 용사의 체력이 0 이하가 아닐 때 행동선택을 프린트하고 각 선택에 어떤 함수를 불러오고 출력할지 적어줌.

while C1.hp >= 0 or M1.hp >= 0:
    if C1.hp <= 0:
        print('패배..')
        exit()
    print(prompt)
    number = int(input())
    if number ==1:
        C1.attack(M1)
    if number ==2:
        if C1.mp < 30:
            print('마나가 부족합니다!')
            continue
        else:
            C1.magic_attack(M1)
    if number ==3:
        print('스테이터스를 확인합니다.')
        C1.show_status()
        M1.show_status()
        continue
    if number ==4:
        print('도망쳤다.')
        print('용기를 가져라!')
        exit()
    if M1.hp <= 0:
        print('승리!')
        exit()
    else:
        M1.attack(C1)
  • 이름을 입력해 플레이어를 생성할 수 있어야 합니다.
  • → 클래스에서 init 함수를 쓰면 되겠다!
  • 몬스터는 임의 생성할 수 있어야 합니다.
  • → 이것도 몬스터 클래스 만들어서 init 하면 되겠다!
  • while 반복문을 사용해 종료 조건을 충족할 때까지 턴제 플레이어와 몬스터간 전투를 반복 진행해야 합니다.
  • → 오! while를 어떻게 사용하는지 완전히 익혀놔야겠다!
  • 플레이어는 공격 타입을 선택할 수 있어야 합니다. ex) 일반공격 , 마법공격
  • → input을 이용해서 구현하면 될 것 같기는 한데.. 정확히는 모르겠다.
  • 몬스터는 일반 공격을 할 수 있어야 합니다.
  • → 함수를 만들고 이용해서 hp에서 감소시키면 되겠다!
  • 매 전투시 플레이어와 몬스터의 상태 정보를 출력해야 합니다.
  • → 일단 옼케!
  • 모든 공격은 캐릭터의 파워 기준으로 랜덤성을 가지고있어야 합니다. ex) 파워가 10인경우 일반공격은 8~12사이의 랜덤한 값으로 공격
  •  일단 옼케!
  • 몬스터나 플레이어의 HP가 0이되면 전투를 종료하고 승리 또는 패배를 출력해야 합니다.
  • → 일단 옼케!

이번주는 운빨이 끝내줬는지 막막하던 과제를 잘 해결하게 되었다. 재미있는 경험이었고 자신감 소폭 상승! 오옷!

아 그리고 오늘 아침도 상속을 사용하면 더 코드가 깔끔해지지 않을까 했는데 상속받는 Monster 클래스를 전부다 수정해서 사용했기 때문에 상속이 의미가 없을 거라 판단하여 작업을 중지했다.

이제 다른 공부하러 가보자~~ 이 글은 과제 마감기한 이후 공개로 돌릴 예정.

게임을 해보고 싶으시다면 깃을 방문해주세요~

https://github.com/JJJ-1443/python-battle01/commits/main

 

GitHub - JJJ-1443/python-battle01: Player vs Monster

Player vs Monster. Contribute to JJJ-1443/python-battle01 development by creating an account on GitHub.

github.com

 

PR (Pull request) : 최종 프로젝트에 작업한 내용을 반영할지 리뷰하는 것.

github을 이용해서 PR을 할 수 있다.

PR을 한 후에 브랜치를 삭제한다.

Fork : 다른사람의 깃허브 커밋들을 내 깃허브로 가져오는 것.

이  포크를 이용해 클론을 만들 수 있다.

 

amend(고치기) : git commit 되돌리기 

나만 작업하는 브랜치에만 되돌려야한다. 안그럼 큰일남..

커밋 되돌리기(revert) :커밋하기 전 파일로 돌아감. 커밋이 변경되었다는 알림.

reset : 파일을 되돌림. 커밋이 변경되었다는 알림이 없음.

 

stash : 변경사항 임시 보관하기

커밋하지 않은 내용들이 날아가지 않게 잠시 보관하는 것.

핫픽스 : 갑작스럽게 해야할 작업을 말함.

내 작업하다 핫픽스가 생기면 스태시를 하는 거임.

스태시 불러오고 삭제하는게 깔끔함.

스태시 여러번 하지 않도록 주의해야함. 스태시를 살펴보고 불러와서 삭제 후 다시 작업하고 다시 스태시하는게 중요함.

 

작업으로 의사소통하기!

커밋 메시지 작성하기!

https://meetup.toast.com/posts/106

 

좋은 git 커밋 메시지를 작성하기 위한 7가지 약속 : NHN Cloud Meetup

git커밋

meetup.nhncloud.com

커밋단위

적절한 단위로 코드를 짜야한다.

 

코드리뷰로 피드백

코드 품질 향상

관점의 전환으로 버그 발견

서로의 지식 공유로 더 나은 방법 제시.

 

Git 프로젝트 관리

파일 명 앞에 .~~ 면 숨김파일이 된다.

.gitignore파일을 만들어서 안에 파일 이름과 확장자명을 적어주면 그 파일은 커밋되지 않도록 할 수 있다. 

https://gitignore.io

파이썬 파일을 ignore 하고 싶다면 python create하고 내용들을 gitignore에 붙여넣어주면 파이썬의 파일들은 커밋되지 않는다.

 

gitignore.io

Create useful .gitignore files for your project

www.toptal.com

README

md : 마크다운

마크다운은 파일 형식이다.

프로젝트를 소개하는 글.

 

Github 에서 정보 얻기 - 개발자의 SNS

잘 짠 코드를 많이 보고 따라할수록 실력이 빨리 향상된다.

많이 보고 공부하도록 하자.

 

오픈 소스

다른 프로젝트에 참가하여 기여할 수 있다.

'Git 스파르타' 카테고리의 다른 글

Git 활용 기초. 2  (0) 2023.03.26
Git 활용 기초 1.  (0) 2023.03.20

Pull Request : 제안 사항 보내놓는 것. 예를 들면 머지하기전에 해도될지 물어보는것도 Pull Request.

issue tracker, issue tracking tool : 이슈 관리를 할 수 있는 도구.

flow : 작업하는 방법을 통틀어 말하는 것.

 

문제 발생

Conflict(충돌) - 두명이 같은 파일을 수정해서 원격리포에 push하게 되면 충돌이 난다. 두명이 작업한 파일중 어떤걸 반영해야할지 깃이 모르기 때문에 발생하는 에러다.

해결법

  1. 누가 이 작업을 할 것인지 정한다. (이슈 할당)
  2. 각자 맡은 것을 각자의 작업공간에서 작업한다. (작업공간 : 브랜치)
  3. 각자 작업을 프로젝트에 합칠 수 있게 공유한다. (병합,머지(= merge))
  4. 작업한 내용을 리뷰하고 최종적으로 프로젝트에 반영한다.(코드리뷰 : 피드백)

이슈할당

  • 이슈(issue) : 프로젝트에서 해결해야할 문제를 뜻함.
  • Assignees - 양수인, 누가 이슈를 맡을 것인지 정함.
  • Labels - 어떤 종류의 이슈인지.
  • 이슈마다 번호가 있다. #n
  • close issue - 이슈 작업이 끝났다면 닫는다. reopen 할 수 있다.

이슈와 연관된 커밋 만들기

커밋 메세지에 #n을 입력하면 된다.

 

Branch

김치 요리법 : main branch

김치찜 요리법 : sub branch merge → main branch

 

브랜치 만들기

브랜치 만들 부분 찾고 우측 마우스버튼 누르고 브랜치 누르면 갈라져 나올 수 있다.

네이밍 : feature/2_jjigae (=종류(기능,버그등)/2번 이슈_이름.)

체크아웃 : 작업할 브랜치를 선택하는 것.

브랜치를 삭제하면 갈라져나오기 전 브랜치의 내용으로 돌아온다.

 

Merge

브랜치와 커밋한 내용들을 합친다.

병합을 누르고 어떤 브랜치와 머지할지 선택하면 된다.

 

Merge conflict(병합 충돌)

<<<<<<< HEAD

현재 브랜치의 상태.

=======

병합하려했던 브랜치의 상태


충돌났을때는 새로운 내용 추가하지말고 충돌한 내용만 해결하고

다시 새로운 내용 추가하고 커밋하는게 중요.

충돌을 해결하고 바로 새로운 내용을 추가해버리면 

유의마한 변화 두개가 생겨서 추적하기 어려울 수 있다.

 

원격 repo 와 Branch

트래킹의 단위는 브랜치다. 나는 통째로 다 트래킹하는 줄 알았다...

푸시할 때 다른 브랜치로 푸시하면 새로운 원격 브랜치가 생긴다.

 

 

 

 

'Git 스파르타' 카테고리의 다른 글

Git 활용 기초. 3  (0) 2023.03.27
Git 활용 기초 1.  (0) 2023.03.20

1일 파이썬 기초강의 완강, 웹 프로그래밍 기초 5주차 완강, 좋은 개발자의 비밀 특강, Git 활용 기초 1주차.

2일 파이썬 부교재 정리

3일 파이썬 부교재 정리 2,3

4일 파이썬 문법 심화 1

5일 파이썬 문법 심화 2

 

이번주는 지속적으로 파이썬을 공부했다. 첫날에 깜빡하고 부교재가 있는 걸 모르고 다른 공부를 해버렸다.

다음에는 그런 실수 하지 말자.

그리고 무엇보다 반복 숙달이 중요한 듯 하다.

강의를 여러번 들으면서 혼자 해보고 잘 안되면 에버노트에 적어놓고 계속 연습을 하는 식으로 공부를 하고 있다.

매일 잘 모르는 부분 복습,연습하면 잘해진다!

 

그리고 모든 문법을 다 정리하면서 공부를 하니까 양이 방대해지고 지쳐간다. 모르는것만 잘 정리해서 TIL을 쓰도록 하자.

 

오늘 발제된 개인과제는 정말 쉽지 않아보인다... 클래스 잘 사용하는 것부터 시작을 해야겠다.

주말동안 열심히 달려보자구!!

 

정규표현식(regex)

  • regular expression의 약자.
  • 문자열이 특정 패턴과 일치하는지 판단.
  • 다양한 패턴을 지정하고 검증 할 수 있다.

이메일 형식 검증 하기.

  1. 숫자, 알파벳 대/소문자, 일부 특수문자(-_.) 조합한 문자
  2. @
  3. @ 이후에 숫자,알파벳 대/소문자, 일부 특수문자(-_.)를 조합한 문자.
  4.  3번 이후로 .이 한 개 이상 포함.
  5. 이후에는 2~4글자의 숫자, 알파벳 데/소문자, 일부 특수문자(-_.)를 조합한 문자 포함.
  • 정규표현식을 사용하지 않으면 하나하나 다 조건문,반복문 써서 검증해줘야한다.
  • 정규표현식을 사용하면 정규표현식 패턴의 코드를 짜는 것은 어렵지만 코드는 간소화된다.
  • 이미 만들어져 있고 검증 된 정규표현식을 가져다 쓰는 것을 권장.
  • 문법을 설명해주고 예제를 보여주는 사이트 참고하는것도 좋음.

https://regexr.com/

 

RegExr: Learn, Build, & Test RegEx

RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).

regexr.com

\n : 개행

\t : 들여쓰기

r을 붙이면 문자열로 받아들인다.

test = r"\n\t"
\n\t

 

파일과 디렉토리 다루기

glob 이용해서 파일과 디렉토리 목록 확인.

  • ./는 현재 python 파일이 위치한 경로를 의미
  • ./venv/*은 venv 폴더 내 모든 파일들을 의미
  • 윈도우는 경로를 나타낼때 \\ 를 씀.
  • 경로를 검색할때와 나타낼 때가 다르기 때문에 오류가 발생 할 수 있어서 replace를 써서 통일 시켜주는게 안전.
  • glob은 기본적으로 하위폴더를 탐색하지 않음.
  • recursive=True를 사용하면 하위폴더를 탐색함../venv/**별 두개를 붙여줘야함./*.py를 붙여주면 파이썬 파일만 찾음.

open을 활용한 파일 다루기

  • f = open("file.txt", "w", encoding="utf-8")
  • 같은 경로의 파일을 열게 되고 w는 write모드로 열겠다 라는 뜻이다. 인코딩 설정을 잘 못하면 글자가 깨진다.
  • f.write("파이썬 파일 쓰기 테스트!\n") 파일을 생성하고 입력하게 된다.
  • f.close() 파일을 닫는다는 뜻이다.
  • 모드 : w 쓰기 r 읽기 a 추가(append). w는 파일의 내용이 있든 없든 처음부터 새로 씀.
  • with open("file.txt", "a", encoding="utf-8") as w: w.write("파이썬 내용 추가 테스트!")
  • with는 따로 close 하지 않아도 된다.
  • with open("file.txt", "r", encoding="utf-8") as r: print(r.readlines())
  • readlines은 파일의 모든 내용을 list 자료형으로 한번에 읽어들인다.
  • 내용이 수백 줄이면 readline으로 한줄만 읽는다.

itertools

루핑 : 계속하여 반복 중.

데카르트 곱

from itertools import product

sample1 = ["A", "B", "C", "D", "E"]
sample2 = [1, 2, 3, 4]

# 행 / 열을 구분하여 프린트 하기 위해 enumerate 사용
for i, v in enumerate(product(sample1, sample2), 1):
    print(v, end=" ")
    if i % len(sample2) == 0:
        print("")

서로 다른 n개의 원소에서 r개를 중복없이 순서에 상관있게 선택하는 혹은 나열하는 것을 순열

원소의 개수가 n개임 순열

```python
from itertools import permutations

sample = ["A", "B", "C"]

# 원소의 개수가 3개인 순열 출력. 2로 바꾸면 2개로 나옴.
for i in permutations(sample, 3):
    print(i)

# result output
"""
('A', 'B', 'C')
('A', 'C', 'B')
('B', 'A', 'C')
('B', 'C', 'A')
('C', 'A', 'B')
('C', 'B', 'A')
"""
```

원소의 개수가 n개인 조합 구하기

from itertools import combinations

sample = ["A", "B", "C"]

# 원소의 개수가 2개인 조합 출력
for i in combinations(sample, 2):
    print(i)

원소의 개수가 n개인 조합 구하기 (중복허용)

from itertools import combinations_with_replacement

sample = ["A", "B", "C"]

# 중복을 포함한 원소의 개수가 3개인 조합 출력
for i in combinations_with_replacement(sample, 3):
    print(i)

# result output
"""
('A', 'A', 'A')
('A', 'A', 'B')
('A', 'A', 'C')
('A', 'B', 'B')
('A', 'B', 'C')
('A', 'C', 'C')
('B', 'B', 'B')
('B', 'B', 'C')
('B', 'C', 'C')
('C', 'C', 'C')
"""

requests

  • 파이썬에서 http 통신을 가능하게 해주는 모듈.
  • 웹크롤링 하거나 api 통신이 필요할 때 사용.
  • requests 모듈을 사용하면 네이버를 코드로 받아 올 수 있다.는 의미.
  • 네가지 메소드.
  • GET : 데이터 정보 요청.
  • POST : 데이터 생성 요청.
  • PUT : 데이터 수정 요청
  • DELETE : 데이터 삭제 요청.
  • 네가지 메소드나 status code를 받아오는 방식은 http 통신의 특성. 파이썬과 관련이 없다.
  • http 통신을 파이썬 코드로 구현하는 것.
  • 요청을 하면 response 을 내려주고 content 와 status code를 받아오게 된다.

 json 다루기

딕셔너리와 유사한형태.

제이슨 모듈  임포트.

제이슨을 불러오면 문자열이기 때문에 수정하기 위해선 딕셔너리로 변경해야한다.

 

데코레이터

 

강의 내용을 암기하는 것이 아닌 '파이썬으로 이런것도 할 수 있구나 를 이해하는 것이 학습 목표.

프로젝트 하면서 '파이썬으로 이런 것도 할 수 있었지?' 떠올리면서 강의를 보거나 구글링해서 이용하면 된다.

 

코딩 컨벤션(Coding conventions) : 코딩 스타일 규약. 규약이 없다면 코드 의도 파악이나 오류를 찾기어려움.

 

Cmd 터미널로 파이썬 파일 실행 시키기

  • 현재 위치가 파일의 위치가 맞는지 확인.
  • 명령문 작성. python main.py
  • 가상환경을 공부할 때 터미널을 잘 다루어야 하기 때문에 이와 같은 방법으로 실행시킨다.

가상환경(Virtual envirnoment, venv)

  • 파이썬은 pip 라는 패키지 인스톨러를 사용해 패키지를 설치하고 관리.
  • 패키지를 설치하게 되면 파이썬을 실행하는 모든 환경에 설치하게 됨.
  • 프로젝트 마다 사용하는 패키지들이 다를 경우 (A 는 a-1을 사용. B는 a-2) 버전만 다른 a-1, a-2는 충돌을 일으킬 가능성이 있다.
  • 그렇기 때문에 프로젝트마다 격리된 환경을 구성 하기 위해 가상환경 사용.

가상환경 만들기

  • 명령문 : python -m venv venv
  • python -m venv(가상환경 만들거야.) venv(폴더 이름은 이거야.{바꾸어도 됨})

 

가상환경 활성화

  • 명령문 : venv(가상환경 폴더 이름)\Scripts\activate
  • 명령문 뜻 : venv 폴더에 있는 Scripts 폴더에 있는 activate 파일 실행.
  • tab :  자동완성.

패키지 설치

  • 명령문 : pip install (패키지이름)
  • venv에 많은 패키지가 설치되어 있어도 venv가 활성화 되어 있지 않다면 사용을 못함.
  • 프로젝트 마다 독립된 한경이기 때문에 새 프로젝트라면 다시 설치해주어야 함.

패키지 사용하기

  • 명령문 : pip install reqiests (터미널에 명령을 내려야함.)
  • 명령문 : import requests

가상환경 비활성화

  • 명령문 : deactivate (터미널)

코드 컨벤션

  • 각 언어에는맞는 코드 컨벤션이 존재.
  • 다른 사람들이 짠 코드를 쉽게 이해하기 위해 스타일을 통일하자는 약속.
  • 파이썬은 PEP 8 로 약속 되어 있다.

 

네이밍 컨벤션

  • 함수, 변수, 클래스 등 이름을 지을 때 방식을 말함.
  • 함수 , 변수 : Snake 표기법
  • 클래스 : Pascal 표기법 (PythonIsVeryGood 각 띄어쓰기마다 대문자로.)
  • Camel은 자바에서 주로 사용 : pythonIsVeryGood
  • Uper Camel Case :PythonIsVeryGood (pascal과 같다. 파이썬은 주로 camel 표기법을 사용한다도 맞는 말이다. 하지만 Pascal 이라고 주로 부름.)
  • Lower Camel Case : pythonIsVeryGood
  • Snake 표기법 : python_is_very_good
  • 상수 네이밍은 모두 대문자, 길게 정의한다면 Snake를 대문자로 사용.
  • 이름만 보고도 내용이 뭔지 추측할 수 있도록 직관적이게 짓는다.

Formetter

  • 코드를 컨벤션에 맞게  개행,정렬 해준다.
  • 환경설정에 python formatting 검색하고 python > Formatting: Provider를 autopep8 로 설정. format on save를 검색하고 체크해주면 저장 할때 개행,정렬 해준다. autopep8 패키지를 설치해 주어야 한다.

변수 유효 범위(variable scope)

  • 변수가 선언된 위치나 키워드에 따라 변수를 사용할 수 있는 범위가 달라짐.
  • 유효 범위에 따라 지역변수(local variable), 전역변수(global variable)로 나뉨.
  • 지역변수 : 함수 내부에서 선언되며 다른 함수에영향을 끼치지 않음.
  • 전역변수 : 함부 밖에서 선언되며 어디서든 접근할 수 있음.
  • 지역 변수로 선언된 변수는 global 키워드 사용해 전역 변수호 재선언 할 수 있음.
def func1():
    test = 123


# test는 지역변수다.
# 그러므로 다른 함수에 영향을 끼치지 못한다.


def func2():
    print(test)


func1()
func2()
NameError: name 'test' is not defined

지역 test와 전역 test는 연관이 없는 코드다.

test = 123


def func1():
    test = 456
    print(test)


func1()

456
test = 123


def func1():
    test = 456
    print(test)


def func2():
    print(test)


func1()
func2()

456
123

func1의 test를 전역변수로 사용하고 싶을때 global

 

test = 123


def func1():
    global test
    test = 456
    print(test)


def func2():
    print(test)


func1()
func2()

456
456

global를 사용할때 코드가 길어지면 어디서 값이 도출된 것인지 모를때가 많아진다.

그땐 return으로 결과값을 받아와서 사용하는 것이 더 좋다.

test = 123


def func1():
    return 456


def func2(value):
    print(value)


result = func1()
func2(result)

자주 사용되는 모듈 및 패턴

type() : 값의 자료형 확인

  • print(type(변수) 또는 print(a, type(a)) : 변수에 담긴 자료형이 어떤 것인지 알 수 있다.
  • 모듈로 값을 받아올 때 어떤 자료형인지 구분하기 어려울 때 사용. 1 인지 '1' 인지..

split() : string을 list로 변환

  • split() : 괄호 값 기준으로 문자를 리스트 형태로 쪼갠다.
a = "안녕 친구들!!"
b = a.split(" ")
print(b)
['안녕', '친구들!!']

join() : list를 string으로 변환

  • join() : 괄호 값은 리스트가 된다.
  • 밑에 예제에서  처럼 큰따옴표 내용을 리스트 사이에 넣어 합치게 된다..  b = " ".join(a)
a = ['안녕', '친구들!!']
b = " ".join(a)
print(b)

replace() : 문자열 바꾸기

  • replace("!", "~") : 괄호 왼쪽 값을 오른쪽 값으로 바꾸겠다 라는 뜻이다.
a = "안녕 친구들!!"
b = a.replace("!", "~")
print(b)
안녕 친구들~~

pprint() : 코드 예쁘게 출력하기

  • 임포트 해줘야 한다. : from pprint import pprint
from pprint import pprint

sample_data = {
    "id": "0001",
    "type": "donut",
    "name": "Cake",
    "ppu": 0.55,
    "batters":
        {
            "batter":
                [
                    {"id": "1001", "type": "Regular"},
                    {"id": "1002", "type": "Chocolate"},
                    {"id": "1003", "type": "Blueberry"},
                    {"id": "1004", "type": "Devil's Food"}
                ]
        },
    "topping":
        [
            {"id": "5001", "type": "None"},
            {"id": "5002", "type": "Glazed"},
            {"id": "5005", "type": "Sugar"},
            {"id": "5007", "type": "Powdered Sugar"},
            {"id": "5006", "type": "Chocolate with Sprinkles"},
            {"id": "5003", "type": "Chocolate"},
            {"id": "5004", "type": "Maple"}
        ]
}

pprint(sample_data)
{'batters': {'batter': [{'id': '1001', 'type': 'Regular'},
                        {'id': '1002', 'type': 'Chocolate'},
                        {'id': '1003', 'type': 'Blueberry'},
                        {'id': '1004', 'type': "Devil's Food"}]},
 'id': '0001',
 'name': 'Cake',
 'ppu': 0.55,
 'topping': [{'id': '5001', 'type': 'None'},
             {'id': '5002', 'type': 'Glazed'},
             {'id': '5005', 'type': 'Sugar'},
             {'id': '5007', 'type': 'Powdered Sugar'},
             {'id': '5006', 'type': 'Chocolate with Sprinkles'},
             {'id': '5003', 'type': 'Chocolate'},
             {'id': '5004', 'type': 'Maple'}],
 'type': 'donut'}

pprint 안쓸때

{'id': '0001', 'type': 'donut', 'name': 'Cake', 'ppu': 0.55, 'batters': {'batter': [{'id': '1001', 'type': 'Regular'}, {'id': '1002', 'type': 'Chocolate'}, {'id': '1003', 'type': 'Blueberry'}, {'id': '1004', 'type': "Devil's Food"}]}, 'topping': [{'id': '5001', 'type': 'None'}, {'id': '5002', 'type': 'Glazed'}, {'id': '5005', 'type': 'Sugar'}, {'id': '5007', 'type': 'Powdered Sugar'}, {'id': '5006', 'type': 'Chocolate with Sprinkles'}, {'id': '5003', 'type': 'Chocolate'}, {'id': '5004', 'type': 'Maple'}]}

 

random : 랜덤한 로직이 필요할 때

  • 임포트 해줘야한다. : import ramdom
  • 리스트 무작위로 섞기
import random

a = [1, 2, 3, 4, 5,]
random.shuffle(a)
print(a)
[1, 4, 5, 2, 3]
  • 1에서 10까지 무작위 숫자 생성
import random

a = random.randint(1, 10)
print(a)

time : 시간 다루기

  • 임포트 해줘야한다. : import time
import time

a = time.time() #시작 시간 저장
time.sleep(1) # 1초간 대기
b = time.time() #종료 시간 저장
print(f"코드 실행 시간 : {b-a:.5f}") #5f는 소수점 다섯째 자리 까지 출력
코드 실행 시간 : 1.00065

datetime : 날짜 다루기

  • 임포트 해줘야한다. : from datetime import datetime, timedelta
from datetime import datetime
print(datetime.now()) #현재시간 출력하기
2023-03-23 14:10:19.784002
  • datetime은 클래스로 되어있어서 spilt 하거나 join 하거나 하려면 str로 바꿔줘야한다.
from datetime import datetime
a = datetime.now()
b = a.split(" ")
print(b)
AttributeError: 'datetime.datetime' object has no attribute 'split'
from datetime import datetime
a = datetime.now()
print(a, type(a))
2023-03-23 14:21:45.828411 <class 'datetime.datetime'>
from datetime import datetime
a = str(datetime.now())
b = a.split(" ")
print(b)
['2023-03-23', '14:20:40.195673']

strptime() : datetime.datetime 클래스로 변경할 수 있다.

from datetime import datetime, timedelta


date_str = '2023-03-23 14:27'
date_class = datetime.strptime(date_str, "%Y-%m-%d %H:%M")
print(date_class, type(date_class))
2023-03-23 14:27:00 <class 'datetime.datetime'>
%y : 두 자리 연도 / 20, 21, 22
%Y : 네 자리 연도 / 2020, 2021, 2022
%m : 두 자리 월 / 01, 02 ... 11 ,12
%d : 두 자리 일 / 01, 02 ...  30, 31
%I : 12시간제 시간 / 01, 02 ... 12
%H : 24시간제의 시간 / 00, 01 ... 23
%M : 두 자리 분 / 00, 01 ... 58, 59
%S : 두 자리 초 / 00, 01 ... 58, 59

strftime() : datetime.datetime 클래스를 문자열로 변경

date_str = datetime.strftime(now, "%y/%m/%d") 형식은 변경 할 수 있다.

from datetime import datetime, timedelta


now = datetime.now()
date_str = datetime.strftime(now, "%y/%m/%d %H:%M:%S")
print(date_str, type(date_str))
23/03/23 14:33:42 <class 'str'>

timedelta() : 날짜를 더하고 뺄 수 있다.

timedelta를 임포트해줘야함다.

from datetime import datetime, timedelta

tda = datetime.now() - timedelta(days=2)
print(tda, type(tda))
2023-03-21 14:40:18.096321 <class 'datetime.datetime'>

문자열

from datetime import datetime, timedelta

tda = str(datetime.now() - timedelta(days=2))
print(tda, type(tda))
2023-03-21 14:41:10.011829 <class 'str'>

조건문 심화

'''== : 값이 일치하는지 비교'''
"a" == "a" # True
"a" == "b" # False
1 == "1" # False, 값은 동일하지만 자료형이 다르기 때문

'''!= : 값이 일치하지 않는지 비교'''
0 != 1 # True
0 != 0 # False

'''>, < : 값이 큰지 작은지 비교'''
5 > 2 # True
1 < 0 # False
1 > 1 # False

'''>=, <= : 값이 크거나 같은지, 작거나 같은지 비교'''
1 >= 1 # True

'''in : 특정 값이 list / tuple / set에 포함되어 있는지 확인'''
4 in [1, 2, 3] # False
1 in (1, 2, 3) # True

# 모든 비교 연산자의 결과는 print()로 확인할 수 있습니다.
print(1 == 1) # True

If문은 true냐 false 냐에 따라 통과시켜주는 것이다.

a = 20
if a>10:
    print('참')
else:
    print('거짓')

분기문

a = 25
if a > 20:
    print('20이상')
elif a > 10:
    print('10이상')
else:
    print('나머지')

and : 조건이 다 만족 되어야 참

참이면서 거짓이면 참!

if True and False:
    print('통과!!')

or : 한가지만 만족 되어도 참

참이거나 거짓이면 참!

if True or False:
    print('통과!!')
통과!!

우선순위 : 괄호로 우선순위를 줄 수 있다.

참이거나 거짓이고 또 참이면 참!

if (True or False) and True:
    print('통과!!')
통과!!

비어있는 string, list 등은 False 로 판단.

a = []
b = ""

if not a:
    print('a가 거짓이면 참이 되므로 출력된다.')
if not b:
    print('b가 거짓이면 참이 되므로 출력된다.')
a가 거짓이면 참이 되므로 출력된다.
b가 거짓이면 참이 되므로 출력된다.

bool() 함수로 참인지 거짓인지 확인하기

print(bool(""))
print(bool(0))
print(bool([]))

print(bool([""]))

print(bool("sample"))
print(bool([1, 2]))
print(bool(1))
print(bool(-1))

False
False
False

True

True
True
True
True

all  과 any

  • 리스트를 인자로 받게 된다.
  • all은 모든 인자들이 참이어야 통과!
  • any는 하나의 인자만 참이어도 통과!
if all([True, False, True]):
    print('all이 참이면 출력!')
if any([False, False, True]):
    print('any가 참이면 출력!')

any가 참이면 출력!

함수의 인자와 리턴 타입

여러 함수가 있고 비슷해 보여도 사용법이나 리턴 타입이 달라 기능을 알고 사용해야한다.

sort() : 변수를 정렬해준다. 정렬된 값을 다른 변수에 담을 수 없다.

a = [5, 4, 3, 2, 1]
a.sort()
print(a)
[1, 2, 3, 4, 5]

sorted() : 정렬된 값을 return 한다. 변수 a가 정렬 된게 아니다. 다른 변수에 담을 수 있다.

a = [5, 4, 3, 2, 1]
b = sorted(a)

print(b)
[1, 2, 3, 4, 5]
a = [5, 4, 3, 2, 1]
b = a.sort()

print(b)
None

리턴 타입 확인하기

1. 구글링

2. docstring

3. 함수 구현 코드 확인

내장 함수는 속도를 위해 c언어로 컴파일 되어 해당 되지 않을 수 있지만

외부 라이브러리를 이용한다면 구현부 코드를 보고 익히는 것이 좋은 방법이다.

구현 코드 확인 방법은 import 하고 ctrl 누르고 클릭하게 되면 볼 수 있다.

 

try /execption

  • 파이썬은 에러가 발생하면 코드를 중지하게 되어있는데 try/ execption을 사용하면 계속 실행 시킬 수 있다.
  • Exception 에러들을 e로 정의하고 그 그  에러를 출력한다.
  • 권장하지 않음!
try:
    x = int(input("나눌 수를 입력하세요: "))
    y = 100 / x
except ZeroDivisionError:
    print('0으로는 나눗셈 못해!')
except ValueError:
    print('문자열로 나눗셈 못하거든?!')
except Exception as e
    print(f"다른 에러들은 여기로! : {e}")

패킹과 언패킹

요소를 묶어주거나 풀어주는 것을 함. list나 dictionary의 값을 함수에 입력할 때 주로 사용.

매개변수 앞에 *은 모든 인자를 args에 집에 넣겠다 라는 뜻이다. args = arguments 인자들을 뜻한다.

인자에 *을 붙인 것은 언패킹을 의미한다.

def add(*args):
    result = 0
    for i in args:
        result += i
        
    return result
    
numbers = [1, 2, 3, 4]

print(add(*numbers))
10

딕셔너리 형태로 나오게 된다.

def good(**kwargs):
        print(kwargs)

good(name='jhon', age=29)

kwargs.get은 인자에 같은 같은 이름의 키값과 고유의 밸류가 있다면 가져가서 딕셔너리로 만든다. 값이 없다면 대시가 나온다.

def set_profile(**kwargs):
    profile = {}
    profile["name"] = kwargs.get("name", "-")
    profile["gender"] = kwargs.get("gender", "-")
    profile["birthday"] = kwargs.get("birthday", "-")
    profile["age"] = kwargs.get("age", "-")
    profile["phone"] = kwargs.get("phone", "-")
    profile["email"] = kwargs.get("email", "-")
    
    return profile

user_profile = {
    "name": "lee",
    "gender": "man",
    "age": 32,
    "birthday": "01/01",
    "email": "python@sparta.com",
}
{'name': 'lee', 'gender': 'man', 'birthday': '01/01', 'age': 32, 'phone': '-', 'email': 'python@sparta.com'}

class 심화

https://writingstudio.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%ACPython-%ED%81%B4%EB%9E%98%EC%8A%A4class-%EC%95%88-def-initself-%EC%99%80-self-%EB%93%B1%EC%9D%84-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

 

파이썬(Python): 클래스(class) 안 def __init__(self): 와 self 등을 제대로 이해하기

"def __init__(self):" 파이썬python을 약간이라도 다루기 시작한 사람이라면 이내 마주치는 구문이다. 개인적으로는 def __init__(self) 구문은 파이썬에서만 사용하는 함수로 안다. 다른 언어에서 본 적이

writingstudio.tistory.com

클래스는 과자 틀이고, 인스턴스는 과자 틀로 만들어낸 과자다.

init 함수는 인스턴스를 만드는 과정에서 무조건 실행되는 함수.

변수와 인자를 init 함수에 주게되면 객체가 만들어진다.

self 는 클래스 그 자체이다. 

어떻게 쓰든 __init__에서 첫 번째로 들어가는 self(첫번째 변수)는 CookieFrame 클래스 스스로를 지칭하게 된다. self를 다른걸로 고쳐도 된다.

class CookieFrame():
    def __init__(self, name): #name 이라는 인자를 받는다.
        print(f"생성 된 과자의 이름은 {name} 입니다!")
        self.name = name #name이라는 변수에 name 인자를 받는다.

cookie1 = CookieFrame("cookie1") #쿠키 1이라는 이름으로 쿠키1 인자를 준다. 객체가 생성되었다.
cookie2 = CookieFrame("cookie2")

print(cookie1.name) #cookie1이라는 변수의 name으로 어떤 인자값을 받았는지 알 수 있다.
print(cookie2.name)

cookie1
cookie2

인자에 디폴트값을 줄 수 있다. 디폴트값 없이 인자 값이 없다면 에러가 난다.

class CookieFrame():
    def __init__(self, name="default"):
        print(f"생성 된 과자의 이름은 {name} 입니다!")
        self.name = name

cookie1 = CookieFrame("")
cookie2 = CookieFrame("cookie2")

print(cookie1.name)
print(cookie2.name)

default
cookie2

class 상속

  • 클래스를 생성할 때 다른 클래스의 변수나 메소드 등을 가져와 사용하는 기능.
  • 동일한 코드를 여러 클래스에서 조금씩 수정해서 사용하거나 모듈에 내장된 클래스를 변경할 때 주로 사용.
  • 상속 해주는 클래스를 부모(parents),슈퍼(super) 클래스. 상속 받는 클래스는 자식(child),서브(sub) 클래스.

모듈 : 파이썬으로 이루어진 파일에는 함수,변수,클래스 등이 있을 것. 이 파일을 import해서 모듈로 사용하는 것.

 

상속 받은 클래스를 기반으로 새로운 클래스 만들기

class Monster():
    def __init__(self, hp):
        self.hp = hp
        
    def attack(self, damage):
        self.hp -= damage

    def status_check(self):
        print(f"monster's hp : {self.hp}")
        
class FireMonster(Monster):
    def __init__(self, hp):
        self.attribute = "fire"
        #init 함수를 실행하면 파이어 속성을 만들고
        #부모의 init 함수를 또 사용하여 hp가 있는 객체가 만들어진다.
        super().__init__(hp)
    
    # 부모 클래스에 존재하는 status_check 메소드를 overriding 합니다.
    #오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는것.
    # 더 좋은 코드는self.attribute = "fire"를 출력하도록 하면 메서드를 만들 필요도 없었을 것.
    def status_check(self):
        print(f"fire monster's hp : {self.hp}")
        
class IceMonster(Monster):
    def __init__(self, hp):
        self.attribute = "ice"
        super().__init__(hp)
    
    def status_check(self):
        print(f"ice monster's hp : {self.hp}")
        
fire_monster = FireMonster(hp=100)
# FireMonster 클래스에는 attack 메소드가 없지만
# 부모 클래스에서 상속받았기 때문에 별도의 선언 없이 사용 가능합니다.
fire_monster.attack(20)
fire_monster.status_check()

ice_monster = IceMonster(hp=200)
ice_monster.attack(50)
ice_monster.status_check()

상속 받은 클래스의 특정 코드를 변경해 사용하기

  • 모듈의 코를 수정하여 사용하는 것 많은 버그를 생기게 할 가능성이 많다.
  • 그래서 새로운 클래스를 하나 만들고 오버라이딩 해서 코드를 수정해서 사용하는게 더 효율적이다.

class 객체(object) 다루기

  • 객체 = object = 인스턴스
  • list와 dict 같은 자료형 데이터를 생성하고 활용 했던 것이 클래스의 객체를 생성하고 매소드를 활용하는 과정.
  • 객체에서 사용 가능한 메소드들은 검색,docstring, 구현 코드 등을 확인하여 찾을 수 있다.
  • 구현 코드를 확인하는 걸 권장하는 이유는 다른 사람이 짠 코드를 보다보면 새로운 것을 배울 수 있기 때문.
  • 구현 코드를 보고 개선할 부분을 찾으면 컨트리뷰터가 될 수 있고 취업에 큰 도움이 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

'python' 카테고리의 다른 글

파이썬 기초 부교재 정리. 3  (0) 2023.03.22
파이썬 기초 부교재 정리. 2  (0) 2023.03.22
파이썬 기초 부교재 정리. 1  (0) 2023.03.21
파이썬 문법 기초. 2  (0) 2023.03.20
파이썬 문법 기초. 1  (0) 2023.03.20

예외 처리 (try, except)

에러가 발생해도 계속 출력을 한다.

try:
    ...
except :
    ...
try:
    4 / 0
except ZeroDivisionError as e:
    print(e)

# division by zero
위 경우는 오류의 내용까지 알고 싶을때 쓰는 방법 입니다.
에러가 발생하면 "e" 라는 변수에 해당 에러의 종류가 저장되고 이것을 "print()"를 이용해서 출력할 수 있게 만들어 주는 것 입니다.

Mission4

사용자로부터 숫자를 입력받아 100을 입력받은 숫자로 나누는 프로그램을 작성하려고 합니다. 하지만 사용자가 0을 입력하거나, 숫자가 아닌 값을 입력하면 예외가 발생합니다. 이 예외를 처리하고, 그 외의 경우에는 나눗셈 결과를 출력하는 코드를 작성하세요.

try:
    x = int(input("나눌 수를 입력하세요: "))
    y = 100 / x
except ZeroDivisionError:
    print('0으로는 나눗셈 못해!')
except ValueError:
    print('문자열로 나눗셈 못하거든?!')
else:
    print(x,y)

그리고 try, except문을 보다보면 위의 코드에서 처럼 "else"문도 있는 것을 확인 할 수 있습니다. 이렇듯 "try" 부분에 모든 코드를 넣어 놓는 것이 아니고 "else"로 코드를 구분해 놓는 이유가 무엇일지 한번씩 생각해보세요~

→else 가 있어야 except 가 아닐때 print 시킬 수 있으니까요.

 

Numpy

C언어로 구현된 파이썬 라이브러리. 고성능의 수치 계산을 위해 제작됨. 백터 및 행렬 연산에 있어 매우 편리.

배열이 두개면 이차원 배열

행렬은 행과 열이 직사각형 으로 배열된 것이다.

 

Pandas

데이터 처리와 분석을 위한 파이썬 라이브러리. 대용량 데이터를 처리하는데 매우 편리.

Pandas는 세가지 데이터 구조 사용.

Series, DataFrame, Panel 자주쓰는 DataFrame 살펴봄.

 

데이터 프레임은 2차원 리스트를 매개변수로 전달.

행방향 index

열방향 column

'python' 카테고리의 다른 글

파이썬 문법 심화. 1  (1) 2023.03.23
파이썬 기초 부교재 정리. 2  (0) 2023.03.22
파이썬 기초 부교재 정리. 1  (0) 2023.03.21
파이썬 문법 기초. 2  (0) 2023.03.20
파이썬 문법 기초. 1  (0) 2023.03.20

함수

  • 함수 : 입력값을 가지고 어떤 일을 수행해서 결과물을 내어 놓는 것.
  • 매개변수: 함수를 정의할때 사용되는 변수 (밑에 예시로는 x,y)
  • 인수: 함수를 호출할때 넘기는 변수 (밑에 예시로는 4,5)
기본 함수의 구조

def 함수명(매개변수):
    수행할문장
    
    def add(x, y):
    return x + y
print(add(4,5))

입/출력

입력을 받아 어떤 변수에 대입하고 싶을  때

num = input("숫자를 입력하세요: ")
print(f'숫나는 중괄호에 표시됩니다.{num}')
터미널에 입력을 하게 되면 중괄호에 출력이 된다.
출력을 ""로 구분하면 +와같다
print("Hello""world")
print("Hello"+"world")
 
출력을 ,로 구분하면 띄어쓰기
print("Hello","world")
 

파일 입/출력(열기, 읽기, 쓰기)

파일을 생성하고 읽고 수정하는 코드들이 있다. 엄청 많아서 에버노트에 정리.

 

객체지향 프로그램밍의 특징

클래스

몬스터 100마리가 있다. 각자 hp가 있고 스스로 관리한다.

몬스터는 클래스고 각각의 몬스터는 객체(인스턴스)가 된다. 클래스 안에 있는 함수는 메서드라고 한다.

각 몬스터가 스스로 관리를 한다. 객체지향 프로그래밍.

 

객체지향 프로그랭

객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임 중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법 입니다.

 

패러다임 : 한 시대의 사람들의 견해나 사고를 근본적으로 규정하고 있는 인식의 체계. 또는, 사물에 대한 이론적인 틀이나 체계. 순화어는 `틀'.

 

로직 : 일반적으로 로직이라는 것은 어떤 프로그램을 만들 때의 논리적인 흐름을 이야기함.

 

4가지 특성

  • 추상화: 여기서 말하는 추상화는 추상 클래스나 추상 클래스가 갖는 추상 메서드를 의미하기보다는 클래스를 설계하는 것 자체를 의미합니다.
  • 캡슐화: 객체 지향 프로그래밍에서 기능과 특성의 모음을 "클래스"라는 "캡슐"에 분류해서 넣는것
1. 코드를 재수정 없이 재활용가능하게 하기 위해서 캡슐화를 사용합니다.
2. 접근 제어자를 통한 정보 은닉 하기에도 적합 합니다.
  • 상속 : 상속은 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게 하는 것을 의미 합니다.
기능의 일부분을 변경해야 할 경우 상속받은 자식 클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것 입니다.
  • 다형성 : 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것입니다. 즉 오버라이딩(Overriding), 오버로딩(Overloading)이 가능합니다.

오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는것 입니다.

 

오버로딩 : 같은 이름의 함수 여러개. 변수의 갯수와 타입 등 특징이 달라 상황에 맞게 호출 됨.

그리고 파이썬에서는 오버로딩을 정식으로 지원하지 않고 구현은 가능하다는 점을 알고 있으면 되겠습니다.

 

Mission3

함수와 메소드의 차이점은 무엇인가요?

→ 함수는 명령문을 반복하는 기능. 메소드는 클래스 에서 객체에서 호출 되는 함수다.

 

객체 지향 프로그래밍에서 객체는 무엇인가요? 파이썬에서 객체는 어떻게 만들어지나요?

→객체는 클래스에서 데이터를 조작하는 메서드를 포함하는 개체.

클래스를 만들고 인스턴스화 하여 만든다.

 

파이썬에서 함수의 매개변수에 디폴트 값을 설정하는 방법은 무엇인가요?

→매개변수에 def func(a=2, b=3) 과 같이 할당하면 된다.

 

밑의 코드에서 예상되는 출력은 무엇인가요?

def square(x):
    return x * x		25

def apply(func, x):
    return func(x)

print(apply(square, 5))

→ apply 매개변수에 square, 5 가들어간다. square(5)로 리턴 된다. square(5) 함수를 계산하면 25다.

 

밑의 클래스를 정의했다고 가정하고 이 클래스를 통하여 객체를 생성하고, 너비와 높이를 5와 10으로 설정, 넓이와 둘레를 출력하는 코드를 작성해보세요

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

    def around(self):
        return 2 * (self.width + self.height)

↓..... 어려운데...?

 

// Some code
rect = Rectangle(5, 10)
print(rect.area())
print(rect.around())

밑의 코드의 결과값은 무엇일까요?

def my_func(a, b, c):
    print(a, b, c)


my_list = [1, 2, 3]

my_func(*my_list)

→my_func(*my_list) 는 my_list를 전개해서 함수를 호출한다는 뜻이다. a,b,c 에 1,2,3이 들어간다.

 

뭐지.... 너무 어려운데..?

반복 학습 밖에 없지 뭐...

'python' 카테고리의 다른 글

파이썬 문법 심화. 1  (1) 2023.03.23
파이썬 기초 부교재 정리. 3  (0) 2023.03.22
파이썬 기초 부교재 정리. 1  (0) 2023.03.21
파이썬 문법 기초. 2  (0) 2023.03.20
파이썬 문법 기초. 1  (0) 2023.03.20

pypy 이해하기

파이썬의 장점

  • 우수한 생태계
  • 사용 편의성
  • 풍부한 라이브러리
  • 빠른 편집 실행 주기 
  • 등등

파이썬의 단점

  • 속도가 느림.
  • 그래서 등장한게 pypy

소스코드, 원시코드 : 컴퓨터 프로그램을 사람이 읽을 수 있는 프로그래밍 언어로 기술한 텍스트 파일.

 

고급언어 : 사람이 이해하기 쉽게 작성된 프로그래밍 언어.

 

인터프리터 : 소스코드를 바로 실행하는 컴퓨터 프로그램 또는 환경. 소스코드를 기계어로 번역하는 컴파일러와 대비.

 

JIT (Just - In - Time) : 컴파일러와 인터프리터를 적절히 혼합. 코드를 번역한 곳을 캐싱.이후 같은 코드가 있다면, 컴파일 대신 캐싱 해둔 값을 사용.

 

캐시 : 계산한 데이터나 값을 저장해서 다시 같은 값이 필요할 때 불러와 시간을 절약한다.

 

pypy

  • 파이썬의 기본 인터프리터인 CPython을 대체. JIT 컴파일을 사용.
  • 그래서 속도가 빠름.
  • 하지만 Python에 비해 메모리를 많이 사용.

 

부교재 정리

가장 인기있고, 테스트에서 가장 유리한 언어. 파이썬!

  • pypy 지원이 되어 실행 성능이 저수준 언어와 거의 차이가 없다.
  • 알고리즘을 짧은 코드로 빠르게 짤 수 있다.
  • 문자열, 배열, 큰 숫자 다루는데는 파이썬 만큼 좋은 언어가 없다.

파이썬 소개

  • 자동화, 게임, 많은 데이터 수정등 쉽고 빠르게 해주는 언어.
  • 각 모듈을 다른 파이썬 프로그램에서 재사용 할 수 있다.
  • 인터프리터 언어라 컴파일, 링크 단계가 필요없어 개발 시간 단축됨.
  • 고수준의 자료형 때문에 복잡한 연산을 한 문자으로 표현 가능.
  • 문장의 묶음은 괄호 대신 들여쓰기로 이루어짐.
  • 변수나 인자의 선언이 불필요.
  • 확장성이 뛰어남.

Module (모듈) : 프로그램의 하위 기능들.

Object file (목적 파일) :  컴파일 과정 뒤에 생긴 파일. 파일 속에 적혀있는 것은 목적 코드 (Object Code)

Linking (링킹) : 여러 목적 코드를 하나로 묶는 과정을 말한다.

변수와 인수

출처 : https://7942yongdae.tistory.com/155

가상환경(venv; virtual environment)

  • 프로젝트별 패키지를 모아놓은 공구함.
  • 다른 파이썬 응용 프로그램들에 영향을 주지 않기 위해 격리된 실행 환경이다.

이름 짓기(naming)

  • 직관적으로 만든다.
  • 영어로 짓는다.
  • 언더바_ 대시- 이용해서 짓는다.

Mission1 

나는 파이썬을 이용해서 백엔드 공부를 시작하고 있는지에 대한 생각을 스스로 정의해 보도록 합시다.

 

처음 프로그래밍을 배우는 저로써 쉽게 배울 수 있는 언어이면서 활용도가 높은 언어인 파이썬을 선택하였고, 무엇보다 많은 사람들이 사용하고 있어 크고 활동적인 커뮤니티가 있어 도움을 얻기 쉬울 것이라고 생각을 하여 파이썬을 공부하기 시작했습니다.

 

문법 정리는 에버노트에 따로 진행. 너무너무 많음.

 

Mission2

https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

뭐지.. 어디서 어떻게 시작해야 할지 모르겠는걸...?

 

내일도 보고 내일모레도 한번 더 보다보면 점점 익숙해지고 친근해져서 코딩 공부가 즐거워지는 날이

올거라고 생각합니다.

"지지자 불여 호지자 호지자 불여 락지자 [知之者 不如好之者 好之者不如樂之者]"
"아는 사람은 그것을 좋아하는 사람만 못하고, 좋아하는 사람은 즐기는 사람만 못하다"

'python' 카테고리의 다른 글

파이썬 문법 심화. 1  (1) 2023.03.23
파이썬 기초 부교재 정리. 3  (0) 2023.03.22
파이썬 기초 부교재 정리. 2  (0) 2023.03.22
파이썬 문법 기초. 2  (0) 2023.03.20
파이썬 문법 기초. 1  (0) 2023.03.20

+ Recent posts