Introducing Python #2

python
programming
variable
stringstream
string
stringfunction

(김태규) #1

파이썬 언어를 배우기에 앞서 가장 먼저 알아두어야 할 것은 바로 데이터 타입이다. 파이썬에서 제공하는 데이터 타입으론 크게 보아, 숫자, 문자열, 변수가 있다.

파이썬에서는 모든 것이 객체로 구성되어 있다. 객체는 데이터와 함께 무엇을 처리할 수 있는지 결정하는 부울 혹은 정수와 같은 타입이다. 타입은 또한 포함된 데이터값을 변경할 수 있는 변수(mutable) 인지 혹은 변경할 수 없는 상수(immutable) 인지 판단 할 수 있다. 파이썬은 객체의 타입을 바꿀 수 없는 강타입(strong typing) 이다.

프로그래밍 언어에서는 컴퓨터 메모리에 있는 값을 참조하기 위한 변수를 선언하여 사용할 수 있다. 파이썬에서는 변수에 값을 할당하기 위해 =을 사용한다.

a = 7
print(a)
7

변수에 대해 좀 더 자세히 알아보자. 변수는 단지 이름일 뿐이다. 할당한다는 의미는 값을 복사하는 것이 아니다. 단지 데이터에 어울리는 이름을 붙이는 것이다. 이름을 포스트잇처럼 생각하자.

파이썬에서 변수 혹은 리터럴 값의 타입을 알고 싶다면 type을 사용하면된다.

>>> type(a)
<class ‘int’>
>>> type(11.1)
<class ‘float’>
>>> type(‘abc’)
<class ‘str’>

클래스(class)는 객체의 정의를 의미한다. 파이썬에서 'class’와 'type’은 그 의미가 거의 같다.
변수 이름에는 다음 문자만 사용할 수 있다.

  • 소문자(a ~ z)
  • 대문자(A ~ Z)
  • 숫자(0 ~ 9)
  • 언더스코어(_)

파이썬에는 임의의 예약어가 선언되어 있으며, 이들은 변수로 선언 할 수 없다. (아래 사이트에 기재된 예약어들을 차차 만나볼 수 있을 것이다)
https://pentangle.net/python/handbook/node52.html

숫자

파이썬은 정수 (5, 4334 등) 와 부동소수점수 (3.1416, 1.67e4 등) 를 지원하는 기능이 내장되어 있다.

+ 더하기
- 빼기
* 곱하기
/ 부동소수점 나누기
// 정수 나누기(소수점 이하 버림)
% 나머지
** 지수

지금부턴 상위 부호들을 활용한 계산예제 및 유의사항에 대해 알아보겠다.

숫자 0을 쓸 수 있다. 하지만, 다른 숫자 앞에 넣을 수는 없다.

숫자 앞에 기호가 없으면 양수를 의미한다. 숫자 앞에 + 기호를 붙여도 양수다.
음수를 표현하려면 숫자 앞에 - 기호를 붙인다.

숫자와 연산자 사이의 공백에 상관없이 계산을 수행한다. 취향에 따라 읽기 쉽게 공백을 만들어서 계산할 수 있다.

>>> 5+9 + 4
18

나눗셈의 경우,

/ 는 부동소수점을 포함한 결과가 출력된다.
>>> 9 / 5
1.8
// 는 부동소수점을 제외한 결과, 즉 정수가 출력된다.
>>> 9 // 5
1
0으로 나누면 예외가 발생한다.

연산처리에는 우선순위가 정해져있으며, 이를 모두 외울 필요는 없다. 먼저 수행하고자 하는 계산식에 괄호를 붙이면 쉽게 해결 할 수 있다.

>>> 2 + ( 3 * 4 )
14

정수앞에 진수를 붙이지 않으면 10진수로 간주한다. 파이썬에서는 10진수 외에도 세 가지 리터럴 정수를 표현할 수 있다.

2진수(binary) : 0b 혹은 0B
8진수(octal0 : 0o 혹은 0O
16진수(hex) : 0x 혹은 0X

파이썬에서는 데이터 타입을 변환하기 위해 함수를 사용한다. 정수 변환을 위해선 int() 함수를 사용하며, 유사한 방법으로 다른 형 변환도 가능하다.

>>> int(True)
1
>>> int(False)
0

int() 함수에서 숫자가 아닌 다른 뭔가를 변환하면 예외가 발생한다. 또한 부동소수점수, 혹은 숫자로 이루어진 문자열을 정수로 반환한다. 그러나 소수점 혹은 지수를 포함하는 문자열은 처리하지 않는다.

>>> int(‘99 bottles of beer on the wall’)
(예외 발생)
>>> int(‘98.6’)
( 예외 발생)

부동소수점수로의 형 변환 예로는,

>>> float(True)
1.0
>>> float(False)
0.0
>>> float(98)
98.0
>>> float(‘99’)
99.0
>>> float(‘98.6’)
98.6
>>> float(’-1.5’)
-1.5
>>> float(‘1.0e4’)
10000.0

문자열

일반적으로 프로그래밍을 잘하기 위해서는 수학을 잘 해야한다고 생각한다. 그러나 사실 대부분의 프로그래머는 숫자보다 문자열을 다루는데 더 씨름을 하곤한다. 파이썬3에서는 유니코드 표준에 대한 지원으로 전 세계에서 쓰이는 언어들의 많은 기호를 담을 수 있다. 파이썬3의 문자열 지원이 파이썬 2로부터 분리된 가장 큰 이유이다. 다른 언어와 달리 파이썬은 문자열이 불변(immutable)이니 참고하기 바란다.

가장 먼저 문자열 생성에 대해 몇 가지 예시를 통해 알아보자.

>>> ‘Snap’
‘Snap’
>>> “Crackle”
‘Crackle’

인용 부호와 이중 인용 부호 모두 사용하는 이유는, 인용 부호가 포함된 문자열을 만들기 위해서다.

>>> “'Nay, ’ said the naysayer.”
"'Nay, ’ said the naysayer."
>>> ‘The rare double quote in captivity: ".’
‘The rare double quote in captivity: ".’

여러 줄의 문자열을 생성하고 자 할 땐, 세개의 단일 인용 부호 혹은 이중 인용 부호를 사용한다.
(대화식 인터프리터에서 직접 구현해보기 바란다.)

문자열로 데이터 타입 변환을 위해선 str() 함수를 사용한다. (문자열이 아닌 객체를 print()로 호출할 때, 파이썬은 내부적으로 str() 함수를 사용한다.)

>>> str(98.6)
‘98.6’
>>> str(1.0e4)
‘10000.0’
>>> str(True)
‘True’

파이썬은 백슬래시() 기호를 사용하여 문자열에 특별한 의미를 줄 수 있다.

\n : 줄바꿈
\t : 일정간격 뛰어쓰기
\’ or \" : 단일 혹인 이중 인용 부호를 표현할 수 있다.
\\ : 백슬래시를 입력하고 싶은 경우, 2번 입력한다.

지금부턴 다양한 문자열 연산자에 대해 알아보겠다.

결합: +
>>> 'Release the kraken! ’ + ‘At once!’
‘Release the kraken! At once!’

복제하기: *
>>> start = 'Na ’ * 4 + ‘\n’
(대화식 인터프리터에서 어떻게 출력되는지 살펴보라)

문자 추출: []
>>> letters = ‘abcdefghijklmnopqrstuvwxyz’
>>> letters[0]
‘a’
>>> letters[1]
‘b’
>>> letters[-1]
‘z’
>>> letters[-2]
‘y’
>>> letters[25]
‘z’
*** 오프셋을 문자열의 길이 혹은 이상으로 지정하는 경우에는 예외를 얻게 된다. ***

문자열은 불변이기에 특정 인덱스에 문자를 삽입하거나 변경할 수 없다. 하지만 replace() 와 같은 함수를 통해 해결 할 수 있다.

>>> name = ‘Henny’
>>> name.replace(‘H’, ‘P’)
‘Penny’

슬라이스: [start:end:step]
> 슬라이스는 오프셋의 start와 end - 1 사이의 문자를 포함한다.

  • [ : ] 처음부터 끝까지 전체 시퀀스를 추출한다.
  • [start : ] start 오프셋부터 끝까지 시퀀스를 추출한다.
  • [ :end ] 처음부터 (end - 1) 오프셋까지 시퀀스를 추출한다.
  • [start : end] start 오프셋부터 (end - 1) 오프셋까지 시퀀스를 추출한다.
  • [start : end : step] step 만큼 문자를 건너뛰면서, start 오프셋부터 (end - 1) 오프셋까지 시퀀스를 추출한다.

문자열 길이: len()
> 문자열의 길이를 세는 문자열 내장 함수.
>>> len(letters)
26
>>> empty = “”
>>> len(empty)
0

문자열 나누기: split()
> 어떤 구분자를 기준으로 작은 문자열들의 리스트로 나누기 위한 문자열 내장 함수.
>>> todos = ‘get gloves, get mask, give cat vitamins’
>>> todos.split(’,’)
[‘get gloves’, ‘get mask’, ‘give cat vitamins’]

문자열로 결합하기: join()
> 문자열 리스트를 하나의 문자열로 결합하는 문자열 내장 함수.
>>> animal_list = [‘lion’, ‘cat’, ‘tiger’, ‘griff’]
>>> animal_string = ', '.join(animal_list)
>>> print(Here is the list of animals: ', animal_string)
Here is the list of animals: lion, cat, tiger, griff

이 밖에도 많은 문자열 함수들이 있다.

>>> poem = ‘’‘I come with no wrapping or pretty pink bows.
I am who I am, from my head to my toes.
I tend to get loud when speaking my mind.
Even a little crazy some of the time.’’’

Source: https://www.familyfriendpoems.com/poems/other/short/

> 이 시는 몇 글자로 되있을까?
>>> len(poem)
167
> 이 시는 I로 시작하는가?
>>> poem.startswith(‘I’)
True
> 이 시는 There’s a cat 으로 끝나는가?
>>> poem.endswith(‘There’s a cat’)
False
> 이 시에서 첫 번째로 the가 나오는 오프셋은?
>>> word = ‘the’
>>> poem.find(word)
158
> 마지막으로 the가 나오는 오프셋은?
>>> poem.rfind(word)
158
> the 가 몇 번 나오는가?
>>> poem.count(word)
1
> 이 시는 글자와 숫자로만 이루어져 있는가?
>>> poem.isalnum()
False

문자열의 대소문자와 배치에 관한 내장 함수들도 다양하다.

>>> setup = ‘a deck goes into a bar…’

> 양끝에서 . 시퀀스를 삭제한다.
>>> setup.strip(’.’)
‘a duck goes into a bar’
> 첫 번째 단어를 대문자로
>>> setup.capitalize()
‘A duck goes into a bar…’
> 모든 단어의 첫 글자를 대문자로
>>> setup.title()
‘A Duck Goes Into A Bar…’
> 글자를 모두 대문자로
>>> setup.upper()
‘A DUCK GOES INTO A BAR…’
> 글자를 모두 소문자로
>>> setup.lower()
‘a duck goes into a bar…’
> 대문자는 소문자로, 소문자는 대문자로
>>> setup.swapcase()
‘A DUCK GOES INTO A BAR…’
> 문자열을 지정한 공간에서 중앙에 배치하자
>>> setup.center(30)
’ a duck goes into a bar… '
> 왼쪽에 배치
>>> setup.ljust(30)
‘a duck goes into a bar… ‘
> 오른쪽에 배치
>>> setup.rjust(30)
’ a duck goes into a bar…’
> 특정 단어 대체하기
>>> setup.replace(‘duck’, ‘marmoset’)
‘a marmoset goes into a bar…’
> 100회까지 바꾼다.
>>> setup.replace('a ', 'a famous ', 100)
‘a famous duck goes into a famous bar…’

연습문제

Q1) 1일은 몇 초인가? secounds_per_hour 변수를 사용하라.
Q2) 계산한 결과를 seconds_per_day 변수에 저장하라.
Q3) 부동소수점(/) 나눗셈을 사용해서 seconds_per_day를 seconds_per_hour로 나누어라.
Q4) 정수(//) 나눗셈을 사용해서 seconds_per_day를 seconds_per_hour로 나누어라.