5.3 파이썬 문법


어떤 언어든 읽고 쓰기 위해서 언어의 문법을 알아야한다. 언어문법을 제대로 정의하며 옳은 구조로 의미를 표현할 수 있어야 읽고, 쓴다고 할 수 있는 것이다. 파이썬의 문법은 올바르게 구성하는 표현방법을 정의한다. 파이썬 번역기는 오직 언어의 구문 규칭게 따라 올바르게 쓰여진 명령문만 실행할 수 있다. 이번 절에서는 파이썬 언어의 문법을 일부 학습할 것이다.

 

5.3.1 계산

데이터 스트림에 대한 계산은 일반적으로 숫자(numbers) 또는 문자(characters) 를 포함한다. 어떤 숫자들은 -10, 512, 32, 0과 같은 양수 또는 음수의 정수 일 수 있다. 이 같은 숫자는 종종 프로그래밍 언어에서 "정수(integers)"라고 한다. 다른 숫자들로는 2.1415, 1.8, -267.52는 양수 또는 음수의 소수점이 포함된 유리수 일 수도 있다. 이 같은 숫자는 종종 프로그래밍 언어에서 "부동 소수점(floating point)" 숫자라고 불려진다.

 

프로그램에서는 숫자가 아닌 값도 사용하거나 조작하기도 한다. 우리는 이미 이전의 예제들 중에서 온도 범위를 설명하는 "hot"이나 지명인 "Blacksburg,VA(버지니아 주)"와 같은 값들을 보았다. 문자의 순서열로 이루어진 이러한 데이터들은 “character string” 또는 "string(문자열)"이라 한다.

 

수와 문자를 조작하는 명령문들에 대한 문법들은 아래에 설명되어 있다. 여기에서는 완벽하지는 않지만 기초적인 설명을 제공한다. (이 정도의 이해는 Python Tutorial 을 통해)을 시작하기에는 충분하지만 파이썬 지식을 확장하기 위해서는 다른 내용들을 찾아보는 것이 필요하다.

 

수치

수치 계산은 주로 어떤 속성 값을 초기화, 변경 또는 갱신하기 위해 수행된다. 계산 값은 속성의 새 값으로 지정된다. 이 값들은 값이 변경 될 수 있기 때문에 "변수 속성"이라고 한다. "변수 속성" 용어 대신에 "변수"라는 용어로 짧게 줄여서 사용된다.

 

아래는 이전에 본 파이썬의 온도 변환 계산의 예이다.

ftemp = 77
celsius = (ftemp - 32)/1.8

이 계산 결과 celsius 변수에 할당 된 값은 25.0이다.

 

계산을 위한 문법은 매우 간단하지만 몇 가지 위험이 있다. 아래의 코드는 온도 변환 계산을 잘못 사용한 예이다 :

ftemp = 77
celsius = ftemp-32 / 1.8

 

이 경우 파이썬에서 변수 celsius 에 할당 된 값은 약 59.2이다. 앞서 수행했던 celsius = (ftemp - 32)/1.8의 계산과는 명백한 차이가 있다.


위 두 계산에 차이는 파이썬에서는(대부분의 프로그래밍 언어에서와 같이) 계산을 할 때 정해진 규칙에 따라 계산순서가 정해져 있다는 점에서 나오는 것이다. 계산의 각 단계는 수학 연산자를 선택한 뒤 피 연산자와 그 작업을 수행하는 것이다. 위의 각 예에서는 감산 단계를 먼저 수행하거나 나눗셈을 먼저 수행할 것인가에 대한 선택분기가 있다. 파이썬에서는, 각 수학 연산자는 정의된 순서에 따라 순위, 또는 "우선순위"가 매겨져 있다. 다음 표가 각 숫자 연산자와 그들의 우선순위가 높은 순서대로의 목록이다 :

 

표 5-1. 연산의 의미

연산 의미
() 괄호, 그룹
** 지수(권한 상승)
+x, -x 양수, 음수
*, /, % 곱셈, 나눗셈, 나머지
+, - 덧셈, 뺄셈

 

그룹화를 위한 괄호가 가장 높은 우선순위를 가지는 반면, 덧셈과 뺄셈은 가장 낮은 우선순위를 지니고 있다.

첫 번째 예에서는 부분 (ftemp - 32)에서 괄호는 빼기가 먼저 수행하게 한다. 첫 번째 예제에서의 계산 순서는 다음과 같다.:

  1. 빼기 연산자를 계산하면 77 - 32의 계산 결과는 45이다.
  2. 나눗셈 연산자를 계산하면 45/1.8의 계산 결과는 25.0이다.

 

두 번째 예에서는, 괄호가 없고, 나눗셈의 “우선순위"가 빼기보다 높기 때문에 나눗셈 단계를 먼저 수행하게 한다. 두 번째 예제에서의 계산 순서는 다음과 같다.

  1. 나누기 연산자를 계산하면 32/1.8는 (약) 17.7이다.  
  2. 연산자를 선택하고 77 - 17.7의 계산 결과는 59.2이다.

 

계산식을 정확하게 썼는지 아닌지 확신이 들지 않는다면 아래 방법을 통해 항상 확인할 수 있다.:

  • 실험해보자. 계산하기 위해 파이썬의 상호작용 능력을 사용해보고, 기대하는 결과가 나오는지 보아라.
  • 괄호 추가. 괄호는 항상 가장 높은 우선 순위를 갖기 때문에 괄호를 추가함으로써 계산하는 단계의 순서를 확신 할 수 있다.
  • 고쳐쓰기. 각 계산식의 단계가 명확해지도록 하나의 계산식을 여러 개로 분할해라. 예를 들어, 온도 변환을 다음과 같이 쓸 수 있다:

 

ftemp = 76
num = ftemp - 32
celsius = num/1.8


문자형(Characters)

문자의 문자열은 글( “To be or not to be”), 사람 ( "“John Doe”"), 위치 (“Blacksburg, VA”), 사건 ( “Norman Invasion”), 조건 ( “hot" ), 주식 ( "MS"), 유전자 배열 ( "AACGTTTAACC") 등을 표현하기 위한 자연스러운 방법이다. 많은 빅데이터(Big Data) 스트림들은 문자 데이터를 어떤 형태로든 포함할 것이다.

 

숫자처럼 보이는 문자열은 실제로 숫자가 아니다. 문자열 "256"과 숫자 256은(적어도 컴퓨터에게는) 매우 다른 것이다. 첫 번째는 문자열이며, 두 번째는 숫자다. 예를 들어, 문자열 "256"은 숫자가 아니기 때문에 "256" - 50를 작성하는 것은 무의미하다.

 

파이썬의 문자열은 문자들의 배열이다. 문자열의 각 문자는 위치 또는 색인(index)을 가지고 있다. 첫 번째 문자의 색인은 0(zero)이고 두 번째 문자의 색인은 1이다. 만일 문자열이 n개의 문자를 가지고 있는 경우, 문자열에서 마지막 문자의 색인은 n-1이다. 공백문자 또는 띄어쓰기도 화면에 표시되지는 않더라도 문자이다.

 

아래의 코드는 문자열을 이용하여 할 수 있는 기초적인 작업 몇 가지를 보여준다. 미리 만들어진 len 함수는 문자열의 문자 개수를 반환한다. 개별 문자들은 각각의 색인을 통해 접근 할 수 있다. 예를 들면, text[0]는 첫 번째 위치에 해당하는 문자를 말한다. 조각(slice)은 문자들의 연속적인 배열이다. 예제 텍스트에서 text[0:10] 는 첫 번째 문자로 시작하서 11번째까지의 연속된 문자들을 의미한다.

 

조각(slice) 내에 첫 번째 색인이 없으면 그 첫 번째 문자부터 시작되는 것으로 간주되고, 조각(slice)에서 두 번째 색인이 없는 경우에는 마지막 문자까지 의미하는 것으로 간주한다.



(string-example1-spyder)

 

문자열은 여러 부분으로 나눌 수도 있고, 여러 개를 결합 할 수도 있다. 의 첫 번째 부분은 문자열을 반으로 나눈다. middle의 값이 색인 번호로 쓰일 수 있도록 정수 나누기 문자( "//")가 문자열 색인의 전체 값을 반으로 나누는데 사용되는 것에 주목하라. 예제의 두 번째 부분은 두 조각된 문자열이 텍스트 전체의 줄임표를 형성하기 위해 결합한다. 더하기 기호("+")가 문자열을 함께 연결하는데 사용됐다는 것을 주목해라.



(string-example2-spyder)

 

파이썬은 문자열을 검색하거나, 편집하기 위한 다양한 방법들을 제공하고 있다. 연산자 in은 문자열에 포함된 단어를 검색하고, 단어가 있다면 True를 없으면 False를 출력한다. count 는 문자열에서 단어가 발생한 횟수를 알려줍니다. replace는 한 단어를 다른 단어로 대체하며, 새로운 문자열을 생성한다. 마지막으로, find는 본문에서 특정 단어가 시작되는 위치의 색인번호를 반환한다.



(string-example3-spyder)

 

이러한 연산에 대한 세부 내용과 string 방법론의 완전한 리스트는 Python Documentation에서 찾을 수 있다.

 

5.3.2 선택

If 문
우리는 NetLogo와 Blocky에서 프로그램의 목적을 이루기 위하여 어떻게 프로그램이 ‘선택’할 수 있게 만드는건지 봤었다. 파이썬에서의 선택문들은 이 밑의 ‘뜨거움과 차가움을 분류하는 프로그램’예시에서 사용된 것처럼 3가지의 형태(flavors)로 나타낼 수 있다.

표 5-2. 연산의 의미

Category Above At/Below
Hot 90  
Warm 76 90
Cool 50 76
Cold 32 50
Frigid   32

 

이 분류에 따르면 화씨 95°(섭씨 35°)는 “Hot”, 90°(섭씨 32°)는 “Warm”, 75°(섭씨 24°)는 "Cool", 32°(섭씨 0°)는 "Cold"가 될 것이다.

 

앞에서 설명한 코드의 들여쓰기는 파이썬의 결정문과 관련하여 매우 중요한 부분이다. 파이썬의 표준 들여쓰기는 각 단계에서 띄어쓰기 4개를 사용하는 것임을 기억하자..

 

첫 번째 예에서 우리는 단순히 ‘주어진 온도가 "Hot"으로 분류되는 것인가’를 결정한다. 프로그램 속 논리의 흐름 형태(Flow Chart)는 다음 그림과 같다.

5-15

그림5-15. “Hot” 온도를 분류하기 위한 순서도

 

 



(if-then-example-spyder)

 

코드의 구문에 대해 주목해야 할 것이 세 가지가 있다.

 

  • if문 끝에 콜론(”:”)이 있다.
  • 조건에 해당할 경우 실행되는 명령문은 if문으로부터 띄어쓰기 4개로 들여쓰기가 되어 있다. 이 경우 들여쓰기가 된 것은 문맥 한 개 뿐이지만, 문맥이 더 많다면 모두 다 똑같이 들여쓰기가 되어 있어야 한다.
  • if문 이후에 써진 문맥들은 if문과 동등한 수준의 문맥으로 취급받는다. print문과 if문의 들여쓰기의 정도가 똑같은 것에 주목하라.

 

두 번째 예에서는 주어진 온도가 "Hot"인지 또는 "Frigid"인지를 결정한다. 프로그램 속 논리의 흐름 형태(Flow Chart)는 다음 그림과 같다.

5-16

그림5-16. “Hot” 과 “Frigid” 온도를 분류하기 위한 순서도

 

이 경우에 대한 코드는 다음과 같다:

 



(if-then-else-example-spyder)

 

예제의 구문에 대한 중요한 부분은 다음과 같다:

  • if 문이 끝에 콜론(”:”)이 있다.
  • 키워드 else문이 if문의 대안으로 시작하며 if문과 마찬가지로 끝에 콜론(”:”)이 있다.
  • else를 위한 코드는 4개의 띄어쓰기로 들여쓰기를 한다. 이는 첫 번째 결정문이 True일때 실행하게 될 코드와 같은 단계의 들여쓰기다. 이것은 else코드의 들여쓰기가 첫 결정에 대안으로 실행되는 것을 나타낸다.
  • 두 번째 결정이 참일 때 실행되어질 코드는 if문보다 4개의 띄어쓰기를 더 들여 쓴다.

 

세 번째 예에서는 주어진 온도 “Hot”, “Warm”, “Cool” 또는 “Other"인지를 결정한다. 프로그램 속 논리의 흐름 형태(Flow Chart)는 다음 그림과 같다.

5-17

그림5-17. “Hot”, “Warm”, “Cool”, “Other” 온도에 따른 순서도

 

이 경우에 대한 코드는 다음과 같다:



(if-elif-example-spyder)

 

예제의 구문에 대한 중요한 주의 사항:

  • elif 키워드는 else if에 대한 축약이다.
  • 모든 if, elif 와 else문 끝에는 콜론(”:”)이 있다.
  • 각 선택을 위해 실행되어질 코드는 ● 네 개의 띄어쓰기로 들여쓰기를 한다.

 

조건

if 문에서 사용되는 조건들은 다양한 개별검사를 포함할 수도 있고, 개별검사들은 결합하여 복잡한 조건을 형성할 수도 있다. 개별검사는 비교(또는 관계) 연산자를 포함한다. 우리는 이전에 연산자 ~보다 큰을 사용한 temp > 90과 같은 개별 조건을 보았었다. 개별 검사의 결과는 true 또는 false이다. 비교 연산자와 그 의미는 다음 표와 같다.

표 5-3. 연산자

연산자 이름 예시 참일 때(와 거짓일 때)
== 동등

temp == 90

temp는 90이다.

!= 부등 temp != 90

temp는 90이 아니다.

> ~보다 큰 temp > 90

temp는 90 보다 크다.

< ~보다 적은 temp < 90

temp는 90보다 작다.

>= 크거나 같은 temp >= 90

temp는 90보다 크거나 같다.

<= 작거나 같은 temp <= 90

temp는 90보다 작거나 같다.

 

논리 (또는 부울) 연산자는 더 복잡한 테스트를 위해 개별 테스트들을 결합하는 데 사용된다. 논리(또는 부울) 연산자는 true 와 false값들을 조합하여 true 또는 false 결과를 낸다. 논리 연산자와 그 의미는 다음 표와 같다.

 

표 5-4. 연산자 2

연산자 예시 참일 때(와 거짓일 때)
and

(temp < 90) 와 (temp >= 76)

(temp <90) 와 (temp >= 76) 둘다 참

or

(temp > 90) 또는 (temp <= 32)

(temp> 90) 또는 (temp <= 32) 중 적어도 하나에 해당

not

(temp > 90)가 아닌

(temp > 90)이 아닌

 

예를 들어, 온도가 “Warm”인지 “Cold”인지를 검사하기 원한다면 이 코드를 사용할 수 있다 :



(and-example-spyder)


 

온도 분류의 양쪽 제일 끝에 있는 “Extreme” 온도를 표현하길 원한다면, 이 코드를 사용할 수 있다:



(or-example-spyder)

 

마지막으로, 극한(Extreme)온도가 아니어서 “Seasonable” 온도로 분류하길 원한다면 이 코드를 사용할 수 있다. :



(not-example-spyder)

 

괄호의 추가는 or 연산자가 먼저 수행되는 것을 보장하기 위해 사용되어진다.

 

5.3.3 함수

함수 개념에 대한 이해는 적당한 크기의 프로그램을 작성하려면, 그리고 다른 사람이 작성한 코드를 재사용할 수 있으려면 필수다. 빅 데이터 스트림을 위한 코드들처럼 다른 사람들에 의해 개발 된 코드들은 보통 새로운 애플리케이션을 만드는데 사용될 수 있는 함수로서 제공된다.

 

함수 개념을 학습하기 전에 모듈화(Modularization)라는 개념에 대하여 학습할 필요가 있다. 컴퓨팅적 관점에서는 하나의 큰 문제를 해결하기 위해 분할 정복(Divide and Conquer)이라는 방식을 사용한다. 분할 정복은 3단계로 구성이 되어있는데, 1단계에서는 하나의 큰 문제를 풀기 쉽게 작은 단위로 분할한다. 2단계에서는 1단계에서 나누어진 작은 단위의 문제들을 해결한다. 그리고 3단계에서는 2단계에서 도출한 작은 단위의 문제들의 해결책을 통합한다. 이렇게 3단계의 과정을 거쳐서 나온 해결책이 결과적으로 큰 문제의 해결책이 되는 것이다. 다음은 분할 정복 방식을 그림으로 표현한 것이다.

 

5-18

그림 5-18. 모듈화

 

이와 같이 하나의 큰 문제를 풀기 위해서 작은 단위로 문제를 쪼개는 것을 모듈화라고 한다. 이를 프로그램에 대입하면 하나의 큰 문제는 전체 프로그램을 의미하고, 각각의 작은 단위의 문제들은 모듈과 함수라고 할 수 있다.

함수는 작은 모듈이라고 불리기도 한다. 다음은 함수 정의와 정의된 함수를 호출하는 형식을 보여준다.

 


def 함수명(매개변수1, 매개변수2, ...매개변수N):
    구문
    return 반환값
함수명(매개변수1, 매개변수2, ...매개변수N)

 

위와 같이 함수의 선언은 def로 시작하여 세미콜론(:)으로 끝내고, 함수 내용의 시작과 끝은 코드 들여쓰기로 구분한다. 그리고 함수의 매개변수는 개수에는 제한이 없으므로 매개변수를 지정하지 않아도 되며, 사용자가 필요한 만큼 지정할 수 있다. return문은 반환 값을 명시하며 반환 값이 없을 경우 사용하지 않아도 된다.

 

다음은 위에서의 간단한 함수 정의와 정의된 함수를 호출하는 예시이다. 아래의 함수는 두 개의 매개변수로 넘겨받은 두 숫자를 더한 값을 반환하는 함수이며, 다음과 같이 매개변수로 12, 18을 주고 호출할 경우 30을 반환 값으로 돌려준다.


def add(num1, num2):
    sum = num1 + num2
    return sum
add(12, 18)

 

 

위와 같은 함수는 우리가 직접 만들 수도 있고, 이미 만들어져 있는 것도 있다. 직접 만드는 경우는 앞에서 본 add 예시에서 이미 보았다. 그리고 미리 만들어져 있는 경우는 다음과 같다.

 

import math

print sqrt(2) # 제곱근 함수

print log(12) # 자연 로그 함수

위의 예시는 sqrt함수와 log함수가 미리 정의되어 있는 math 모듈을 import 해서 사용한 예시이다.

 

범위(Scope)

범위란 변수의 범위를 말한다. 변수는 크게 전역 변수(global variable)와 지역 변수(local variable)로 나뉜다. 전역 변수는 프로그램 전체 영역 어디서든 접근이 가능한 변수이며 지역변수는 함수나 블록 안에서 선언된 변수로, 변수가 선언된 부분에서만 접근이 가능하다.

number1 = 1

 

def add(num):

number2 = 3

sum = number1 + number2 + num

return sum

 

print( add(3) ) ------------------------------------(1)

print(number2) ------------------------------------(2)

 

위의 예시에서 number1은 전역 변수이고 number2는 지역 변수 이다. 위의 예시를 구문(1)까지 작성하여서 실행해보고 구문(2)까지 작성하여 실행해보길 바란다. 구문(1)까지 작성하여 실행하였을 때는 오류가 발생하지 않고, 구문(2)까지 작성하여 실행하였을 때는 오류가 발생하는 것을 알 수 있을 것이다. 이는 number1은 전역 변수이므로 add함수 밖에서 선언되었음에도 불구하고 add함수 안에서 접근할 수 있고, number2는 함수 안에서 선언된 지역 변수이므로 선언된 함수 안에서의 접근은 허용되지만 함수 밖에서의 접근은 허용이 되지 않기 때문이다.

 

다음은 add 함수 밖에 add 함수 안의 변수 number2와 같은 이름의 변수를 선언하고, add 함수 안에서와는 다른 값을 대입한 것이다. 결과를 예측해 보고 직접 작성 후 실행해 보길 바란다.

number1 = 1

number2 = 1

 

def add(num):

number2 = 3

sum = number1 + number2 + num

print( number2 ) ----------------------------(1)

return sum

 

print( add(3) )

print( number2 ) -----------------------------------(2)

 

위의 예시의 구문(1)과 구문(2)는 분명 같은 구문이다. 그러나 실행 결과는 구문(1)에서는 3이 출력되고, 구문(2)에서는 1이 출력된다. 이는 함수 밖에서 선언한 number2와 함수 안에서 선언한 number2가 다른 변수임을 의미한다. 그리고 함수 안에서 number2에 3을 대입한 것은 함수 밖의 number2에는 아무런 영향을 미치지 않는다는 것을 알 수 있다. 또한 위의 예시를 실행해보면 알 수 있듯이 add(3)의 실행 후 반환 값은 7이다. 이는 ‘sum= number1 + number2 + num’에서의 number2가 함수안의 number2를 의미한다. 이처럼 파이썬 문법에서는 특정 변수 값을 참조할 때 같은 이름의 전역 변수가 있어도 참조하려는 위치(이 예시에서는 sum값을 구하기 위한 식)와 가장 가까운 위치의 변수를 참조한다는 것을 알 수 있다.

 

그렇다면 함수 안에서 전역 변수인 number2값을 변경하고 싶다면 어떻게 하여야하는가? 답은 간단하다. 다음과 같이 global 키워드를 붙이면 된다.

number2 = 1

 

def change():

global number2 = 3

global number3 = 3

 

change()

print(number2)

print(number3)

 

위와 같이 함수를 선언하고 호출한 후, number2와 number3의 값을 각각 출력하면 모두 3이 나오는 것을 알 수 있다. 함수 밖의 number2는 전역 변수 임에도 불구하고 위와 같이 함수 안에서 global 키워드를 이용하여 접근하면 값을 변경하는 것이 가능하다. 그리고 number3는 함수 안에서 선언한 변수임에도 불구하고 global 키워드를 사용하였기 때문에 전역변수로 선언이 되어 함수 밖에서도 참조가 가능하다.

 

이렇게 모듈을 사용함으로서의 이점은 다음과 같다.

  • 재사용을 할 수 있다.
  • 개별적으로 실행할 수 있고, 작성될 수 있으므로 큰 프로젝트를 병렬로 개 발할 수 있다.
  • 프로그램의 길이를 줄여주고 더 알아보기 쉽게 해준다. 또한 프로그래머 는 모듈의 사용법외의 복잡한 모듈의 내용을 알 필요가 없다.

 

다음과 같은 함수를 갖는 my_math라는 모듈이 있다고 가정해보자.

def plus( a, b ) :

   result = a + b

   return result

def minus( a, b ) :

   result = a - b

   return result

def div( a, b ) :

   result = a / b

   return result

def mul( a, b ) :

   result = a * b

   return result

 

my_math라는 모듈의 함수를 쓰는 예시이다.

import my_math

 

print(my_math.plus( 2, 4 ))

print(my_math.div( 4, 2 ))

 

예시를 보면 알 수 있듯이, 한번 my_math라는 모듈을 작성하면 import my_math라는 구문만 사용하면 언제 어디서든 my_math에서 작성한 함수들을 다시 작성할 필요 없이 재사용할 수 있다. 그리고 개발한 내용을 위의 예시처럼 import문을 사용해 모두 가져다 쓸 수 있으므로 프로그래머들은 병렬로 프로젝트를 개발할 수 있게 된다. 한 프로그램에서 my_math에 작성된 함수인 plus와 div를 여러 번 사용한다고 가정해보라. 그렇다면 프로그래머는 plus와 div가 필요할 때마다 다시 작성을 하게 될 것이고, 그것은 프로그램에 같은 코드를 여러 번 작성함으로써 프로그램의 길이를 길고 복잡하게 만들 것이다. 또한 프로그래머 입장에서도 복잡한 모듈의 내용을 모두 다 알 필요는 없다. 위와 같이 모듈을 사용하면 복잡한 모듈의 내용을 직접 작성하거나 알지 않아도 모듈안의 함수들과 각 함수들의 사용법만 알면 복잡한 모듈을 손쉽게 사용할 수 있다.

 

이제 위해서 학습한 함수의 개념을 다음 예시와 연습문제들에 적용해보길 바란다.

하나의 매개 변수와 함수

아래의 예는 화씨온도의 스트림을 섭씨온도의 스트림으로 변환하는 Blocky 코드를 Python코드로 번역한 것이다. 이 예에서는 함수 정의 및 기능의 일반적인 의미는 다음과 같다:

 

정의 : 나는 변환 함수이다. 나를 호출할 때 TheStream이 변환 할 화씨온도 리스트를 나에게 주어라. 나는 그것을 해당하는 섭씨온도 리스트로 반환하여 돌려줄 것이다. 나는 섭씨온도 리스트인 TempStream을 생성한다. 하지만 호칭은 당신 맘대로 해라

 

호출 : 나는 Fstream이라고 부르는 화씨온도 리스트를 가지고 있다. 이것을 섭씨온도 리스트로 변환해라. 나는 당신이 나에게 반환하는 리스트를 받고, 그것을 Cstream이라고 부를 것이다.

 



(functions-one-parameter-spyder)

 

파이썬에서 함수의 정의는 함수의 이름 앞에 키워드 def와 함께 시작된다. 이 경우에는 함수의 이름이 convert이며, 함수 뒤의 괄호안의 이름은 이 함수의 “매개변수(parameter)”이다. "매개변수"는 이 함수의 입력이며 이 경우에는 화씨온도 리스트다. convert 함수는 하나의 매개 변수가 있다. 나중에 나올 예시에서는 한개 이상의 매개 변수를 가진 함수들이 나올 것이다. 이 함수에서는 섭씨온도 목록을 구성하는 TempStream이라는 목록을 사용한다. return 문은 함수의 "출력"을 지정합니다. 함수가 실제로 실행될 때 return 명령문은 함수 실행의 종료를 알리고, 호출자에게 제어의 흐름을 반환한다.

 

밑에 예시 코드는 함수가 메인 프로그램에서 어떻게 사용되는지 보여준다. 함수 호출은 메인 프로그램에서 Fstream이라고 부르는 화씨온도 리스트를 Cstream이라고 부르는 섭씨온도 리스트로 변환하게 한다. 함수 호출은 단순히 함수의 이름을 사용하고, 예상되는 입력을 제공하는 것만을 수반한다. 함수의 의해 반환되는 출력 값은 반환된 값이 나타나 사용될 수 있는 어떤 곳이라도 되다.

 

연습문제 : 메인 프로그램에서 Fstream을 Fahr_Temps로 변경하기 위해 위의 코드를 수정하여라. 수정된 프로그램을 실행하여라. 동일한 출력을 생성 하는가? 왜 인지 또는 왜 아닌지 설명해라.

연습문제 : 메인 프로그램에서Cstream을 Celsius_Temps으로 변경하기위해 위의 코드를 수정하여라. 수정된 프로그램을 실행하여라. 동일한 출력을 생성 하는가? 왜 인지 또는 왜 아닌지 설명해라.

연습문제 : 함수의 이름을 convert에서 change로 변경하기 위해 위의 코드를 수정하여라. 코드는 동일한 출력을 생성한다. 테스트해보아라.

연습문제 : 함수의 이름을 convert에서 원하는 이름으로 변경하기 위해 위의 코드를 수정하여라. 코드는 동일한 출력을 생성한다. 테스트해보아라.

연습문제 : 화씨에서 Kelvin으로 변경되도록 위의 코드를 수정하여라.

연습문제 : 섭씨에서 화씨로 변경되도록 위의 코드를 수정하여라.

 

모듈 가져오기

이 예의 메인 프로그램은 get_forecast 함수와 round 함수와 같은 자신이 위에 정의하지 않은 함수를 사용한다. 이 예는 프로그램들이 미리 정의된 함수를 재사용하는 전형적인 방법을 보이고 있다. 이미 만들어진 것이 있다면 왜 그것들을 다시 작성하기 위해 노력을 기울이는가? 함수들과 관련된 모음은 종종 module에 함께 그룹화 되어있다. 각 모듈은 고유 한 이름을 가지고 있다.

 

모듈에서 한 가지 또는 그 이상의 함수를 사용하기 위해서는 모듈이 imported되어 있어야 한다. 임포팅(Importing)이란 파이썬 인터프리터가 이 이름으로 모듈을 찾고, 그 지정된 모듈에서 찾은 함수 정의사용하기 위해 준비되는 것을 의미한다. 명령어 import weather는 파이썬 인터프리터가 weather라는 이름의 모듈을 찾을 것이라는 것을 의미한다. weather모듈에서 정의된 함수 중 하나가 get_forecasts함수이다.

 

모듈에서 함수를 호출하기 위해 호출자는 모듈이름과 함수 이름을 모두 지정해야 한다. 그 구문은 모델 이름과 함수 이름 사이에 마침표 ( ".") 하나가 필요합니다. 위에 코드에서 weather모듈 안의 get_forecasts 함수를 얻기 위해서는 weather.get_forecasts(...) 명령어가 필요하다.

 

round 함수는 "내장(built in)"함수의 예이다. 파이썬은 round와 같이 매우 일반적이거나, 기본적인 함수들이여서 모듈 이름이 필요 없게 미리 정의 된 함수들을 가지고 있다.

 

파이썬 표준 모듈과 내장된 모듈에 대한 완전한 목록은 Python Standard Library에서 찾을 수 있다. 파이썬 개발자 커뮤니티는 광범위한 모듈 컬렉션을 가지고 있다. 우리도 나중에 이러한 라이브러리의 일부를 사용하게 될 것이다.

 

여러 매개 변수와 함수

함수는 그 목적을 위해 필요한 여러 개의 매개 변수(여러 개의 입력과 같은)가 있을 수 있다. 아래의 예는 매개 변수가 두 개인 함수를 보여준다. filter라 불리는 이 함수는 두 개의 매개 변수가 있다. 첫 번째 파라미터는 aStream이고 온도의 목록이다. 두 번째 파라미터는 limit이고 온도이다. 함수는 aStream에서는 limit 에 표시된 온도 이상의 값을 리스트로 반환한다. 즉, 이 함수는 제한된 값 아래의 모든 온도를 필터링한다.



(function-two-parameters-spyder)

 

두 개의 매개변수가 함수의 이름 뒤 괄호 안에서 쉼표로 구분 된다는 것을 filter 함수의 예에서 알 수 있다.

 

이 예제들의 함수 정의를 연습문제에서 사용하여라.

연습문제 : filter 함수를 사용하는 메인 프로그램을 작성하여라.

연습문제 : 제한된 값 이상의 온도를 필터링하도록 함수를 조정하여라. 개발한 메인 프로그램 테스트하여라.

연습문제 : 리스트, 하한값, 상한값을 가지는 함수를 정의하여라. 함수는 하한온도와 상한온도 사이에 있지 않은 온도를 필터링하도록 한다.

 

5.3.4 사전

구조와 연산

빅데이터 스트림의 구조는 당연하지만 예시에서 간단히 사용되는 스트림보다 복잡하다. 여러 도시들의 현재 온도에 대한 데이터 스트림은 다음 표에 나타낸 정보를 포함 할 수 있다. 이 테이블은 네 개의 행으로 이루어졌으며 각 행이 한 도시와 현재의 온도를 나타낸다.

 

표 5-5. 각 도시에 대한 현재 온도 데이터 스트림

도시 온도

Blacksburg, VA

77

New York, NY

85

San Jose, CA

75

Miami, FL

 88

 

파이썬에서 표에 있는 각 행은 key-value쌍이라고 불린다. 도시가 key이며 온도가 value이다. key는 주요 관심 행을 찾는 테이블 형 구조에서 사용된다. key는 검색에 사용되기 때문에 테이블에서 key는 고유한 값을 가져야 한다. 예를 들어, key "New York,NY"에 오직 하나의 행에만 있을 수 있다. 왜냐하면 동일한 key를 가진 두 개의 행이 있다면, 프로그램에서 검색을 했을 때 어떤 것을 사용해야 하는지 모를 것이기 때문이다.

 

파이썬은 이 같은 구조를 가진 테이블을 설명하기 위해 "dictionary"라는 용어를 사용한다. 구문적으로 위의 표는 파이썬 사전에서라면 이렇게 쓰일 것이다. :

{ "Blacksburg, VA" : 77, "New York, NY" : 85, "san Jose, CA" : 75, "Miami, FL" : 88 }

 

사전은 중괄호로 둘러쌓여있다. (“{” and “}”). 각 행은 쉼표 (,)로 다음 행을 분리한다. 각 행은 key가 콜론(“:”)에 의해 value와 분리된 key-value쌍이다. 따라서, "Blacksburk, VA" :77 는 “Blacksburg,VA”가 key이며, 77 은 value를 가지는 key-value쌍이다.

 

파이썬 목록 및 파이썬 사전 사이의 주요 차이점은 목록은 정렬되어있는 반면, 사전은 정렬되어 있지 않다는 점이다. 예를 들어 위의 테이블에서는 행의 순서와 관계없이 어느 도시의 온도이던 간에 항상 찾을 수 있기 때문에 행의 순서와는 전혀 상관이 없다. 사전에서 어떤 것을 찾는 것은 행의 위치가 아닌 행의 key-value에 의해 결정된다.

 

테이블에서 행을 찾는 명령어 구문과 값의 접근 및 변경은 아래 예에서 볼 수 있다. 또한 예제에서 key-value쌍의 추가와 삭제 방법에 대해서도 볼 수 있다.



(dictionary-operations-spyder)

 

dictionary[entry]entry == key인 key-value쌍을 나타내는데 사용된다. key-value 쌍이 사전에 존재한다면, 할당 문에서 값(value)을 위한 자원 또는 값을 변경하기 위한 업데이터 동작의 대상으로 사용되어질 수 있다. key-value 쌍이 존재하지 않는다면, 할당은 특정 keyvalue 을 가진 새로운 사전 엔트리를 생성하는데 사용한다. 마지막으로, 키 - 값 쌍은 del 연산을 사용하여 사전에서 삭제할 수 있다.

 

사전의 더 나은 이해를 위해 위의 예에 요소들을 추가하거나 삭제해보아라.

 

반복과 사전

파이썬은 사전으로 작업할 수 있도록 반복 동작의 확장을 제공한다. 다음의 예는 사전의 내용을 출력하는 간단한 예를 보여준다. items() 메소드는 사전의 key-value 쌍을 반복하는 의도를 표현하기 위해 필요하다.



(dictionary-iteration-print-spyder)

 

추가 구문은 사전을 통한 각 반복에 city의 값이 현재 요소의 key를 나타내며, 온도가 현재 요소의 value를 나타낸다는 것을 의미한다.

 

사전에 반복 사용의 또 다른 예는 다음과 같이 검색 코드이다. 이 검색은 지역 코드가 "VA"인 모든 지역의 온도를 출력할 것이다. 이 예시에서의 사전은 두 도시가 "VA"를 포함하고 있으며, 코드는 각 도시에 대한 행을 출력한다는 것에 주목하라



(dictionary-iteration-search-spyder)

 

in 키워드는 이 예에서 두 번 사용된다. 문자열에 대한 “in” 연산자는 왼쪽 열이 오른쪽 열에서 어딘가에 나타난다면 True를 반환하고 그렇지 않으면 False를 반환한다. 예를 들어, “VA” in “Richmond, VA”는 참이고“VA” in New York, NY”는 거짓이다.

 

복잡한 사전

key-value 쌍의 value 부분은 하나 이상의 숫자인 경우가 종종 있다. 아래의 표를 보아라. 각 도시에 대한 9일동안의 일기예보이다. 이 경우, 각 행의 value 은 번호의 목록이다.

표 5-6. 조건

도시 예측

Blacksburg, VA

60, 71, 65, 66, 78, 75, 66, 55, 53

New York, NY

54, 50, 60, 63, 65, 61, 60, 59, 55

San Jose, CA

88, 89, 92, 93, 90, 88, 93, 87, 85

Miami, FL

75, 80, 80, 81, 82, 79, 78, 50, 60

 

파이썬은 이렇게 복잡해진 데이터도 간단히 표시할 수 있다. 다음으로 나오는 코딩은 위 표에 대한 사전을 나타낸 것이다.



(dictionary-complex-example-spyder)

 

이 예에서 forecast 용어는 city에 대한 온도 예측 목록을 나타낸다. forecast[2]라는 표현은 목록의 세 번째 요소를 선택하는 것이다.

 

5.3.5 매핑한 복잡한 데이터 구조

실제 데이터는 프로젝트에서 사용하는 데이터 스트림처럼, 종종 사전 및 목록의 여러 계층을 포함하여 매우 복잡할 수 있다. 이러한 많은 자료들 속에서 데이터가 어떻게 정리되어 있고, 어떻게 접근해야하는 것에 관하여 헤매기가 쉽다. 그렇기 때문에 계산 또는 시각화에 사용될 데이터들은 종종 먼저 더 간단한 데이터 세트가 되기 위해 필터링을 거치게 된다.

 

복잡한 데이터 구조의 맵은 Spyder에서 Variable explorer 윈도우를 사용하여 제조할 수 있다. 맵은 데이터 스트림의 구조를 간략하게 설명하고 관심 데이터의 부분에 액세스하는 방법에 대한 지침을 제공 할 수있는 데이터의 그림 표현이다. 아래 그림에는 Spyder 윈도우의 일부가 나타나있다. 또한 다양한 유형의 속성 편집기가 창에 정의되어 있다. 실행 버튼을 누르면 Variable explorer에서 아래 그림과 같은 표시가 나타난다. 코드에 사용 된 각 속성은 Variable 탐색기에 항목이 있다.

5-19

그림 5-19. Spyder에서 Variable Exlplorer(변수 탐색기)

 

Variable 탐색기 창에 표시된 각 속성은 네 개의 열이 있다. Name 열은 속성의 이름을 제공한다. Type 열은 각 속성들이 어떤 종류의 값을 가지고 있는지 보여준다. Type 열에 사용되는 이름들은 다음 표에 요약되어있다. 속성 namestr(문자열)이고, whole_numberint, numberfloat인 것에 주목하라.



표 5-7. 매핑 복잡한 데이터 구조

Type 필드 의미

dict

키워드에 의한 사전 접근

list

위치에 의한 리스트 구조

str

문자열

float

소수점 수

int

(소수점 제외) 정수

 

Variable 탐색기에서 Size열 중 단순 유형은 단일 값이기 때문에(숫자와 문자열)에 크기가 1이다. 크기는 문자열의 문자 수 또는 숫자의 자릿수가 아니다. 이러한 종류의 값은 모두 각각 하나의 단위로 간주된다. name, number, andwhole_number 크기가 모두 1인 것에 주목하라. 리스트의 크기는 리스트의 요소 수다. 리스트 number_list가 5개의 값을 갖고 있기에 크기가 5인 것에 주목하라. 사전의 크기는 사전에서 key-value 쌍의 개수다. key-value쌍을 3쌍 갖고 있기 때문에 weather의 크기가 3인 것에 주목하라.

 

사전 및 Variable 탐색기에서 표시 목록은 Variable 탐색기에서 해당 항목을 더블 클릭하면 상세내용을 표시하도록 확장 할 수 있다. 예를 들어, 아래 그림은 number list를 더블 클릭하면 결과를 볼 수 있다. 별도의 창에서는 리스트의 각 요소의 세부 사항이 표시된다. 이 예에서, 리스트의 모든 요소가 int이고 크기는 1이다. 목록 요소의 값이 파이썬 코드에서 정의 된 것과 정확히 동일하다는 것을 주목하라. 표시되는 목록을 보는 일을 전부 끝마쳤을 때 별도의 창은 OK 버튼버튼을 누르면 끌 수 있다.

5-20

그림 5-20. Spyder의 변수 Explorer를 사용하여 목록을 확장 

 

마찬가지로, 사전의 더 깊은 상세내용을 표시하기 위해 동일한 방식으로 확장시킬 수 있다. 다음 그림은 Variable 탐색기에 표시된 weather 사전을 더블 클릭한 결과를 보여준다. 사전의 내용을 표시해줄 새 창이 뜬다. 윈도우의 각 항목은 key-value쌍을 보여준다. 예를 들어, 첫 번째 행은 키(key) ‘humidity’ 와 int 타입의 값(value)를 갖는다. 이 값은 20이다. 새 창에서 보이는 key-value쌍이 파이썬 코드에서 정의한 것과 같다는 것에 주목하라. 이 창은 OK 버튼을 클릭하여 닫을 수 있다.

5-21

그림 5-21. 스파이더의 Variable 탐색기를 사용하여 사전 확장

 

지금까지의 예시들은 Spyder의 Variable 탐색기가 어떻게 간단한 유형 (숫자, 문자열) 및 간단한 데이터 구조 (개별 목록 및 사전)들을 표시하는 건지에 대한 방법을 설명했다. 그러나 실제로 가장 중요한 관심 데이터는 우리가 지금까지 본 것보다 훨씬 복잡하며 실제 세상을 반영해 다층적인 구성을 갖는다. 다음은 우리가 Spyder를 이용하여 “맵”(데이터의 조직에 대한 시각적 가이드)을 개발하는 것에 대한 내용이다.

 

복잡한 데이터 구조를 상호대화형으로 매핑하는 것에 대한 일환으로 우리는 US Geological Survey에서 얻은 지진 데이터에 대한 데이터 스트림을 사용할 것이다. 이 예시에서 우리는 지난주에 있던 모든 지진 데이터 스트림을 얻는 것으로부터 시작한다. 다음 그림과 같이 이 데이터 스트림은 get_report함수에 의해 반환된다. 데이터 스트림이 속성 quakes에 할당 된 것에 주목하라. 이 속성은 Variable(변수) 탐색기 영역에 표시된다. 아래 파일은 earthquakes.py 모듈이다.

 

 

5-22

그림 5-22. Earthquake 데이터 탐색 (1 단계)

 

Variable(변수) 탐색기에서 보다시피 quakes 속성은 key-value 3쌍을 가지고 사전인 것을 볼 수 있다. 사전에 대해 상세하게 발견하기 위해 먼저처럼 Variable(변수) 탐색기에서 속성 항목을 더블 클릭할 수 있다. 그 결과, 제목이 "quakes”인 창이 다음 그림과 같이 나타난다. 이 창은 quakes 사전의 시각적 묘사를 제공한다. 사전이 세 개의 key-value 3쌍을 가지고 있는 것을 볼 수 있다. 키(key)는 각각 ‘area’, ‘earthquakes’, ‘title’이다. “area” 키와 관련된 값은 사전이다. ‘earthquakes’ 키는 크기가 2412 요소 목록이다. ‘title’키는 보이는 것과 같이 간단한 문자열이다.

5-23

그림 5-23. Earthquake 데이터 탐색 (2 단계)

 

이제 데이터 구조의 맵을 구축할 수 있다. 지도를 그리는 방법 중 다음 그림과 같은 방법이 있다.

 

5-24

그림 5-24. Earthquake 데이터의 초기지도

 

이 그림은 지금까지 earthquake 데이터의 구조에 대한 발견 한 내용을 시각적으로 표시 한 것이다. quakes 데이터 구조는 3개의 키를 가진 사전이며 ‘title’과 관련된 값은 “USGS All Earthquakes, Past Week’ 값인 단순 문자열이다. 빨간색 글은 각 단계에서 데이터 구조에서 주어진 부분을 찾을 때 아떤 키가 사용되었는지 표시하기 위한 것이다. 이 예시의 상단부터 빨간색 글을 따라 읽어보면 report[‘title’]이 지진 데이터의 제목 문자열을 찾을 수 있게 해준다.

 

키 'earthquakes'와 관련된 목록의 값을 검사하여 quakes 데이터를 더 깊이 탐색 할 수 있다. 이것은 Spyder에 의해 표시되는 "earthquakes"창에서 'quakes'항목을 더블 클릭하여 수행 할 수 있다. 그러면 제목에 "earthquakes”와 함께 새로운 다른 창이 목록을 보여줄 것이다. 다음 그림을 보라.

 

5-25

그림5-25. Earthquake 데이터 탐색 (3 단계)"

 

새 창에서(제목이 "earthquakes"인 것) 키 'earthquakes'와 관련된 목록의 각 요소 자체가 사전이라는 것을 볼 수 있다. 크기 필드는 각각의 사전이 15쌍의 key-value가 있다는 것을 가리킨다. 이 사전의 구조를 탐색하려면 "earthquakes"창에 표시된 목록의 항목을 더블 클릭해라. 그 결과, 다른 창 목록에서 선택된 아이템에 대한 key-value 15쌍이 표시된다. 이 예시는 다음 그림과 같다.

 

5-26

그림5-26. Earthquake 데이터 탐색 (4 단계)

 

새로 표시된 창은 키 - 값 15 쌍을 보여준다. ‘magnitude’ 키는 Richter측정법에 따라 지진의 크기를 단순한 숫자(float 형)로 표현한 키이다. ‘location’값과 관련된 키는 지구상에서 지진이 일어난 장소를 가리킨다.

 

이제 지진 데이터 구조 맵에 위의 단계에서 얻은 정보들을 추가 할 수 있다. 새로운 맵은 다음 그림과 같다. 단순화를 위해 가장 최근의 사전에 있는 모든 키가 표시되어 있지 것을 알아 달라. 완전한 맵이였다면 키를 모두 포함했을 것이다. 또한 목록 중에서 ‘earthquakes’키 모두가 동일한 구조를 가졌기에, 한 개 요소 이상을 조사할 필요가 없다는 것에 주목하라.

 

5-27

그림5-27. Earthquake 데이터의 맵을 확장

 

다시 한번 quakes 의 데이터 구조 맵을 사용함으로써 밑에 있는 두 개의 규칙에 따라 접근할 수 있는 데이터들의 조작하는 방법을 알 수 있다는 것에 주목하라:

 

  • 규칙 1 : 데이터가 사전인 경우, 키를 이용하여 값에 접근하라
  • 규칙 2 : 데이터가 목록인 경우, 각각의 요소 하나씩 접근하기 위해 반복을 사용

 

예를 들어, 우리가 단순히 모든 지진크기의 출력을 원한다면 이 코드를 쓰면 된다.:

list_of_quakes = quakes['earthquakes'] # 룰 1

for quake in list_of_quakes: # 룰 2

      print(quake['magnitude']) # 룰 1

 

우리가 이 코드에 도달하게 되는 이유는 우리 데이터 구조 맵의 ‘꼭대기’는 사전이기 때문이다. 첫 번째 규칙에 의하면 값에 접근하려면 키(key)를 이용해야 한다고 한다. 이 경우에는‘earthquakes’키가 모든 지진 보고서의 목록을 가져오는데 사용된다. 이제 목록을 가지고 있기 때문에, 두 번째 규칙에 의하면 목록의 각 요소에 접근하기 위해 반복을 사용해야 한다. 이제 목록의 각 요소는 또다시 사전이다. 이번에 ‘magnitude’키를 다시 규칙 1에 의거하여 사용하면 우리가 원하는 값에 접근하여 출력한다.

 

우리는 ‘location’ 항목을 검사하여 계속 데이터 구조를 계속 탐색 할 수 있다. 새 창 ‘location entry’ 을 더블 클릭하면 이 사전의 세 개의 키 - 값 쌍을 보여준다 : ‘depth’, ‘latitude’, ‘location’.이러한 키와 관련된 값들은 모두 소수점이 있는 숫자(float 형)다. ‘depth’키와 관련된 값은 2.13(킬로미터)이다. 우리는 마침내 이 데이터 구조의 ‘바닥’에 도달한 것이다.

 

5-28

그림5-28. Earthquake 데이터의 맵을 확장

 

우리는 이 맵을 또다시 이용하여 데이터 구조의 다른 부분을 조작하는 것에 도움을 받을 수 있다. 위의 두 규칙에 따르면, 모든 지진의 깊이(depth)를 출력하기 위한 코드는 다음과 같다:

list_of_quakes = quakes['earthquakes'] # 룰 1

for quake in list_of_quakes: # 룰 2

     print(quake['location']['depth']) # 룰 1

 

데이터 구조의 다른 부분들도 동일한 기법을 이용하여 탐색할 수 있다.

 

5.3.6 목록과 반복

목록과 반복은 종종 빅 데이터(BigData) 스트림 처리하거나 저장하기 위해 사용되기 때문에 이 두 가지는 같이 살펴볼 것이다. 파이썬 목록은 요소의 정렬이다. 정렬된 목록이란 것은 첫 번째 요소, 두 번째 요소 등의 형식을 갖고 있다는 뜻이다. 또한 목록은 크기가 한정되어있기 때문에 마지막 요소와 길이를 갖는다. 목록의 정렬 순서는 파이썬이 아닌 응용 프로그램에 의해 결정된다. 그리고 응용 프로그램이 자신의 데이터를 합리적으로 정렬시킬 수 있는 방법은 여러 가지가 있다. 예를 들어, 특정 도시에 대한 온도의 일기예보 목록은 시간순서일 수도 있다 : 목록의 첫 번째 요소는 내일의 일기예보, 두 번째 요소는 모레에 대한 일기예보 등의 형식인 셈이다. 조직에 있는 사람들의 이름 목록은 알파벳순으로 정렬 할 수도 있다.

 

목록과 반복 사이의 격차를 이어주기

다음과 같은 코드를 가지고 있다고 가정 해보자.



(list-foreach-1-spyder)

 

각 라인을 출력하고 싶다면, 직접 한 번에 각 요소에 접근 할 수 있다.



(list-foreach-2-spyder)

 

하지만 이것은 공간을 많이 낭비하며 쓰기에 느리고. 코드를 작성할 때 정확하게 얼마나 많은 요소가 목록에 있는지 알지 못하면 작동하지 않는다. 이것이 반복이 존재하는 이유이다!



(list-foreach-3-spyder)

 

새로운 변수를 ‘일기예보’에 주목하라. for 루프(loop)는 변수를 생성한 후, 차례대로 목록의 각 값에 걸린다.

 

반복의 완성

목록과 목록의 모든 요소에 대한 반복의 기초 연산은 다음 코드에 보인다. 이 코드에서의 목록은 요소가 추가될 때 생성되거나 빈 목록인 채 생성된다. 목록 속의 각 동작 효과를 볼 수 있도록 각 단계마다 출력된다. 결국 반복은 각각 목록에 대한 요소를 접근하고 출력하는 데에 사용된다. 다음 코드를 실행하자.



(list-example1-spyder)

 

구문적으로 따져보면, 목록이란 대괄호(‘[’,‘]’)에 둘러싸인 0개 이상의 요소를 가리킨다. 목록 속 인접하는 요소들은 쉼표로 구분된다. 목록의 마지막 요소 이후에는 쉼표가 없으며, 요소는 두 개의 다른 수단에 의해 목록의 끝에 추가될 수 있다. 더하기 기호(+)가 그 두 가지방법 중 하나이다.

 

위의 그림과 같은 목록을 구축하는 또 다른 방법은 파이썬의 "매소드(method)"기능을 사용하는 것으로, 다음과 같은 코드에 의해 설명된다.



(list-example2-spyder)

 

이 코드에서 append와 extend가 각각 단일 요소 또는 요소들의 목록을 추가 확장하는 데에 이용한다. 이 두 작업을 파이썬에서 "매소드"라고 합니다. 각각의 경우 모두 새로운 요소가 목록의 끝에 추가된다. 목록에 적용될 연산과 목록의 이름을 구분 짓는 마침표(".")에 주목하라. 항목은 remove 매소드를 사용하여 목록에서 삭제할 수 있다. 이 예에서는, 항목 4가 첫 번째 리스트로부터 제거된다.

 

위의 코드를 편집 한 후 실행하여 다른 요소들을 추가 또는 제거해 보아라.

 

위의 두 예시에서 반복은 목록의 각 요소를 동작시키는 데 사용되었다. 요소는 순서대로 선택되었고, 따라서 첫 번째 반복 연산은 목록의 첫 번째 요소를 작업하는 데에, 두 번째 반복 연산 두 번째 요소에게 하는 형식으로 나아갔다. 각각의 반복연산에서 it는 현재 작업이 진행중인 목록의 요소를 나타낸다.

 

반복이 형태의 구문에 대해 주목해야 할 몇 가지 중요한 사항은 다음과 같다.

  • 예와 같이 키워드 for와 in이 반드시 나타나야한다.
  • for 문는 콜론( ":")으로 종료된다.
  • 반복 후에 실행될 구문들은 들여쓰기의 정도가 반복문 이전의 문들과 일치해야 한다
  • 반목 후 실행될 구문● 들은 들여쓰기의 정도가 반복문 이전의 문들과 일치해야 한다. (위의 예에서 print(“done”) 문 참조).

 

범위 반복

목록이 정렬되어 있기 때문에 각각의 요소 위치를 참조하여 반복을 목록 안 몇 개의 요소에게만 제한시킬 수 있다. 파이썬(및 다른 프로그래밍 언어들)에서는 목록의 첫 번째 요소는 위치가 0인 것으로 정해져 있으며, 목록의 두 번째 요소의 위치는 1인 형식으로 하고 있다. 다음 예에서는, 위치 0에 있는 요소는 85이며, 위치 1의 요소는 60, 그리고 위치 4의 요소는 77이다. 이 예에서의 목록은 한 도시의 일기예보 속 최고온도와 최저온도들을 포함하고 있다. 따라서 내일의 최고온도는 85이며, 내일의 최저온도는 60이다. 모레는 87과 62가 각각 최고, 최저온도인 것이다. 일기예보 목록은 4일간의 최고온도와 최저온도를 보여준다.



(list-example3-spyder)

 

위치를 통해 목록의 요소에 접근하는 구문법칙은 바로 목록 이름 뒤에 대괄호와 위치를 그 안에 적는 것이다. 예를 들어 , forecast[0]는 목록(기억 위치가 0에서 숫자가 시작한다.)에서 첫 번째 요소이고 forecast[6]는 7번째 위치에 목록 요소를 의미한다. 확실히 이해하기 위해 목록에 있는 다른 위치를 선택하도록 위의 코드를 편집하라.

 

파이썬은 목록 전체 또는 목록 내의 일부 요소만을 반복할 수 있도록 도와주는 다양한 기능들이 있다. range는 각 반복에 사용될 위치를 구체화한다. range 기능은 다음 예와 같은 위치의 패턴을 생성한다.



(range-examples-spyder)

 

범위의 다양한 형태는 이러한 의미를 갖는다 :

  • range(n)은 위치 0, 1,...,n-1을 나타낸다. 이 형태는 목록의 처음부터 n번째 위치까지 세트를 연속적으로 반복시키는 데 유용하다.
  • range(m, n)은 위치 m, m + 1, ..., n-1까지를 나타낸다. 이 형태는 위치m에서 시작하여 위치n-1까지 세트를 연속적으로 반복시키는 데 유용하다.
  • range(m,n,k)는 위치 *m, m+k, m+2k,..., n-1을 나타낸다. 이 형태는 위치m에서 시작하여 위치n-1까지 k 만큼의 간격마다 세트를 비연속적으로 반복시키는 데 유용하다.

 

범위의 기능에 대한 이해를 확인하기 위해 위의 코드를 갖고 실험해봐라.

 

range 기능은 다음 우리의 일기예보 목록의 예시에서 3번의 반복연산으로 쓰인 것처럼 쓰일 수 있다. 첫 번째 반복연산에서는, range(8)이 목록 전체 개수인 8개의 위치를 전부 나타낸다. 두 번째 예에서는, range(0,7,2)가 짝수에 해당하는 모든 위치를 나타낸다. 이들은 모두 최고온도들의 위치다. 세 번째 예에서, range(1,8,2)가 홀수에 해당하는 모든 위치를 나타낸다. 이들은 모두 최저온도들의 위치다.



(range-iteration1-spyder)

 

대부분의 경우 우리는 사전에 목록의 정확한 길이를 모른다. 파이썬은 목록의 길이를 반환 len(list) 기능을 제공한다. 위의 반복 예시들은 이 len함수를 사용하여 아래에서 보이는 것처럼 다시 작성할 수 있다.



(range-iteration-len-spyder)

 

앞의 예의 최고,최저온도 일기예보 목록에 일수를 추가하여 어떤 길이에서라도 코드가 실행되는지 확인해봐라.

 

또한 목록에 요소를 추가 또는 특정 위치의 요소를 제거하여 목록의 내용을 변경하는 것도 가능하다. 우리는 위의 append, extend, remove 매소드를 사용해봤다. 위치로 목록을 조작할 수 있는 다른 메소드들은 다음과 같다.

list.insert(i,x) inserts the item x at position i

           elements prior to position i are unchanged

           elements previously at position i or higher are now at one position greater

 

list.index(x) returns the index of the first element in the list whose value is x

 

자주 사용되는 연산에서는 편리한 연산들도 제공된다. Python documentation에 사용할 수 있는 매소드의 전체 목록이 있다.

 

반복과 검색

복의 중요한 용도 중 하나는 데이터 스트림을 검색하여 일부 기준에 맞는 항목을 찾는 것이다. 이상적으로는 반복연산이 다음과 같은 이유로 제어되어야한다:

 

  • 기준에 일치하는 항목이 발견되면 계속 찾고, 아니면 필요가 없다.
  • 조건에 일치하는 항목을 찾을 수 없을 때는 무엇을 해야하나.

 

예를 들어, 어떤 기준에 일치하는 온도를 찾기 위해 온도의 목록을 검색했다고 가정하자(예를 들면, 특정 온도 이하). 만약 기준을 만족하는 온도를 발견하면 우리는 더 찾을 필요가 없다. 허나, 현 데이터 스트림 내에 이러한 온도가 존재하지 않을 수도 있다.

 

파이썬은 여기에서와 같이 검색 반복을 구축하는 데 도움이 된다.



(search-iteration-spyder)

 

break 문은 자신이 포함된 반복문을 즉시 종료시킨다. else절은 반복이 일찍 종료하는 거 없이 끝에 도달하는 경우에만 사용된다. 어떠한 경우에도 양쪽 print 문 두 개가 동시에 실행되는 일은 없다.

위의 코드를 편집하여 표준 온도 값을 각각 다른 값으로 시도해보고 효과를 관찰해봐라.

 

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *

*