파이썬(Python) 기초 - 기초 문법과 자료형

170814

시스템 해킹 스터디 도중 쉘코드(Exploit) 작성과 원리를 더 쉽게 이해할 수 있도록 파이썬 언어 기초부터 다시 공부해야겠다. 사실 예전부터 기초를 튼튼하게 다지기 위해 책도 샀다. 아무튼 화이팅!


파이썬이란?

파이썬(Python)은 1990년 암스테르담의 귀도 반 로섬(Guido Van Rossum)이 개발한 인터프리터 언어이다(인터프리터 언어는 한 줄씩 소스 코드를 해석해서 그때그때 실행해 결과를 바로 확인할 수 있는 언어다). 파이썬이라는 이름은 귀도가 좋아하는 코미디 쇼인 “몬티 파이썬의 날아다니는 서커스(Monty Python’s Flying Circus)”에서 따왔다고 한다.파이썬의 사전적인 의미는 고대 그리스 신화에 나온 큰 뱀을 뜻한다. 그래서 대부분의 파이썬 그림과 아이콘이 뱀 모양으로 그려져 있다.

인간다운 언어, 문법이 쉬워 빠르게 배울 수 있는 언어, 무료지만 강력한 언어, 간결한 언어, 개발 속도가 빠른 언어… 이 모든 특징을 가진 언어가 파이썬이다.

간결성은 어떻게 보면 파이썬의 특징이다. 다른 언어와 다르게 파이썬 프로그램은 줄을 맞추지 않으면 실행이 되지 않는다. 코드를 예쁘게 작성하려고 줄을 맞추는 것이 아니라 실행이 되게 하려면 반드시 줄을 맞추어야 한다.

사실, 보안을 공부하는 입장으로서 시스템 프로그래밍을 제대로 하려면 파이썬 하나로는 부족하다. 하지만 Exploit을 포함한 다양한 프로그램을 개발할 수 있다는 특징과 그 범용성은 충분히 메리트가 있다.


파이썬 기초 문법

사칙연산은 아래와 같이 하면 된다.

>>> 1 + 2
3
>>> 3 / 2.4
1.25
>>> 3 * 9
27

변수에 숫자를 대입하고 계산하거나 문자를 대입하고 출력하는 건 아래와 같다.

>>> a = 1
>>> b = 2
>>> a + b
3

>>> a = "Python"
>>> print(a)
Python

파이썬은 대소문자를 구분하므로 print를 PRINT로 쓰면 정의되지 않았다는 에러 메시지가 나온다.

변수에 복소수를 넣는 것도 가능하다.

조건문 if, 반복문 for와 while은 아래처럼 작성하면 된다.

>>> a = 3
>>> if a > 1:
...   print("a is greater than 1")
...
a is greater than 1

>>> for a in [1, 2, 3]:
...   print(a)
...
1
2
3

>>> i = 0
>>> while i < 3:
...   i = i + 1
...   print(i)
...
1
2
3

마지막으로, 함수는 다음과 같은 형태다.

>>> def sum(a, b):
...     return a + b
...
>>> print(sum(3, 4))
7

def 예약어는 파이썬에서 함수를 만들 때 사용한다.


자료형

파이썬에서 정수형, 실수형, 8진수와 16진수는 다음과 같이 표현한다.

a = 123
a = -12
a = 0
a = 1.2
a = 4.24e-10
a = 4.24E10
a = 0o177
a = 0x8ff

기타 연산자는 다음과 같다.

a = 3
b = 4
a ** b
81

7 % 3
1

7 // 4
1
# // 연산자는 나눗셈의 결과에서 무조건 소수점을 버리는 것이 아니라 나눗셈의 결과값보다 작은 정수 중, 가장 큰 정수를 리턴한다.

파이썬에서 문자열은 4가지 방법으로 만들 수 있으며, 사칙연산처럼 문자열도 곱하고 더할 수 있다.

"Hello World"
'Hello World'
"""Hello World"""
'''Hello World'''
'''
Hello World
'''
"""
Hello World
"""

사실, 프로그래밍할 때 사용할 수 있도록 미리 정의해 둔 “문자 조합”인 이스케이프 코드를 사용할 수 있다.

문자열 인덱싱과 슬라이싱, 포매팅 예제는 아래와 같다.

a = "Hello World"
a[4]
'o'

a = "Hello World"
a[0:5]
'Hello'
a[:5]
'Hello'
# 참고로, 문자열의 요소값은 바꿀 수 있는 값이 아니다.

number = 3
"I eat %d apples." % number
'I eat 3 apples.'

number = 10
day = "three"
"I eat %d apples %s times a day." % (number, day)
'I eat 10 apples 3 times a day.'

"Error is %d%%." % 98
'Error is 98%.'

포맷 코드와 숫자를 같이 사용하면 아래와 같이 쓸 수 있다.

"%10s" % "hi"
'        hi'

"%0.4f % 3.4212343"
'3.4212'

문자열 내장함수들은 다음과 같다.

a = "hobby"
a.count('b')
2
# 문자 개수 세기

a = "hobby"
a.find('b')
2
# 문자 위치 알려주기1, 찾는 문자나 문자열이 없으면 -1을 반환한다.

a = "hobby"
a.index('b')
2
# 문자 위치 알려주기2, 찾는 문자나 문자열이 없으면 오류가 발생한다.

a = ","
a.join('abcd')
'a,b,c,d'
# 문자열의 각각의 문자 사이에 변수 a의 값 삽입

a = "hi"
a.upper()
'HI'
# 소문자를 대문자로 바꾸기

a = "HI"
a.lower()
'hi'
# 대문자를 소문자로 바꾸기

a = " hi "
a.lstrip()
'hi '
a.rstrip()
' hi'
a.strip()
'hi'
# 왼쪽 공백 지우기, 오른쪽 공백 지우기, 양쪽 공백 지우기

a = "Hello World"
a.replace("Hello", "My")
'My World'
# 문자열 바꾸기

a = "Hello World"
a.split()
['Hello', 'World']
# split 괄호 안에 아무런 값을 안 넣으면 공백을 기준으로 문자열을 나눈다. 하지만 특정한 값이 있을 경우, 괄호 안의 값을 구분자로 해서 문자열을 나눈다.
a = "a:b:c:d"
a.split(':')
['a', 'b', 'c', 'd']

(다음에 계속!)