獨斷論

Python 사용법 2: Numbers, Strings, Lists 본문

과학과 기술/Python

Python 사용법 2: Numbers, Strings, Lists

부르칸 2014. 7. 31. 12:27

1. Python에서 숫자 계산

이건 뭐 계산기로도 사용가능 ㅋㅋ

>>> 3 + 3
6
>>> 30 + 5*2
40
>>> (4 - 1) / (4 * 5)
0.15
>>> 6 / 4     # Return float type if the calculation is division.
1.5
>>>

Python 2에서는 (정수형) / (정수형) 계산은 정수형만 계산되어 나와서 6/4가 1로 되었지만 3부터는 1.5로 계산됨...

즉 나눗셈의 결과 출력은 항상 실수형임.

>>> 17 / 3
5.666666666666667
>>> 17 // 3
5
>>> 17 % 3
2

일반적인 나눗셈은 " / "로 하고 

나머지를 버리고 정수형만 원한다면 " // "를 하고 

나머지만 원한다면 " % "로 계산.

>>> 3**2

9

>>> 2**10

1024

제곱은 " ** " 즉 별표 두개로 계산.. 

matlab이나 다른 여타 프로그램에서는 제곱을 눈썹같이 생긴 ^로 계산하는 프로그램이 많아서 헷갈리지 않는게 좋다.

알다시피 2의 10제곱은 1024

>>> width = 100

>>> height = 2

>>> area = width * height

>>> area

200

>>> width * height

200

" = "는 변수에 값을 할당하는데 다른 FORTRAN이나 C와 같은 언어와 달리 변수를 선언하지 않는다는것이 중요함. 

그리고 계산 결과를 달리 출력하지 않으므로 그 값을 알기 위해서는 변수명을 쳐야 그 값을 알려줌. 

>>> _ / 100

2.0 

엥.. 이 밑줄" _ "은 뭘야 대체.

밑줄은 바로 앞줄에서 계산한 결과 (즉 width * height, 즉 200)을 저장하는 변수인데 꼭 읽기전용으로만 사용한다. 


2. Strings (문자열)

문자열은 따옴표('   ')나 쌍따옴표("     ")를 이용가능하다.

>>> 'My string'

'My string'

>>> "My string"

'My string'

저장하고자 하는 문자열에 따옴표나 쌍따옴표가 들어가 있다면 문제는 좀 달라진다.

>>> 'don't'

  File "<stdin>", line 1

    'don't'

         ^

SyntaxError: invalid syntax

>>> "don't"

"don't"

>>> 'don\'t'

"don't"

Apostrophe가 근본적으로 따옴표 한개이므로 첫번째 입력은 어디까지가 문자열 끝인지 알수가 없어서 에러로 처리된다. 

두번째 입력은 이런 모호함을 해결하기 위하여 문자열의 처음과 끝을 쌍따옴표로 이용하였고

세번째 입력은 apostrophe라는 것을 나타내기 위하여 역슬래쉬( )를 사용하였다.  


이제 문자열 중간에 쌍따옴표가 들어가는 경우에 대해서 알아보자. 

>>> 'He said "Yes"'

'He said "Yes"'

>>> "He said \"Yes\""

'He said "Yes"'

보통 He said "Yes"라고 직설화법을 쌍따옴표를 이용하여 적는다. 이제 이것을 문자열로 만들려면 따옴표나 쌍따옴표를 이용하여야 하는데 문장중간 직설화법이라는 것을 나타내는 쌍따옴표와 문자열을 나타내는 쌍따옴표가 헷갈리므로 python interpreter에게 적절한 방법으로 알려주어야만 한다. 

첫번째 입력은 문자열은 그냥 따옴표를 이용하여 문자열이라는 것을 나타내주었고

두번째 입력은 문자열은 쌍따옴표를 이용하고 직설화법 쌍따옴표는 역슬래쉬를 이용하였다. 


그럼 문자열 중간에 쌍따옴표와 따옴표가 다 같이 들어가는 경우는 어떻게 해야만 할까?

>>> "He say "Don't""

  File "<stdin>", line 1

    "He say "Don't""

               ^

SyntaxError: invalid syntax

>>> 'He say "Don't"'

  File "<stdin>", line 1

    'He say "Don't"'

                 ^

SyntaxError: invalid syntax

>>> 'He say "Don\'t"'

'He say "Don\'t"'

>>> "He say \"Don't\""

'He say "Don\'t"'

>>> print('He say "Don\'t"')

He say "Don't"

>>> print("He say \"Don't\"")

He say "Don't"

He say "Don't"라는 문자열을 만들고 싶다고 가정하면

  • 첫번째 입력은 에러가 났는데 문자열을 나타내기 위한 쌍따옴표와 직설화법 쌍따옴표가 헷갈리기 때문이다.
  • 두번째 입력 역시 에러가 났는데 문자열을 나타내기 위한 따옴표와 apostrophe가 헷갈리기 때문이다. 
  • 세번째 입력에서 문자열을 나타내기 위하여 따옴표를 이용하고 중간에 apostrophe는 역슬래쉬를 이용하여 헷갈리지 않게하였다. 에러는 나지 않았지만 그 결과가 역슬래쉬가 포함되어 있다. 엇 이상하네... ㅋㅋ
  • 네번째 입력에서 문자열을 나타내기 위하여 쌍따옴표를 이용하고 직설화법을 나타내기 위한 쌍따옴표는 헷갈림을 방지하기 위하여 역슬래쉬를 이용하였다. 엇 근데 입력하지 않았단 apostrophe에 역슬래쉬가 나타나다니!!! 이게 뭐람. 
  • 하지만 이 이상한 것들은 print() 명령을 이용하여 출력하였을때 제대로 나타남을 알수 있다. 

만약 문자열에 줄바꿈문자가 포함되어 있다면 print()를 사용하였을때 확연히 달라진다.

>>> s = 'First line.\nSecond line.'

>>> s

'First line.\nSecond line.'

>>> print(s)

First line. Second line.

문자열 가운데 \n이 포함되어 있다면 어떻게 해야할까?

>>> print('c:\work\node')
c:\work

ode

>>> print(r'c:\work\node')

c:\work\node

이때는 따옴표 앞에 r을 첨가하여 raw string이라는 것을 표시해준다.


문자열 병합(Concatenation)

문자열을 병합할때에는 '+'나 '*'를 이용하며

변수가 아닌 expression의 경우에 '+"를 표현할때에는 그냥 공백으로 해도 무방하다.

>>> 3*'car' + 'ism'
'carcarcarism'
>>> 'Py' 'thon' # 공백이 하나
'Python'
>>> 'Py''thon' # 공백이 없음
'Python'
>>> 'Py'   'thon' # 공백이 둘
'Python'
>>> prefix = 'Py'
>>> prefix + 'thon'
'Python'
>>> text = ('Put several strings whithin parenthesis '
... 'to have them joined together')
>>> text
'Put several strings whithin parenthesis to have them joined together'
>>> 


문자열 indexing, slicing,

문자열은 0번이 첫번째 문자이고 그다음 오른쪽문자가 1번이 된다.

-1은 맨마지막 문자이며 그다음 왼쪽문자가 -2번이 된다.

>>> s = 'Python'
>>> s[0]
'P'
>>> s[1]
'y'
>>> s[2]
't'
>>> s[-1]
'n'
>>> s[-2]
'o'
>>> s[-3]
'h'

문자열가운데 몇개만 가져오는 것을 slicing이라 하는데 다음과 같이 실행하면 된다.

>>> s

'Python'

>>> s[0:2]

'Py'

>>> s[2:6]

'thon'

>>> s[-6:-4]

'Py'

>>> s[-4:] 'thon'

>>>

C나 Fortran과 같은 프로그램밍 언어에 익숙한 사람들은 어라 뭔가 이상하다고 느낄수도 있다.

여기서 [ ]안에 있는 숫자는 배열의 위치가 아니라

  • 첫번째 숫자는 포함되어야할 indexing 위치이고
  • 두분째 숫자는 제거되어야할 indexing 위치를 나타낸다.


+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
  0   1   2   3   4   5   6
 -6  -5  -4  -3  -2  -1


위와 같이 문자열의 indexing 위치를 생각한다면

  • s[0:2]는 포함되어야할 시작문자가 s[0]이므로 P이고
    제거되어야할 시작문자가 s[2] t이므로 s[0:2]Py가 된다.
  • s[2:6]은 포함되어야할 시작문자가 t이고
    제거되어야할 시작문자가 s[6]인데 이는 범위 밖이므로 끝까지 포함하라는 의미가 되어 thon이 된다. 
  • s[-6:-4]는 포함되어야할 시작문자가 s[-6]P이고
    제거되어야할 시작문자가 s[-4]t이므로 s[-6:-4]Py가 된다. 
  • s[-4:]은 포함되어야할 시작문자가 s[-4]t이고 제거될 문자열의 시작위치는 정해지지 않았으므로 맨 마지막 문자열까지 결과를 포여준다.

문자열의 크기는 len() 함수를 이용하면 된다.

>>> len(s)

6


3. Lists

Lists는 대괄호'[ ]' 안에 쉼표' , '로 데이터를 나누어 입력된 데이터 형이다.

예를 들어 squares라는 list 변수를 만들려면 다음과 같이 하면 된다.

>>> squares = [4, 9, 16, 25, 36]

>>> squares

[4, 9, 16, 25, 36]

List도 String과 마찬가지로 indexing과 slicing이 가능하다.

>>> squares[0]

4

>>> squares[-1]

36

>>> squares[0:3]

[4, 9, 16]

>>> squares[-3:-1]

[16, 25]

List도 concatenation이 가능한 변수이다.

>>> squares + [7**2, 8**2, 9**2, 10**2]  
[4, 9, 16, 25, 36, 49, 64, 81, 100]

String과는 다르게 List에서 각 원소의 값을 바꾸는 것이 가능하다.

>>> cubes = [8, 27, 66, 125]    # 잘못된 값이 들어갔음

>>> cubes

[8, 27, 66, 125]

>>> cubes[2] = 4**3     # 4의 3제곱 값을 계산하여 입력

>>> cubes

[8, 27, 64, 125]

또한 기존의 list 변수에 값을 덫붙이는 것이 가능하다.

>>> cubes.append(6**3)

>>> cubes

[8, 27, 64, 125, 216]

>>> cubes.append(7**2)

>>> cubes

[8, 27, 64, 125, 216, 49]

Lists의 일부값을 바꾸는 것도 가능하다.

>>> squares = [1**2, 2**2, 3**2, 4**2, 5**2, 6**2, 7**2]

>>> squares

[1, 4, 9, 16, 25, 36, 49]

>>> squares[4:6] = [5**3, 6**3]    # 4번과 5번을 3제곱 값으로 바꾸었다.

>>> squares

[1, 4, 9, 16, 125, 216, 49]

>>> squares[4:6] = []     # 4번과 5번의 값을 없애버렸다.

>>> squares

[1, 4, 9, 16, 49]      # 그 원소 자체가 없어져 버렸다.

>>> squares[:]= []     # 모든 값을 지울수도 있다.

>>> squares

[]


Nested lists

리스트 안에 리스트가 포함된 것을 nested lists라고 말한다.

아래 스크립트에서 리스트 letter가 다시 리스트 x에 포함될 수 있음을 보여주고 있으며

여기서 x를 nested list라고 말한다.

>>> letter = ['a', 'b', 'c']

>>> letter

['a', 'b', 'c']

>>> number = [1, 2, 3]

>>> x = [letter, number]

>>> x

[['a', 'b', 'c'], [1, 2, 3]]

>>> x[0]

['a', 'b', 'c']

>>> x[1]

[1, 2, 3]

>>> x[0][1]

'b'

>>> x[0][0]

'a'

>>>

마찬가지로 리스트의 원소값을 참조할때는 대괄호안에 첨자를 사용하면 되는데

x[0]의 값이 ['a', 'b', 'c']이므로 x[0]의 첫번째 원소값인 x[0][0]'a'이고 x[0]의 두번째 원소값인 x[0][1]'b'가 된다.


Comments