Skip to content

Latest commit

 

History

History
428 lines (326 loc) · 20.2 KB

3.string+function+library+crawling.md

File metadata and controls

428 lines (326 loc) · 20.2 KB

변수를 이용하여 데이터를 저장하자

변수의 개념

변수란?

변수(variables.py)란 변하는 수. 데이터(값)을 저장하는 공간을 뜻합니다. 변수에 데이터를 저장한 뒤, 언제든지 사용하거나 값을 변경할 수 있습니다.

우선 현재 나이와 5년뒤의 나이를 출력하는 코드를 살펴보겠습니다.

 print("현재 나이 : 25살")
 print("5년 뒤의 나이 : 30살")
 age = 25  # 현재 나이
 print(f'현재 나이 : {age}살')
 print(f'5년 뒤의 나이 : {age+5}살')

위에 두 코드는 같은내용을 출력합니다. 첫번째 코드는 print 함수에서 현재 나이와 5년 뒤의 나이를 각각 입력하였고, 두번째 코드는 age 라는 변수에 현재 나이를 저장하고, age 변수를 이용하여 현재 나이와 5년 뒤의 나이를 출력하였습니다.

이때, 현재 나이를 22살로 수정하고자 하면, 수정한 코드는 다음과 같습니다.

 print("현재 나이 : 22살")
 print("5년 뒤의 나이 : 27살")
 age = 22  # 현재 나이
 print(f'현재 나이 : {age}살')
 print(f'5년 뒤의 나이 : {age+5}살')

첫번째 코드는 print 함수 내의 나이를 각각 22살과 27살로 수정해야 하지만, 두번째 코드는 간단히 age 변수에 저장된 값만 22로 수정해주면 됩니다.
이렇게 변수를 이용하면 좀 더 편하게 데이터를 관리하고 사용할 수 있습니다.

변수 선언 방법, 사용 방법

앞에서 간단히 변수에 대해 알아보았습니다. 이제 변수를 생성하는 방법에 대해 알아봅시다.
우선 C언어에서의 변수 선언 방법은 다음과 같습니다.

 int a = 10;

c언어 뿐만 아니라 대부분의 프로그래밍 언어들은 위의 방식으로 변수를 선언합니다.
int는 자료형을 뜻하고, a는 변수 이름, 10은 변수에 대입할 값입니다.
자료형 변수명 = 대입할 값
이 세가지 요소를 이용하여 변수를 선언합니다.

이때, 자료형변수명을 이용하여 변수를 생성할때, 변수를 선언했다고 하고, 대입할 값을 이용하여 변수의 초기값을 정해주면, 변수를 초기화 했다고 말합니다. 위의 코드는 a라는 변수를 선언과 동시에 초기화 한것이고, 선언과 초기화를 따로 하면 다음과 같습니다.

int a; //변수 선언
a = 10; //변수 초기화

하지만 파이썬에서는 조금 다릅니다. 파이썬에서 변수를 생성하는 방법은 다음과 같습니다.

a = 10

c언어의 변수선언 방법과 차이점이 보이시나요? 자료형을 쓰지 않았습니다. 파이썬에서는 대입할 값을 보고 자동으로 자료형을 판단하기 때문에, 자료형을 쓰지 않아도 됩니다.

변수 이름 짓기

내가 원하는 대로 변수 이름을 지을 수 있지만, 파이썬에서는 변수명을 정할때 지켜야 할 몇가지 규칙들이 있습니다.

  • 숫자, 영문자(대, 소문자 구분), 언더바(_)를 사용할 수 있다.
  • 첫 자리에는 숫자를 사용할 수 없다.
  • 연산자로 사용하고 있는 기호(+,-,* 등)나 공백등 등은 사용할 수 없다.(공백 대신 언더바(_) 사용)
  • 파이썬 키워드는 변수 명으로 사용할 수 없다. ex) True, False, None, if, for, ...

파이썬 문자열 입출력, 라이브러리 및 함수(개념 + 실습)

파이썬 문자열 입출력(input+print.py)

이번에는 문자열 입출력에 관해서 한번 알아보겠습니다. 우선, 파이썬에서 어떤 내용을 결과창에 출력하기 위해서는 print함수를 이용합니다. print함수는 print(출력할 내용) 형식으로 사용할 수 있습니다.

a = 2+3
print(a)
print(2+3)

위의 두 코드를 실행해보면 결과창에는 2+3의 결과인 5가 출력되는것을 알 수 있습니다.
그럼 문자열을 출력하기 위해서는 어떻게 해야할까요?

print(Haedal)

이렇게 하면 Haedal이라는 문자열이 출력되지 않고, 다음과 같은 오류가 뜹니다.
NameError: name 'Haedal' is not defined

직역하자면 'Haedal' 이라는 이름이 정의되지 않았다고 합니다. Haedal을 변수로 인식하고 있기 때문에 오류가 뜹니다.
Haedal 이라는 변수가 아닌, 문자를 그대로 출력하고 싶다면 문자열을 작은 따옴표 ' ', 또는 큰 따옴표 " "로 감싸주면 됩니다.

print('Haedal')

이렇게 코드를 작성한 후 실행하면 정상적으로 Haedal이 출력되는 것을 알 수 있습니다.


이번에는 문자열을 입력하는 방법을 배워보겠습니다.

사용자에게 문자열을 입력받을 때에는 input 함수를 이용합니다. input함수는 input("프롬프트") 형식으로 사용할 수 있습니다.
프롬프트란, 사용자의 명령을 받아들일 준비가 되었음을 모니터에 나타내는 표시를 뜻합니다.

my_pokemon = input("가지고 있는 포켓몬 : ") 
print(my_pokemon)

img

img

출력 결과를 살펴보면, input 함수 내에 프롬프트로 입력한 내용이 출력되면서 깜빡입니다.
이때, 사용자가 문자열을 입력하면, my_pokemon이라는 변수에 저장이 되고, print 함수를 이용하여 변수 my_pokemon을 출력합니다.

함수란?, 함수 사용하자(functions.py)

함수(function) : 파이썬에서 함수란, 어떤 작업을 수행하는 코드를 모아 이름을 붙인 것입니다.

함수는 크게 두종류로 나눌 수 있습니다.

  • 내장 함수 : 파이썬에 포함된 함수 ex) print, input
  • 사용자 정의 함수 : 직접 만들어 사용하는 함수

파이썬 내장 함수는 아무런 설정 없이 바로 사용할 수 있습니다. 지금까지 배웠던 print, input등이 파이썬 내장 함수 입니다.
하지만, 내가 원하는 함수가 없을때는 직접 만들어서 사용할 수 있습니다. 이를 사용자 정의 함수 라고 합니다.

함수의 선언방법은 다음과 같습니다.

def 함수이름(매개변수) :
  실행할_명령
  return 반환값

매개변수란, 이 함수에 입력으로 전달되는 값을 받는 변수이고, 반환값은 함수의 결과로 돌려주는 값입니다.
이때, 매개변수반환값은 필요하지 않은 경우 생략해도 됩니다.

# functions.py

def gotcha():
  print("잡았다!")

gotcha() #함수 호출

# 매개변수 사용하는 함수
def add(num1, num2):
  return num1 + num2
print(add(1,1)) 

def add_mul(num1, num2):
  return num1 + num2, num1 * num2
print(add_mul(1,2))

# 100만번 이상 진행하면, 생각보다 편하다
def attack(name):
  print(name, "100만 볼트")
  print(name, "전광석화")
  print(name, "번개")

attack("피카츄")
attack("라이츄")
attack("피츄")

위의 예제 코드에서gotcha, add, add_mul, attack 이라는 4개의 함수를 정의했습니다. 하나씩 한번 살펴보겠습니다.

def gotcha():
  print("잡았다!")
gotcha()

"잡았다!"라는 문자열을 출력하는 gotcha함수를 선언하였습니다. 하지만 선언만 하고 사용하지 않으면 함수가 실행되지 않습니다.
gotcha() 코드를 추가함으로써 gotcha함수를 실행하였습니다. 이렇게 정의해놓은 함수를 불러오는 것을 함수를 호출한다고 합니다.

# 매개변수 사용하는 함수
def add(num1, num2):
  return num1 + num2
print(add(1,1)) 

num1, num2의 두개의 매개변수를 사용하여, 두개의 합을 반환값으로 가지는 add함수를 정의하였습니다.
두개의 매개변수가 존재하기 때문에, 호출할 때에도 두개의 값을 전달해줘야 합니다.
print(add(1,1)) 를 입력하여 두개의 값을 전달하여 호출할 수 있습니다. 이때, 함수를 호출할때 전달되는 값을 인자라고 합니다.
매개변수인자의 개념을 혼동하기 쉬운데, 매개변수는 함수 내애서 사용하는 변수이고, 인자는 함수를 호출할때 전달되는 입니다.
위의 코드에서는 num1, num2가 매개변수가 되고, add(1,1) 에서 정수 11이 인자가 됩니다.

def add_mul(num1, num2):
  return num1 + num2, num1 * num2
print(add_mul(1,2))

add_mul함수도 add함수와 마찬가지로, 두개의 매개변수를 가지는 함수입니다. 이때, 반환값을 보면 num1 + num2 , num1 * num2입니다.
이와 같이, 반환값이 여러개 필요한 경우 ,로 구분하여 여러개를 반환값으로 가질 수 있습니다.

def attack(name):
  print(name, "100만 볼트")
  print(name, "전광석화")
  print(name, "번개")

attack("피카츄")
attack("라이츄")
attack("피츄")

모듈 random 이용한 로또 뽑기(lotto.py)

모듈(module) : 함수나 변수 또는 클래스를 모아 놓은 파일입니다. 모듈은 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고도 할 수 있습니다.

내가 원하는 기능을 하는 함수가 있는데, 이미 누가 만들어 놨을 가능성이 큽니다. 다른사람이 만든 모듈을 이용하면 함수들을 가져와서 사용할 수 있습니다. 모듈에서도 파이썬 내장 모듈이 존재하는데, math, random, time 등의 모듈이 있습니다. 자세한 모듈 내용은 파이썬 문서에서 확인할 수 있습니다.

모듈 이름을 알고있다면 import 를 이용하여 모듈을 사용할 수 있습니다.

import 모듈이름

random 모듈을 이용하는 코드를 살펴보겠습니다.

# 로또 번호 뽑아보자
import random

numbers = range(1, 46) # 1~45의 정수

lotto = random.sample(numbers, 6)
print(lotto)
print(f'오늘의 행운의 로또는 {sorted(lotto)} 입나다')

random.sample(a, n) : a에서 랜덤한 n개의 데이터를 추출하는 함수

import random 으로 random모듈을 가져오고 random 모듈 내의 sample함수를 이용하여 1부터 45까지의 정수 중에서 6개를 뽑아서 출력하였습니다.

객체 지향 프로그래밍

객체란?

객체(Object) : 객체란 말그대로 대상을 뜻합니다. 예를 들어, 교실에 앉아있는 학생 개개인들이 객체라고 할 수 있고, 책 한권 한권을 객체라고 할 수 있습니다.

객체지향 프로그래밍이란?

우선 위키백과에 객체지향 프로그래밍에 대해 정의되어있는 내용을 살펴보겠습니다.

객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.

객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 또한 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점을 갖고 있다.
- 위키백과/객체지향 프로그래밍

객체지향 프로그래밍의 장점

  • 코드가 간단하다
  • 유지보수 및 업그레이드가 쉽다
  • 만들어 놓은 코드의 재사용이 가능하다.
  • 디버깅이 쉽다
  • 대형 프로젝트에 적합하다

클래스(Class) : 동일한 속성을 가지고, 행동을 하는 객체의 집합이라고 할 수 있습니다. 학생을 예로 들면, 학번, 이름, 성별 등의 속성과, 공부를 한다행동을 가진 학생클래스가 됩니다.

포켓몬을 예로 한번 들어보겠습니다.

pokemon1_name = '피카츄'

pokemon1_hp = 35 #체력
pokemon1_power = 55 #공격력

print(pokemon1_name, '100만볼트') #기술1
print(pokemon1_name, '전광석화') #기술2
print(pokemon1_name, '번개') #기술3

pokemon2_name = '파이리'

pokemon2_hp = 39
pokemon2_power = 52

print(pokemon2_name, '불꽃세례')
print(pokemon2_name, '화염방사')
print(pokemon2_name, '회오리불꽃')

pokemon3_name = '꼬부기'

pokemon3_hp = 44
pokemon3_power = 48

print(pokemon3_name, '거품')
print(pokemon3_name, '물대포')
print(pokemon3_name, '하이드로펌프')

위의 코드에서 포켓몬은 피카츄, 파이리, 꼬부기 총 세마리가 등장합니다. 여기서 피카츄, 파이리, 꼬부기객체가 됩니다.
그리고 각각의 포켓몬들은 체력, 공격력, 기술의 동일한 속성을 가지고있고, 공격이라는 동일한 행동을 하는 포켓몬 이라는 클래스라고 할 수 있습니다.
여기서, 피카츄포켓몬인스턴스 입니다. 피카츄같이 특정 객체를 지정해서 말하면 객체라고 하고, 그 객체를 생성한 클래스와의 관계를 얘기하면 인스턴스라고 합니다.

그럼 이제 포켓몬 이라는 클래스를 사용하여 객체지향 프로그래밍을 통하여 코드를 구현해보겠습니다.

class pokemon: #pokemon 클래스 선언
    pokemon_count = 0  #클래스 변수
    def __init__(self, name, hp, power, skill):  #생성자
        self.name = name  #포켓몬의 이름
        self.hp = hp  #포켓몬의 체력
        self.power = power  #포켓몬의 공격력
        self.skill = skill  #포켓몬의 기술
        pokemon.pokemon_count += 1  #총 포켓몬 수

pokemon1 = pokemon('피카츄', 35, 55, ['100만볼트', '전광석화', '번개'])
pokemon2 = pokemon('파이리', 39, 52, ['불꽃세례', '화염방사', '회오리불꽃'])
pokemon3 = pokemon('꼬부기', 44, 48, ['거품', '물대포', '하이드로펌프'])

전체 코드는 위와 같습니다. 그럼 코드를 하나씩 살펴보겠습니다.

class pokemon: #pokemon 클래스 선언
    pokemon_count = 0  #클래스 변수
    def __init__(self, name, hp, power, skill):  #생성자
        self.name = name  #포켓몬의 이름
        self.hp = hp  #포켓몬의 체력
        self.power = power  #포켓몬의 공격력
        self.skill = skill  #포켓몬의 기술
        pokemon.pokemon_count += 1  #총 포켓몬 수

클래스를 선언할때는 함수와 비슷하게 class 클래스이름 : 형식으로 선언하면 됩니다.

총 포켓몬의 갯수를 저장하는 pokemon_count라는 변수를 선언해주었습니다. 이 변수는 객체와 상관없이 같은 클래스라면 같은 값을 공유하는 변수입니다. 이러한 변수를 클래스 변수 라고 부릅니다.

그 다음에 __init__이라는 메소드를 볼 수 있습니다. 이 메소드는 파이썬에서 특별하게 약속된 메소드 중 하나로, 초기화(initialize) 메소드 라고 합니다. 흔히 객체지향 언어에서는 생성자라고 부릅니다.
이 메소드는 객체가 생성될때 자동으로 호출되서, 그 객체가 가지게 될 속성들을 정해주는 역할을 합니다.
객체 생성시에, 포켓몬의 정보를 전달받아서 인스턴스 변수에 저장해줍니다. 여기서 매개변수 중 self는 객체 자신을 뜻합니다.

pokemon1 = pokemon('피카츄', 35, 55, ['100만볼트', '전광석화', '번개'])
pokemon2 = pokemon('파이리', 39, 52, ['불꽃세례', '화염방사', '회오리불꽃'])
pokemon3 = pokemon('꼬부기', 44, 48, ['거품', '물대포', '하이드로펌프'])

객체를 생성하는 코드입니다. pokemon1, pokemon2, pokemon3 객체를 생성하고, 각 포켓몬의 정보들을 입력하였습니다. 객체를 생성할때에는 객체이름 = 클래스이름(인자) 형식으로 생성해주고, 클래스에서 정의한 초기화 메소드에 필요한 인자들을 전달해줍니다.


간단한 클래스 정의는 끝났습니다. 이제, 필요한 메소드들을 하나씩 추가해보겠습니다.

먼저 포켓몬의 정보를 출력하는 메소드를 추가하겠습니다. 코드는 다음과 같습니다.

class pokemon:
    ...
    def info(self) :
        print(f'포켓몬: {self.name}')
        print(f'체력 : {self.hp}')
        print(f'공격력 : {self.power}')
        print(f'기술 : {self.skill}')
        print()
...
pokemon1.info()
pokemon2.info()
pokemon3.info()

포켓몬의 정보를 출력하는 info 메소드를 정의하고, print를 통하여 출력하도록 하였습니다. 호출할 때에는 객체이름.메소드(인자)형식으로 호출하면 됩니다. 여기서, info메소드는 따로 인자가 필요 없기때문에, pokemon1.info()로 호출합니다.



다음으로 포켓몬이 공격을 하도록 하는 메소드를 추가하겠습니다.
class pokemon:
    ...
    def attack(self, skill_num):
        print(self.skill[skill_num])
...
pokemon1.attack(2)
pokemon2.attack(1)
pokemon3.attack(0)

포켓몬이 공격하는 attack메소드를 정의하고, skill_num이라는 매개변수를 통하여 skill_num번째 기술을 사용하도록 하였습니다.

호출시에는 pokemon1.attack(2)로 호출합니다. 여기서 피카츄의 기술은 ['100만볼트', '전광석화', '번개']로 정의했기 때문에, 번개가 출력되는것을 확인할 수 있습니다.

완성된 코드는 다음과 같습니다.

class pokemon:
    pokemon_count = 0
    def __init__(self, name, hp, power, skill):
        self.name = name
        self.hp = hp
        self.power = power
        self.skill = skill
        pokemon.pokemon_count += 1

    def info(self) :
        print(f'포켓몬: {self.name}')
        print(f'체력 : {self.hp}')
        print(f'공격력 : {self.power}')
        print(f'기술 : {self.skill}')
        print()
    
    def attack(self, skill_num):
        print(self.skill[skill_num])

pokemon1 = pokemon('피카츄', 35, 55, ['100만볼트', '전광석화', '번개'])
pokemon2 = pokemon('파이리', 39, 52, ['불꽃세례', '화염방사', '회오리불꽃'])
pokemon3 = pokemon('꼬부기', 44, 48, ['거품', '물대포', '하이드로펌프'])


pokemon1.info()
pokemon2.info()
pokemon3.info()


pokemon1.attack(2)
pokemon2.attack(1)
pokemon3.attack(0)

변수

함수