'코딩 연습/Python'에 해당되는 글 5건

함수

코딩 연습/Python 2018. 10. 4. 01:18

함수는 긴 코드를 보다 간결하고 보기 쉽게 보조해주는 기능이다.


어떤 상황에서 함수의 필요성이 생기는지 살펴보자.


1
2
3
4
5
6
7
8
9
10
11
name1 = "jeremi"
name2 = "paul"
name3 = "ryan"
name4 = "selena"
name5 = "adrianne"
 
print("hello, {}".format(name1))
print("hello, {}".format(name2))
print("hello, {}".format(name3))
print("hello, {}".format(name4))
print("hello, {}".format(name5))
cs


각각 변수에 이름을 지정해주었다.

그리고 'hello, 이름'의 형태로 출력하려고 한다.


문제는 이러한 변수와 print 함수의 개수가 기하급수적으로 늘어나면 어떻게 될까?

그리고 'hello'에서 'hi'로 변경하고 싶다면 수정해야할 코드량이 그만큼 늘어날 것이다.


1
print("hello, {}".format(name))

cs


지속적으로 반복되는 이 코드를 함수 활용으로 코드량을 줄이고 수정도 용이한 형태로 만들어보자.


def 함수명(매개변수):

return 반환값


기본 함수 형태를 확인하고, 


1
2
def hello_friend(name):
    print("hi, {}".format(name))
cs


우리가 만든 함수는 hello_friend 이름을 가졌고, name은 매개변수로 입력 받은 값을 넘겨주는 역할을 한다.

return인 반환값이 없어도 hello_friend 함수 호출시 print함수가 항상 작동한다. 


1
2
3
4
hello_friend(name1)
>> hi, jeremi
hello_friend(name5)
>> hi, adrianne
cs


함수 호출은 함수명을 작성하고 넘겨줄 값의 변수를 소괄호에 넣어준다.

우리가 앞서 지정한 변수의 값을 넘겨 받아 출력된다.


수정도 손쉽게 할 수 있다.


1
2
def hello_friend(name):
    print("hello, {}".format(name))
cs


코드를 한 번 살짝 변경하면 달라진 결과물을 얻을 수 있다.

블로그 이미지

쵸잇

,

for와 while은 반복을 수행하는 문법이다.


- 반복문은 동일한 값이나 일정 범위의 값을 일일이 작성하기가 번거로워 생긴 문법이다.

- 반복문을 잘 활용하면 코드 사용량을 줄일 수 있어 자주 쓰이는 문법 중에 하나이다.


1. for 문


- 영어에서 for는 시간(또는 기간)을 나타내는 명사와 함께 쓰여 '~동안에'라는 의미를 갖는다는 걸 알고있다.

- for 문에서는 시간은 아니지만 일정 범위에 해당하는 목록을 지정해서 사용한다.


for 변수명 in 변수로 지정될 데이터의 범위:

반복할 코드


- for 문의 형태이다.


1
2
for num in range(110):
    print(num)
cs


- for 문의 예시이다. 

- range 함수를 활용하여 1~9까지의 숫자를 범위로 지정했다. (컴퓨터언어는 숫자가 0부터 시작이므로 10은 9를 뜻한다)

- 범위에 포함된 숫자 1~9를 변수 num에 하나씩 전달한다.

- 변수 num을 print하면 개수 만큼 9번 반복해서 숫자를 순서대로 하나씩 출력한다.


1
2
3
4
5
6
7
8
9
10
11
12
for num in range(110):
    print(num)
>>
1
2
3
4
5
6
7
8
9
cs


- 범위를 range 함수 말고도 list, tuple, set, dict과 같은 목록 형태의 자료형을 사용할 수 있다. (자료형에 대해선 별도로 다룰 것이다)


1
2
3
4
num_list = [123456789]
 
for num in num_list:
    print(num)
cs


- 숫자 1~9를 리스트로 만들어 num_list 변수의 값으로 지정

- range(1, 10)과 동일하게 리스트의 숫자를 하나씩 num 변수로 보내어 반복 출력한다.



2. while 문


- while 문은 if 문과 for 문의 기능을 내포하고 있다.

- if 문처럼 조건에 부합 여부에 따라 while 문을 작동시켜 코드를 반복한다.


1
2
while True:
    print(1)
cs


- 예시로 조건이 항상 참이 되도록 while 문을 작성하면 print(1) 함수가 무한히 반복되는 무한루프가 발생한다.

(무한루프 : 코드의 한 구간이 끝나지 않고 무한히 반복되는 현상)

- 그럼 숫자 1만 한 번씩 무한히 반복된다.


1
2
3
4
= 1
while a < 10:
    print(a)
    a = a + 1
cs


- 우선 변수 a에 1을 값으로 지정 

- while 문에 변수 a가 10보다 작은 경우에 반복이 되도록 조건을 지정

- 조건이 참인 경우 print 함수는 넘겨받은 변수의 값을 출력한다. 

- 마지막으로 변수의 값에 1을 더해 변수 a에 대입하고 다시 처음으로 돌아간다.

- a가 1씩 증가해 9가 되면 최종적으로 변수가 10이 되므로 반복은 멈추게 된다.

'코딩 연습 > Python' 카테고리의 다른 글

함수  (0) 2018.10.04
클래스(class) (3) - 내장함수 활용 및 클래스 상속  (0) 2018.10.03
클래스(class) (2) - 내장함수 활용하기  (0) 2018.10.02
클래스(class) (1)  (0) 2018.10.01
블로그 이미지

쵸잇

,

1. 새로운 내장함수를 만들어서 활용해보자.


__init__함도 중요한 기능을 갖췄지만 인스턴스를 처음 만들 때만 호출되므로 이후에는 쓸 일이 없다.


이번 함수는 게시글 조회수를 올려주는 기능을 갖고 있다.


1
2
def read(self):
    self.view_count = self.view_count + 1
cs


read함수는 view_count 변수에 접근해 조회수에 1을 더해준다.


1
article1.read()
cs


인스턴스 article1에 해당하는 글을 조회했다고 가정하고 작성한 코드이다.

인스턴스에 .을 붙이고 read()를 입력하면 read함수가 호출된다. 

출력해보자.


1
print(article1.view_count)
>> 1
cs


숫자 '1'이라고 조회수가 출력된다. 

사실 read함수 없이 조회수를 올리는 방법이 있긴 하다!


1
article1.view_count = article1.view_count + 1
cs


코드량도 늘어나고 번거로운 작업이 될 뿐이다.



2. 클래스 상속하기


개발언어 대부분이 영어권에서 시작된 거라 가끔 사용하는 어휘가 낯설게 느껴진다.

상속은 inheritance라는 영단어를 그대로 해석한 것이다.

우리식으로는 '물려받았다'라고 볼 수 있다. 간단하게 '똑같은 걸 가져다 쓴다'라면 될까싶다.


클래스도 물려받을 수 있다는 건가? 그렇다.


class 클래스명(상속받을 클래스명):


우리도 상속 받아보자.


1
2
class TistoryArticle(Article):
    source = "티스토리"
cs


상속만 받기 아쉬워서 변수를 하나 더 지정했다.

새로만든 TistoryArticle 클래스는 앞서 만든 Article 클래스의 설계도면을 고스란히 갖추고 있으면서, source라는 변수를 추가했다.


Article 클래스를 상속 받은 TistoryArticle 클래스를 활용하여 인스턴스를 만들어보자.


1
2
tistory_article = TistoryArticle("게임""게임은 쉬워요")
print(tistory_article.title)
>> 게임
cs


titlecontent의 값은 Article 클래스에서 했던 것처럼 똑같이 작성하면 된다.

그리고 title을 출력하면 입력한대로 결과가 나온다.



*심화과정으로 override를 배워보자.


1
2
3
4
5
class TistoryArticle(Article):
    source = "티스토리"
 
    def read(self):
        self.view_count = self.view_count + 2
cs


기존 read함수에서 숫자 1을 2로 변경했다. 

함수 호출시 조회수를 출력하면?


1
2
tistory_article.read()
print(tistory_article.view_count)
>> 2
cs


덮어씌운 격인데 영어 override의 뜻인 '우선순위로 두다'를 반영한 것이다.

필요시 상속 받은 클래스에서만 사용할 수 있도록 함수 수정이 가능하다는 것이다.


'코딩 연습 > Python' 카테고리의 다른 글

함수  (0) 2018.10.04
for 문과 while 문  (0) 2018.10.03
클래스(class) (2) - 내장함수 활용하기  (0) 2018.10.02
클래스(class) (1)  (0) 2018.10.01
블로그 이미지

쵸잇

,

다시 앞서 만든 코드를 살펴보자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
title1 = "개발"
author1 = "홍길동"
content1 = "개발은 쉬워요"
view_count1 = 0
 
title2 = "취업"
author2 = "홍길동"
content2 = "취업은 쉬워요"
view_count2 = 0
 
title3 = "운동"
author3 = "홍길동"
content3 = "운동은 쉬워요"
view_count3 = 0
cs


authorview_count 변수가 가지는 값이 "홍길동", "0"으로 동일하다.




1
2
3
4
5
6
7
8
9
10
11
class Article:
    author = "홍길동"
    view_count = 0
 
    def __init__(self, title, content):
        self.title = title
        self.content = content
 
article1 = Article("개발""개발은 쉬워요")
article2 = Article("취업""취업은 쉬워요")
article3 = Article("운동""운동은 쉬워요")
cs


이게 뭔가? 라고 생각되는데 하나씩 차근차근 살펴보자.


Article 클래스에는 미리 언급한 authorview_count 변수와 값을 남겨두었다. 

인스턴스를 만들면 2개의 변수는 항상 동일하게 접근할 수 있을것이다.


def함수를 뜻하는데 정확한 개념은 나중에 별도로 정리할 것이다. 

일반 함수와 다른 점은 이 함수는 클래스 안에서 쓰인다는 것인데, 클래스 내장함수라고도 불린다.


__init__이라는 함수의 init은 initializer를 축약한 것으로 초기 내용을 설정해주는 역할생성자라고 불린다.

즉 인스턴스를 새로 만들면 __init__함수가 우리가 원하는 변수의 값을 처음에 셋팅해준다.

그리고 괄호 안에 매개변수(입력 받은 값을 넘겨주는 역할)를 지정해주는데, 여기서 self는 뭐냐?

self는 Article 클래스 자기자신이다. 영어의 myself의 의미와 유사하다. 

클래스 내장함수를 쓸 때는 이유불문 암묵적인 약속처럼 해당 클래스를 사용한다는 뜻으로 항상 self를 먼저 붙여준다.

나머지 2개의 매개변수는 새로운 인스턴스에서 생성되는 변수의 인자(변수의 값)를 넘겨주는데 도움을 준다. 



1
2
self.title = title
self.content = content
cs

 


2줄의 코드는 인스턴스의 변수를 접근하는 방식과 동일하게 이해하면 된다.

self.titleArticle 클래스의 title 변수에 접근해서, __init__함수의 매개변수 title을 통해 변수의 값을 넘겨받는다.


그럼 변수의 값(인자)을 어디서 받나?



1
2
3
article1 = Article("개발""개발은 쉬워요")
article2 = Article("취업""취업은 쉬워요")
article3 = Article("운동""운동은 쉬워요")
cs


인스턴스 = 클래스(인자1, 인자2, …)


인스턴스를 만들때, 클래스와 더불어 순차적으로 매개변수의 인자를 입력한다.

"개발"은 첫 매개변수 title을 통해 article1 인스턴스의 title 변수인자로 지정된다.

최종적으로 우리가 원하는 형태의 클래스가 만들어진 것이다. 


어렵지만 이해를 위해 다시 살펴보자.


이 메커니즘을 다시 역으로 돌아보면,

인스턴스를 새로 만들때 클래스를 활성화시키면서 동시에 내장함수인 __init__을 호출하여 매개변수를 통해 입력한 인자를 넘겨준다.

그럼 article1 인스턴스Article 클래스의 기본골격인 authorview_count를 유지하면서, 함수를 통해 titlecontent을 추가로 갖게 된다.


'코딩 연습 > Python' 카테고리의 다른 글

함수  (0) 2018.10.04
for 문과 while 문  (0) 2018.10.03
클래스(class) (3) - 내장함수 활용 및 클래스 상속  (0) 2018.10.03
클래스(class) (1)  (0) 2018.10.01
블로그 이미지

쵸잇

,

클래스는 수많은 데이터를 효율적으로 관리 및 수정하는데 도움을 준다.

데이터베이스를 공부하면 자주보게 될 클래스이다. 각종 데이터를 저장하고 관리한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
title1 = "개발"
author1 = "홍길동"
content1 = "개발은 쉬워요"
view_count1 = 0
 
title2 = "취업"
author2 = "홍길동"
content2 = "취업은 쉬워요"
view_count2 = 0
 
title3 = "운동"
author3 = "홍길동"
content3 = "운동은 쉬워요"
view_count3 = 0
cs



코드 설명을 하자면,

게시글의 속성 4가지인 제목(title), 글쓴이(author), 내용(content), 조회수(view_count)와 그의 데이터를 보여주고 있다. 

첫 글은 글쓴이 "홍길동"이 쓴 "개발" 제목의 "개발은 쉬워요"라는 내용을 가지고 현재 조회수는 0이다.

우리는 지금 세 개의 글을 가지고 있다.


아직은 게시글의 수가 적어서 한 눈에 들어와 수정이 용이하다.

차츰 게시글이 쌓이면 코드량은 폭발적으로 늘어난다.

클래스 역할이 여기서 발휘하게 된다.


첫번째 게시글로 간단하게 클래스를 만들어보자.


1
2
3
4
5
class Article:
    title = "개발"
    author = "홍길동"
    content = "개발은 쉬워요"
    view_count = 0
cs



클래스 이름을 게시글에 해당하는 Article로 정했다. (클래스명은 반드시 첫 글자를 대문자로 작성한다.)

나머지는 우리가 작성한 첫번째 게시글의 데이터를 입력했다.

이제 클래스는 만들어졌다. 벌써?


우린 이 Article 클래스를 가지고 4줄의 첫번째 게시글 데이터를 한 줄로 줄여볼 것이다.


1
article1 = Article()
cs



이 짧은 한 줄의 코드가 첫번째 게시글(article1)에 해당한다. 

Article 클래스의 4가지 속성과 그에 부합하는 값을 가진 이 데이터를 우린 앞으로 객체 또는 인스턴스라 부를 것이다.

클래스를 변수의 값으로 대입하려면 반드시 소괄호()를 붙여줘야 기능을 한다.


첫번째 게시글이 맞는지 확인하기 위해 article1 인스턴스의 title을 접근하여 출력해보자.

(인스턴스의 속성에 접근하려면 '.'을 찍어줘야한다.)


1
2
print(article1.title)
>> 개발
cs



우리가 작성한 "개발"이 출력됨을 확인할 수 있다.


1
2
3
4
5
6
title1 = "개발"
author1 = "홍길동"
content1 = "개발은 쉬워요"
view_count1 = 0
 
article1 = Article()
cs



4줄의 코드가 1줄로 줄어드는 마법을 경험했다.

다음은 함수를 활용하여 두번째, 세번째 게시글 데이터를 담고 있는 인스턴스를 보다 손쉽게 만들어보자.

'코딩 연습 > Python' 카테고리의 다른 글

함수  (0) 2018.10.04
for 문과 while 문  (0) 2018.10.03
클래스(class) (3) - 내장함수 활용 및 클래스 상속  (0) 2018.10.03
클래스(class) (2) - 내장함수 활용하기  (0) 2018.10.02
블로그 이미지

쵸잇

,