
2. Python 기본 문법
2. Python 기본 문법
2.1 데이터 타입
2.1.1 기본
type | desc |
---|---|
int | 정수형 |
float | 부동소수점 |
complex | 복소수 |
str | 문자열 |
bool | 불리언 |
None | None (값이 없음을 나타냄) |
bytes | 바이트 데이터 (불변) |
bytearray | 바이트 데이터(가변) |
list | 리스트(가변) |
tuple | 튜플(불변) |
set | 집합 |
frozenset | 불변 집합 |
dict | 딕셔너리 |
다른 type
의 쓰임은 대강 알고 있으리라 생각이 된다. 하지만 bytes
와 bytearray
는 생소하리라 생각이 든다. 예제를 보자.
# example of bytes vs bytearray
b = b"hello"
print(b[0]) # 104 (ASCII 값)
ba = bytearray(b"hello")
ba[0] = 72
print(ba) # bytearray(b'Hello')
2.1.2 type이란 무엇인가?
Python에서 type
은 객체의 메모리 구조, 연산 규칙, 그리고 동작 정의를 담당하는 개념이다. Python의 모든 값은 객체이며, 변수는 객체를 참조하는 방식으로 동작한다. 객체의 type
은 해당 객체가 어떤 종류인지와, 사용 가능한 연산 및 메서드를 정의한다.
클래스도 type
의 인스턴스
Python에서는 클래스조차도 객체이며, 모든 클래스는 type
의 인스턴스이다. 이는 Python이 클래스 정의와 동작을 동적으로 제어할 수 있는 이유이다.
class MyClass:
pass
# MyClass는 type의 인스턴스
print(type(MyClass)) # <class 'type'>
# MyClass의 인스턴스
obj = MyClass()
print(type(obj)) # <class '__main__.MyClass'>
__main__
이란?
C나 Java와 같은 언어들은 진입 지점으로 main 함수가 등장한다. 하지만 Python은 이러한 전통적인 main 함수 구조를 강제하지 않는다. Python은 인터프리터 언어로, 파일을 실행하면 코드가 위에서부터 순차적으로 실행된다. 즉, 파일의 진입 지점이 별도로 지정되지 않아도, 작성된 코드가 곧 실행 흐름이 된다. 이는 실행된 파일이 main이 되며, 해당 파일의 __name__
속성이 "__main__"
이 된다는 뜻이다.
그러나, 복잡한 프로그램에서는 진입 지점을 명확히 하고 모듈화를 지원하기 위해 if __name__ == "__main__":
블록을 사용하는 것이 일반적이다.이 방식은 특정 파일이 직접 실행될 때와 모듈로 임포트될 때를 구분할 수 있게 한다. 이를 코드의 재사용성과 유지보수성을 높이는 데 기여한다. 예를 들어:
def main():
print('main func')
if __name__ == "__main__":
main()
위 코드에서 main()
함수는 __name__
이 "__main__"
일 때만 호출된다. 파일이 다른 모듈에 의해 import
될 경우 main()
은 실행되지 않으며, 이는 예기치 않은 코드 실행을 방지하는 데 유용하다.
다른 모듈로 불러왔을 때의 예시도 작성을 해보자면,
${root}
| main_script.py
| my_module.py
# my_module.py
print("loading my_module")
print(f"my_module의 __name__: {__name__})
def module_function():
print("my_module의 함수가 호출되었습니다.")
if __name__ == "__main__":
print("test start")
module_function()
# main_script.py
import my_module
print(f"main_script의 __name__: {__name__})
def main():
print("main_script의 main 함수가 실행되었습니다.")
my_module.module_function()
if __name__ == "__main__":
main()
실행 결과
python main_script.py
loading my_module
my_module의 __name__: my_module
main_script의 __name__: __main__
main_script의 main 함수가 실행되었습니다.
my_module의 함수가 호출되었습니다.
my_module.py의 "test start" 문구와 함수 호출 출력문이 실행되지 않은 것을 확인할 수 있으며, __name__이 어떤지도 알 수 있다.
2.1.3 형 변환과 타입 확인
형 변환
x = "123"
y = int(x)
print(type(y)) # <class 'int'>
타입 확인
isinstance라는 함수가 있구나 정도만 알아두면 된다.
print(isinstance(42, int)) # True
print(isinstance("Python", str)) # True
2.2 변수와 연산자
2.2.1 변수
변수 선언
- Python에서는 변수 선언 시 데이터 타입을 명시하지 않아도 된다.
- 값이 할당되는 시점에 타입이 결정된다.
네임스페이스
- 변수는 특정
scope
의 네임스페이스에 저장된다.
가비지 컬렉션
- 참조가 끊긴 객체는 Python의 가비지 컬렉터에 의해 자동으로 메모리에서 제거된다.
2.2.2 연산자
산술 연산자
x, y = 10, 3
print(x + y) # 덧셈
print(x - y) # 뺄셈
print(x * y) # 곱셈
print(x / y) # 나눗셈 (float)
print(x // y) # 몫 (int)
print(x % y) # 나머지 (int)
print(x ** y) # 거듭 제곱
비교, 논리, 비트 연산자
- 비교:
<
,>
,<=
,>=
,==
,!=
- 논리:
and
,or
,not
- 비트:
&
,|
,^
,~
,<<
,>>
복합 연산자
x = 5
x += 3 # x = x + 3
x *= 2 # x = x * 2
...
2.3 제어문
2.3.1 조건문
x = 10
if x > 5:
print("x는 5보다 크다")
elif x == 5:
print("x는 5이다")
else:
print("x는 5보다 작다")
삼항 연산
# (true case) if condition else (false case)
a, b = 10, 20
max_value = a if a > b else b
print(max_value) # 20
2.3.2 반복문
# for 변수 in Iterable:
# code
for i in range(5):
print(i)
n = 5
while n > 0:
print(n)
n -= 1
python에서는 for
문과 while
문 뒤에 else
를 붙이면 정상 종료 시에 else
를 진입한다. 가독성 때문에 사용하지 않는다.
반복문 내부에는 break
와 continue
keyword를 사용할 수 있는데, 차이는 다음과 같다. break : 해당 iter를 종료하고 반복문 탈출. continue 해당 iter를 종료하고 다음 iter 시작.
for문 심화는 Iterable 게시물에서 확인.
2.4 함수
2.4.1 함수 정의
Python에서 함수를 정의하는 방식은 두 가지가 있다. 하나는 전통적인 함수 선언 방식으로 def
를 이용하는 것이다. 다른 하나는 lambda
를 이용하는 것이다.
def func1(arg1, arg2, ...):
# do something
return
func2 = lambda x: return x*2
지금 함수를 정의한 것에서 볼 수 있듯이 함수는 입력과 출력을 가질 수 있다.
2.4.2 함수 입출력
함수의 정의 시에 매개변수 위치에 변수를 넣으면 입력이 된다. 이 때 default값을 지정할 수 있다.
def func3(arg1, arg2: str=None) -> None:
# do something
return
위 코드를 보면 arg2
가 str
타입으로 annotation
되어있고, 만일 매개변수로 전달이 되지 않는다면 기본 값인 None
을 갖는다는 설명을 갖고있다. 함수에서 화살표 표현은 함수의 return
에 대한 annotation
으로 코드상 동작은 하지 않는 주석이다.
- 함수 정의, 인자 (
*args
,**kwargs
). - 기본값 인자와 키워드 전용 인자 (
*, arg
). - 함수 객체와
callable()
:__call__
메서드를 가진 객체의 동작.callable(object)
의 활용.
2.5 예외 처리
try
,except
,else
,finally
구조.- Built-in Exceptions (ValueError, KeyError, IndexError 등).
- 사용자 정의 예외와 예외 계층 설계.
List Comprehension
test