자 즐거운 코딩 시간이다. 우리는 이제 Python을 할 줄 아니, 간단한 프로그램을 통해서 우리가 배운 것을 검증하고 복습하는 시간을 가져보자.

<출처 : https://www.clien.net/service/board/park/12262874>

우리가 만들 영광스러운 첫 번째 프로그램은 학생을 관리하는 프로그램이다. 이 프로그램은 다음과 같은 특징이 있다.(프로그램을 발주한 사람은 필자라고 치자)

 

학생관리 프로그램의 조건

① 학생의 명단은 발주자가 미리 제공한다.

② 새로운 학생을 추가할 수 있는 기능이 있어야 한다.

③ 학생의 전체 명단을 "학생 번호 X : AAA"로 표현하는 기능이 있어야 한다.

④ 성적 저조자는 잘라야 되니, 성적 검사 후 70점 이하인 학생은 다음 분기 시험을 치더라도 입력하지 않게 한다.

⑤ 4분기 별 성적을 학생들에게 한 번에 추가하는 기능

② ~ ⑤는 students를 매개변수로 하는 함수로 생성할 것

⑥ 학생이 0명이 되면 교수님이 위너위너치킨디너

 

다음의 학생정보는 미리 제공된다.(이곳에는 5명의 학생밖에 없다 6명을 만들고 싶지만 불편하게 남기겠다.)

학생번호 이름
P_01 CHEELL
O_02 GLADOOS
R_03 WHEETLEY
T_04 TUULET
A_05 CAAVE

 

다음은 분기별 성적 정보이다.

  1분기 2분기 3분기 4분기
P_01 80 70 60 90
O_02 20 80 70 100
R_03 70 75 80 60
T_04 40 20 30 50
A_05 80 85 90 95

 

실력 향상을 위해서 다음 하나의 변수만 저장하도록 하자. 자료구조도 지정해 준 것을 사용하도록 하자

 

students : ([학생번호], [학생])의 tuple을 key로 사용하고 분기별 점수 배열을 value로 사용하는 dictionary
score_set : 주어지는 분기별 성적, 이중 LIST형태로 관리하자

 

⑥에 의해서 함수로 구현을 하면 되는데, 다행히도 dictionary는 자료구조이기 때문에 파라미터로 전달되면 함수의 내부에서 변경이 가능하다. 

또한 이번 프로그램에 한정해서 dictionary를 반복할 때는 dictionary.keys()와 dictionary.values()를 강제로 list()로 캐스팅해서 사용하도록 하자. 이는 우리가 아직 dictionary 반복을 모르기 때문이다.

 

어느 정도 프로그램에 윤곽이 잡힌 해리들은 아래 더보기를 눌러 아래 필자의 프로그램과 비교해보자

 


 

 

우선 하나하나 요구사항을 보며 무엇을 구현할지 생각해 보자

① 학생의 명단은 발주자가 미리 제공한다.

이것으로 명단을 막일로 적어주자(타이핑도 연습이야 이거 왜 이래)

students = { ("P_01","CHELL") : list(), ("O_02", "GLADOOS") : list(), ("R_03", "WHEETLEY") : list(),\
             ("T_04", "TUULET") : list(), ("A_05", "CAAVE") : list() }

아마 정상적으로 본 포스팅을 따라온 사람이라면, 한 줄에 모든 코드를 입력했을 것이다. 사실 Python은 줄이 너무 길다 싶으면 역 슬래쉬(\)를 통해서 다음 줄에 이어서 변수 정의 등을 할 수 있다.

 

① 조건은 완료했다.

② 새로운 학생을 추가할 수 있는 기능이 있어야 한다.

②에 따르면 새로운 학생을 추가할 수 있는 "기능"이 있어야 한다. 조건대로 함수로 구현해보자

def add_students(target_dict, stu_num, stu_name) :
    target_dict[(stu_num, stu_name)] = list()

추가할 dictionary와 학생번호, 학생 이름을 매개변수로 받아 매개변수로 받은 dictionary에 기존 테이블 형식으로 원소를 추가하는 함수를 생성하였다. 이렇게 ②조건을 완료했다.

 

③ 학생의 전체 명단을 "학생 번호 X : AAA"로 표현하는 기능이 있어야 한다.

③은 단순 출력이니 반복문을 통해서 어렵지 않게 구현할 수 있을 거 같다. 다음의 코드대로 구현해보자

def show_students(target_dict) :
    keys = list(target_dict.keys())
    values = list(target_dict.values())
    for i in range(len(target_dict)) :
        print("학생번호 "+keys[i][0]+": "+keys[i][1])

어려워 보여도 구현을 완료했다.

* dictionary를 반복할 수 있는 방법은 당연히 있다. 단 아직 배우지 않았다. 이는 Python과 친해지기가 끝나면 다음 올릴 예정인 Python과 매우 친해지기에서 알 수 있다.(Advanced-for나 dictionary for를 구글링 해서 봐도 된다.)

④ 성적 저조자는 잘라야 되니, 성적 검사 후 70점 이하인 학생은 다음 분기 시험을 치더라도 입력하지 않게 한다.
⑤ 4분기 별 성적을 학생들에게 한 번에 추가하는 기능

일단 score_set을 등록하자

score_set = [ [80, 20, 70, 40, 80], [70, 80, 75, 20, 85], [60, 70, 80, 30, 90], [90, 100, 60, 50, 95] ]

다음은 score_set을 studetns에 입력하는 함수를 만들어보자

def add_score(target_dict, score_list) :
    keys = list(target_dict.keys())
    values = list(target_dict.values())
    stop = [False,False,False,False,False]
    
    for i in range(4) :
        for j in range(len(values)) :
            if(stop[j] == True) :
                continue
            else :
                values[j].append(score_list[i][j])
            	if(values[j][-1] <= 70) :
               		stop[j] = True

이번에는 조금 복잡해 보인다. 하나하나 살펴보도록 하자. 일단 stop=[False,False,False,False,False] 까지는 함수에서 사용할 변수를 정의한 것이다. 사용하는 변수는 다음과 같다.

 

keys : 전달받은 dictionary의 key를 저장하는 list

values : 전달받은 dictionary의 value를 저장하는 list(따라서 맨 처음에는 [ [], [], [], [], [] ] 의 이중 LIST가 된다.)

stop : 학생들의 정보를 추가할지 말지는 결정하는 배열, (ex : stop[2] 가 True면 3 학생은 이제 점수 입력을 아니한다.)

 

다음은 for문의 분석이다 for는 i를 반복자로 하는 반복문(반복1)과 j를 반복자로 하는 반복문(반복2) 2개의 반복문이 중첩되어 작성되어있다. 반복1는 각 분기별로 동작할 것을 지시하며, 반복2는 각 분기에 대해(반복1의 블럭) 학생 수만큼 돌며 stop이 True면 넘어가고 아니라면 점수를 등록하고 등록한 점수에 대해서 70점 이하이라면 stop을 True로 하는 역할을 한다.

 

이렇게 구현을 완료했다.

 

전체 코드는 다음과 같다.

 

students = { ("P_01","CHELL") : list(), ("O_02", "GLADOOS") : list(), ("R_03", "WHEETLEY") : list(),\
             ("T_04", "TUULET") : list(), ("A_05", "CAAVE") : list() }
score_set = [[80, 20, 70, 40, 80], [70, 80, 75, 20, 85], [60, 70, 80, 30, 90], [90, 100, 60, 50, 95]]

def add_students(target_dict, stu_num, stu_name) :
    target_dict[(stu_num, stu_name)] = list()

    
def show_students(target_dict) :
    keys = list(target_dict.keys())
    values = list(target_dict.values())
    for i in range(len(target_dict)) :
        print("학생번호 "+keys[i][0]+": "+keys[i][1])


def add_score(target_dict, score_list) :
    keys = list(target_dict.keys())
    values = list(target_dict.values())
    stop = [False,False,False,False,False]

    for i in range(4) :
        add = True
        for j in range(len(values)) :
            if(stop[j] == True) :
                continue
            else :
                values[j].append(score_list[i][j])
                if(values[j][-1] <= 70) :
                    stop[j] = True
    
        

이번 시간에는 지금까지 배운 지식을 동원해서 나만의 조그마한 학생관리 프로그램을 만들어 보았다. 여기까지 오느라 수고 많았다. 이제 여러분은 Python의 기초적인 지식을 학습한 상태이다. 다음 시간에는 입출력에 대해서 알아보도록 하자

함수(Method, Function)

으악! 함수다! 수학 시간에 열심히 보았던 그 f(x) 맞다. 단 혹시 그 f(x)의 구조와 함께 이런 그림이 기억나는가?

<출처 : 위키백과 https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98>

함수가 동작하는 방식은 다음과 같다.

① 0개이상의 입력을 받는다.

② 무언가를 하고

③ 1개이상의 출력을 한다.

 

Python에도 함수(메서드)라는 개념이 있다. 위에 함수의 개념과 대응을 하면

① 0개이상의 파라미터를 받는다.

② 무언가를 하고

③ 0개이상의 값을 리턴한다.

 

파라미터라는 것은 입력, 리턴이라는 건 출력 같기도 한데??? 아닌가?? 헷갈려도 괜찮다. 다음 함수의 문법을 보자

이렇게 간단하다니! 함수의 사용은 함수이름과 소괄호() 안에 파라미터를 전달해주면 된다. 가령 우리가 줄기차게 사용해온 print("Hello World")라는 건 print라는 함수에 "Hello World"라는 문자열 파라미터를 전달한 것이다.(파라미터라고 어렵게 생각하지 말자, 단순하게 python에서 파라미터는 메서드에 전달되는 값으로, 무엇이든 파라미터가 될 수 있다.)

 

사용자 정의 함수

함수는 프로그래머가 직접 만들 수 있다. 아래의 성적처리 프로그램을 보자

def calculate(score) :
    if(score > 90) :
        return "A"
    elif(score > 80) :
        return "B"
    elif(score > 70) :
        return "C"
    else :
        return "Shit"

def [함수명](파라미터...)로 원하는 함수를 만들 수 있다. if ~ elif ~ else는 저번시간에 배웠던 제어문인데, 중간에 return "A" 같은 것은 어떤 의미일까? 파라미터로 전달한 score는 임의로 정한 이름이다. 전달되는 score에 대해서 함수 내부적으로 '이러한 일을 하세요'라는 의미이기에 실제로 사용할 때는 score라는 이름보다는 프로그램에서 사용되는 변수나 상수가 전달될 것이다. 위 calculate함수를 만든 다음(컴파일하고) 아래 예시를 따라 해 보자

>> print(calculate(75))
"C"

>> print(calculate(50))
"shit"

>> print(calaculate(score))
## 에러! 함수를 정의할때 사용한 score는 함수사용시에는 존재하는 값으로 치환되어야한다!
## score는 지금 없는 값이다!

 

독특한 것은 calculate(75)가 그대로 print() 함수의 파라미터로 넘어갔다는 점이다. 여기서 우리는 return에 의미에 대해서 알 수 있다.  return이란 함수의 결과이며, 함수가 종료되는 순간 바뀌는 값이다.(즉! 여기서 print(calculate(75))에서 calculate(75)는 score>70에서 return "C" 되기에 결과적으로 "C"가 되어 print(calculate(75))는 print("C")와 같은 코드가 된다.)

 

이러한 반환 값은 지정이 될 수도 안될 수도 있다. 아래의 예시를 보자

def non_return(val) :
    print(val)
    
def yes_return(val) :
    print(val) 
    return val

>> non_return(3)
3

>> a=yes_return(3)
3
>> print(a)
3

 

한 가지 재미있는 점은 자료형이 아닌 고정된 값들은 함수내부에서 변경이 되지 않는다는 점이다. 아래의 예시를 보자

def cal_val(val) :
    val = 5
    
def cal_ref(val) :
    val[0] = 100

>> a = 3
>> cal_val(a)
>> print(a)
3
## 비록 cal_val에서 val=5가 실행되도 a는 3으로 남아있다.

>> my_list = [0,1,2,3]
>> cal_ref(my_list)
>> print(my_list)
[100,1,2,3]
## 자료구조로 전달된 my_list의 0번째 원소는 cal_ref함수의 val[0]=100에 의해 100으로수정되었다.

??? 아니 어떻게 a는 바뀌지 않고 my_list는 바뀔 수 있는 것일까? 이에 구분은 파라미터가 전달될 때 값에 의한 전달(call by value)인지 참조에 의한 전달(call by reference)인지에 따라 구분된다. 자세한 내용은 c언어를 포스팅할 때 이야기하도록 하겠으며(구글링도 도움된다. 컴퓨터에 대한 지식을 높일 수 있는 좋은 기회이다), 지금은 단순하게 자료구조는 함수 내부에서도 변경이 가능하다는 것을 알아두면 좋을 거 같다.

 


이번 시간에는 프로그래밍의 꽃인 함수에 대해서 알아보았다. 함수란 기능을 의미하며, 사용자 정의 함수를 작성하는 방법도 알았으니, 다음 시간에는 지금까지 배운 내용을 통해서 간단한 프로그램을 만들어 보도록 하자

우리는 반복문을 배우고 제어문으로 넘어왔다. 제어문이란 "이런 상황의 경우 이렇게 실행하시오"를 알려주는 프로그램의 분기점이다. Python은 if ~ elif ~ else를 통한 제어문을 사용한다. 다음의 예시를 확인해보자

코드 :
score = 50
if(score >=90) :
    print("A학점입니다")
elif(score >= 80) :
    print("B학점입니다.")
elif(score >= 70) :
    print("C학점입니다.")
else :
    print("수업을 겨드랑이로 들었니?")

제어문의 문법은 다음과 같다.

여기서 사용할 주의점은 다음과 같다.

① elif와 else는 if가 있어야만 사용할 수 있다. 단, elif나 if 없이 if로만 구성된 반복문도 허용한다.

② if, elif, else가 하나라도 실행될 경우 아래 내용은 실행되지 않는다.

③ elif는 여러개 사용될 수 있다.

④ else는 모든 if와 elif가 거짓일 때 동작한다.

 

위의 내용의 예시는 다음과 같다.

① elif와 else는 if가 있어야만 사용할 수 있다. 단, elif나 if 없이 if로만 구성된 반복문도 허용한다.
if(a>b) :
	##
elif(b<a) :
	##
else :
	##
    
if(a>b) :
	##

② if, elif, else가 하나라도 실행될 경우 아래 내용은 실행되지 않는다.
a=3
b=5
if(a<b) :
	print("a가 b보다 작습니다")
elif(a>b) :
    print("b가 a보다 작습니다.")
else :
    print("a는 b와 같습니다.")
## 이 제어문은 elif와 else가 실행되지 않는다.

③ elif는 여러개 사용될 수 있다.
if(조건) :
	##
elif(조건2) :
	##
elif(조건3) :
	##
else(조건) :
	##
    
④ else는 모든 if와 elif가 거짓일때 동작한다.
a=3
b=3
if(a<b) :
	print("a가 b보다 작습니다")
elif(a>b) :
    print("b가 a보다 작습니다.")
else :
    print("a는 b와 같습니다.")
  
출력 : 
"a는 b와 같습니다."

 

* 제어문역시 Indent로 블록을 구분한다.

* if문안에 중첩된 if를 쓰는것또한 가능하다.


이번 시간에는 프로그래밍의 꽃인 제어문에 대해서 Pythond은 어떤 제어문을 사용하는지 알아보았다. 다음 시간에는 프로그래밍의 꽃(벌써 3번째 꽃이다. 프로그래밍은 꽃밭이다 아주) 함수에 대해서 알아보도록 하자

우리는 이제 귀찮은 작업을 일일이 타이핑하는 것이 아닌, 반복문이라는 도구로 빠른 퇴근을 도모할 수 있게 되었다. 이번 시간에는 반복문에 대해서 조금 더 깊은 이해를 가질 수 있는 여러 가지 반복문과, 반복문의 제어 등을 알아보자

 


들여 쓰기(Indent)

문득 이런 생각이 들었던 독자도 있을 것이다. "어디까지가 반복문인지 Python이 어떻게 알지?"(이래서 눈치 빠른 녀석들이란...) 사실 다른 프로그래밍 언어는 아래와 같이 중괄호를 통해서 어디까지를 그 지역으로 지정할지를 설정한다. 

for(int i=0 ; i<students.length ;i++) {
    students[i] = students[i].replace("철수","**");
    System.out.println(students[i]);
}
// JAVA언어에서의 for문 이다. 중괄호({})를 통해 어디까지가 for문인지를 지정한다.

다른 언어에서는 가독성을 위해서 들어 쓰기(Indent)를 하지만 Python은 문법적으로 같은 수준으로 Indent 된 것들을  한 지역으로 보고 Indent가 다시 돌아온 순간을 그 지역의 끝으로 인식한다. 다음의 예시를 보도록 하자

코드 : 
for i in range(10) :
    a=i
    print(a)

print("루프 종료")

출력 : 
1
2
3
4
5
6
7
8
9
10
"루프 종료"

for문으로 동작하는 것은 같은 들여 쓰기 수준을 가진 a=i와 print(i)만 이고 제일 아래줄인 print("루프 종료")는 for문으로 반복되지 않는다. 들여 쓰기는 [TAB]으로 입력할 수 있으며, 공백(스페이스) 4칸 또한 들여 쓰기로 인정한다.

 

반복문의 제어

*아래부터는 제어문 강의를 읽고 오면 도움이 많이 된다.*

반복문은 시작되면 끝까지 달리는 핸들이 고장 난 8톤 트럭이 아니다. 반복문이 실행되는 도중에도 반복문의 강제 종료, 다음 루프로의 강제이동 등이 가능하다. 크게 사용하는 반복문의 제어는 break와 continue가 있다.

코드 : 
for i in range(10) :
    a=i
    if(i>5) : 
    	break
    print(a)
        
print("루프 종료")

출력 : 
1
2
3
4
5
"루프 종료"

중간에 if는 조건 제어문인데, 간단하게 i가 5보다 크면 제어블록 안에 있는 break가 동작한다고 생각해주면 된다.

break는 돌고 있는 가장 가까운 루프를 강제 종료시키는 특징이 있다.

코드 : 
for i in range(10) :
    a=i
    if(i<5) : 
    	continue
    print(a)
        
print("루프 종료")

출력 : 
5
6
7
8
9
10
"루프 종료"

cotinue는 돌고 있는 가장 가까운 루프를 다음 루프로 강제 이동한다. 따라서 이 for는 i가 5보다 작을 때 강제로 다음 루프로 이동되어 i가 5보다 같거나 커질 때까지 print(i)는 실행되지 않는다.

 

무한루프(Infinite Loop)

무한루프는 말 그대로 끝나지 않는 루프이다.(컴퓨터 세상에서 만큼은 우리 무한으로 즐겨보자) 

무한루프는 보통 while문으로 걸게 되며, 다음의 코드로 알아보자

코드 : 
while(True) :
    print("무한으로 즐겨요")
        
print("루프 종료")

출력 : 
무한으로 즐겨요
무한으로 즐겨요
무한으로 즐겨요
무한으로 즐겨요
무한으로 즐겨요
...
...

시작하면 멈추지 않는 특성 때문에 보통 위에서 설명한 break와 같이 사용된다.

 

range SLICING

for문의 범위를 지정하는 range는 자료구조의 slicing처럼 slicing이 가능하다. 

코드 : 
for i in range(3,5) :
    print(i)

출력 : 
3
4

코드 :
for i in range(0,10,2) :
	print(i)

출력 : 
0
2
4
6
8

단, 배열의 인덱스를 의미하는 것이 아니기 때문에 음수 인덱스(자료구조에서는 역으로 읽는 인덱스를 의미했다.)는 진짜 음수로 인식한다.

코드 :
for i in range(-1,10,2) :
	print(i)

출력 : 
-1
1
3
5
7
9

이번 시간에는 코드 블록을 나누는 방법(Indent),반복문의 제어, range를 자유자재로 다룰 수 있는 방법을 알아보았다. 사실 for문은 더 실용적인 사용법인 Advanced-for라는 문법이 있다. 다만, 조금 더 어려운 개념(generator, iterator)등이 들어가기에, 포스팅을 계속하며 Advacned-for도 쉽게 이해할 순간이 되는 순간 설명하도록 하겠다. 다음 시간에는 프로그래밍에 꽃(벌써 2번째 꽃이다.) 제어문에 대해서 알아보도록 하자

학생관리 프로그램을 만드는 저번 시간, 여러 자료구조의 힘을 빌려서 우리는 변수를 하나로 지정하는 효율적인 방법을 알았지만, 휴. 이제 퇴근을 해야 되는데 우리나라의 이름 체계가 바뀌는 바람에 "철수"라는 이름의 사용이 금지되었다. 이제 모든 "철수"는 아직 정해지지 않았기 때문에 "**"로 바꾸어야 되는 상황이 왔다. 

 

다행히도 우리의 Python은 문자열에 대해서. replace([기존], [바꿀 문자열])을 제공한다.

>> students[0] = "김철수"
>> students[0] = students[0].replace("철수","**")
// students[0]의 철수를 **로 바꾼다.

>> print(students[0])
"김**"

훌륭한 기능이 주어졌으니, 이제 남은 건 위의 코드를 students의 길이만큼 치는 일이 남아있다.... 무언가 비효율적이다.

다행히도, 우리의 퇴근시간을 앞당겨줄 <반복문>이라는 훌륭한 도구가 있다.

 

 students[0] = "김철수, students[1] = "배철수", students[2] = "윤철수"    ...    students[29] = "남궁 철수"

잘 보면 students의 인덱스가 1씩 늘어남으로 각각의 원소에 접근을 할 수 있는 것을 알고 있다. 

 

 

반복문은 컴퓨터의 특성을 아주 잘 살린 제어블록으로 단순한 작업을 여러번 반복하는 내용을 담고 있다. python에서 사용하는 반복문은 크게 for문과 while문이 있는데, 순서대로 알아보도록 하자


for문의 사용

다음과 같은 예시를 통해서 반복문이 어떻게 사용되는 지 알아보도록 하자

*여기서 students는 길이가 30인 LIST이다.

코드 :
for i in range(len(students)) :
	students[i] = students[i].replace("철수","**")
	print(students[i])
    
    
출력 :
"김**"
"배**"
...
"남궁**"

일단 낯선 코드가 눈에 보인다. for i in range(len(students)) : 란 무엇일까?

for 반복문은 모두 위와 같은 형태를 띈다. 반복자가 0부터 (범위-1)만큼 늘어나며 반복을 하는 것이다.

* 왜 0부터 범위-1 인지는 Python과 친해지기 LIST를 보도록 하자 

* 위와 같은 이유로 [범위] 안에는 무조건적으로 정수(Integer)가 들어가야 한다.

 

첫 번째 반복(루프) 때는 아래와 같은 항목이 실행이 되고, 반복자(i)의 크기가 1이 늘어난다.

student[0] = students[0].replace("철수","")
print(students[0])

이제 i는 1이 되었고 아래와 같은 항목이 실행이 된다.

student[1] = students[1].replace("철수","")
print(students[1])

반복적으로 실행을 하며 i는 3,4,5 ... 28까지 왔고 다음과 같은 마지막 항목이 실행이 되며 for반복문이 종료된다.

student[29] = students[29].replace("철수","")
print(students[29])

 

다음으로는 또 다른 반복문인 while문에 대해서 알아보도록 하자

 

while문의 사용

cnt = 0
while(cnt<30) :
	students[cnt] = students[cnt].replace("철수","**")
    	print(student[cnt])
    	cnt+=1

while은 다음과 같은 문법 형태를 가진다.

조건은 저번 시간에 배웠던 True, False를 반환 가능한 연산자를 활용해도 되고, True나 False 그 자체를 집어넣어도 상관없다. for와 비슷한 형태를 가지지만, 반복자가 없다는 특징이 있다. 이러한 이유로 while 반복문에서 반복자 같은 개념을 사용하려면 직접 반복자 같이 사용할 변수를 지정해야 한다는 특징이 있다.(위 예시문에서는 cnt가 되겠다)

 


이번 시간에는 반복문의 기본인 for와 while에 관하여 이야기를 나누었다. 다음 시간에는 반복문에 대한 깊은 이해를 위해 여러 가지 반복문의 사용과 반복문의 특징과 주의 점등을 알아보도록 하자

Python이 제공하는 강력한 기능 중 하나인 SLICING, 자료구조를 압니다.라고 자신 있게 말한 사람이 SLICING도 모른다고 하면 그것도 참 웃긴 일이다.  Python을 Python 답게 해주는 또 다른 강력한 도구인 SLICING에 대해서 알아보고 자료구조와 어울리는 간단한 내장 함수 또한 알아보도록 하자

 


 

SLICING : 파이선에서 연속적인 객체들의 일부 범위를 선택해서 가져오는 방법

그렇다. 말그대로 자료구조 중 일부를 잘라(SLICE)해서 가져오는 방법이 SLICE이다.

우리를 도와줄 자료구조 my_array를 소개한다.

>> my_array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 
87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

그렇다 0~99를 가진 LIST이다.

 

SLICING은 3가지만 기억하면 된다. START, END, STEP

① start : 어디서부터 SLICE 할지를 지정하는 인덱스이다.

② end : 어디까지 SLICE할지를 지정하는 인덱스이다.

③ step : 보폭이다. start와 end사이를 얼마나 뛰어서 슬라이스 할지를 의미한다.

 

다음의 예시를 보면서 SLICE와 친숙해져 보도록 하자

>> print(my_array[0:50:2])
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48]

>> print(my_array[:30:4])
[0, 4, 8, 12, 16, 20, 24, 28]

>> print(my_array[3::10])
[3, 13, 23, 33, 43, 53, 63, 73, 83, 93]

>> print(my_array[:-50])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 
48, 49]

위에서 알 수 있는 SLICING의 규칙은 다음과 같다.

1. 값이 생략되면 start는 0, end는 인덱스의 끝, step은 1을 가진다.

2. 음수는 뒤에서부터 카운트한다.(따라서 배열의 가장 마지막은 -1의 인덱스, 2번째 마지막은 -2의 인덱스 가 된다. 꽤나 자주 사용하는 인덱스이니 알아두기를 바란다.)

 

내장 함수

내장 함수는 파이선에서 기본적으로 제공하는 함수들로 정말 많은 내장 함수들이 있지만, 특히 자료구조와 더욱 어우러 지는(어우러진다. 마치 오리엔탈 샐러드) 내장함수들이 많이 존재한다. 다음과 예시를 보도록 하자

>> my_array = [1,2,3,4,5,6]
>> my_dict = {1:"a",2:"b",3:"c"}
>> my_tuple = (1,2,3)

>> sum(my_array)
21
>> sum(my_dict)
6
>> sum(my_tuple)
6

>> len(my_array)
6
>> len(my_dict)
3
>> len(my_tuple)
3

>> max(my_array)
6
>> max(my_dict)
3
>> max(my_tuple)
3

>> min(my_array)
1
>> min(my_dict)
1
>> min(my_tuple)
1

위에 사용된 함수는 총 4가지가 있다. ① 합연산의 sum, ② 길이를 반환하는 len, ③ 최댓값을 반환하는 max, ④ 최솟값을 반환하는 min 이 4가지만 알아도 간단한 프로그램의 자료구조를 내장 함수 사용하는 데에는 어려움은 없을 것이다.

* dict은 list와의 강제 캐스팅 때에도 보았었지만 기본적인 연산을 적용하는 경우 보통 key를 기준으로 연산이 되는 것을 확인할 수 있다. dict.items()는 이때 사용되는 것이다. 자세한 것은 반복문에서 배우게 될 것이다.


이번 시간에는 간단하게 원하는 부분을 자르는 SLICING과 자료구조와 어우러지는 내장 함수를 몇 가지 살펴보았다. 이제 프로그래밍의 꽃인 반복과 제어 그중에서도 반복에 들어갈 준비가 된 것이다. 설마 벌써 흥미를 잃지는 않았기를 바라면서(필자는 여기서 흥미를 잃었었다.) 필자는 다음 강의에서 여러분을 기다리겠다.

+ Recent posts