본문 바로가기

진리는어디에/Python

[Python] 파이썬 기초부터 시작하기 - Coding Style

이번 포스트에서는 다른 프로그래밍 언어와는 사뭇 다른 파이썬만의 코딩 스타일에 대해 살펴 보겠다. 가벼운 마음으로 머리 식힐겸 한번 읽어 보면 되는 내용이다.

파이썬에는 ++연산자가 없다

n = 10
n = n + 1
n += 1

++n # 버그. 파이썬은 ++연산자가 없다

정수를 1씩 증가 할 때, C/C++, C#, Java에서는 ++ 연산자를 이용해 간단하게 증가 시킬 수 있지만 파이썬에는 ++연산자가 없기 때문에, 1씩 증가하는 코드를 작성하려면 위 예제의 2 또는 3라인 처럼 작성해야 한다.

++ 로 작성된 코드는 단순히 +연산자를 두번쓴것으로 인식하고 아무것도 하지 않는다. 에러도 발생 시키지 않는 무의미한 코드이므로 버그를 유발 할 수 있으니 파이썬에서는 ++연산자는 사용하지 말도록 한다.

&&, ||, ! 대신 and, or, not

C/C++, C#, Java에 대한 경험이 있다면 조건절에 &&, ||, ! 연산자들을 쓰는게 익숙할 것이다. 하지만 파이썬에서는 저런 연산자가 없다. 대신 and, or, not을 직접 적어 줘야 한다.

b = True && False	# error
b = True || False	# error
b = !True		# error

b = True and False	# ok
b = True or False	# ok
b = not True		# ok

세미콜론(;)은 붙여도 되고 안붙여도 된다

C/C++, C#, Java와 같은 경우는 구문의 끝에 항상 세미콜론(;)을 붙여야 하지만 파이썬은 꼭 그래야 할 필요는 없다.

print('hello world') # ;를 붙이지 않아도 된다
print('hi'); # ;를 붙여도 되지만 일부 에디터는 불필요하다고 경고를 띄우기도 한다
print('hello'); print('world') # 세미콜론을 사용하면 한줄에 두개 이상의 문장을 표현 할수 있다

세미콜론(;)을 이용해 한줄에 여러 문장을 사용할 수 있지만 관례상 그러지 않는것이 좋다.

하나의 문장을 여러줄로 표기

파이썬은 세미콜론(;)이 없기 때문에 하나의 문장의 끝을 나타낼 수 있는 방법이 개행 뿐이라, 하나의 문장을 여러 줄에 걸쳐 표기 할 수는 없다. 하지만 코드가 너무 길어져 어쩔수 없이 여러줄로 표시해야만 할때는 역슬래쉬(\)를 이용해 여러 줄에 표기하는 것이 가능하다.

n = 1 +   # error
    2
    
n = 1 + \ # ok
    2

[], (), {} 안에서는 여러줄 표기 가능

print('A' +
      'B' +
      'C'
)      

조건식(if문)에는 ()가 있어도 되고 없어도 가능, {} 대신 들여쓰기

C/C++, C#, Java와 같은 언어에서는 if 문의 조건절에 항상 괄호를 써주어야 하지만, 파이썬에서는 있어도 되고 없어도 된다.

n = 10
if 0 == n % 2 :
    print('even')
else :
    print('odd')

다른 프로그래밍 언어에서는 if문의 실행 블록를 중괄호({})를 이용해 표기 하기도 하지만, 파이썬은 한칸 이상의 들여쓰기를 사용한다.

파이썬은 인터프리트 언어이기 때문에 한줄씩 코드를 수행한다. 그래서 if문이나 while문 끝에 콜론(:)을 표기하며, 콜론 이후의 들여쓰기 된 문장은 if문이나 while문에 포함된 내용으로 인식하게 된다.

들여 쓰기는 스페이스를 사용하든 탭을 사용하든 결과적으로 한칸 이상의 공백이면 되지만 주의 할 사항은 같은 블록이라면 같은 칸수의 들여쓰기를 해야 한다.

n = 10
if 0 == n % 2 :
    print('even')
     print('five space indent')
else :
    print('odd')

만일 위 예제의 4라인 처럼 들여쓰기가 다른 경우 파이썬에서는 제대로된 실행 블록이라고 인식하지 못하고 에러를 발생 시킨다.

리터럴

프로그래밍에서 리터럴(literal)이란 소스 코드의 고정된 값을 의미한다. 종종 "하드코딩"이라고도 불리우며 아래 예제들 처럼 특정 값을 소스 코드에 직접 적어준다. 주로 변수 초기화에 사용 된다.

정수형 리터럴

n = 10		# 10진수
n = 0x10	# 16진수
n = 0o10	# 8진수
n = 0b10	# 2진수

파이썬은 특이하게도 2진수에 대한 리터럴을 지원한다.

실수형 리터럴

f = 1.2
f = 1.2E10
f = 2.1e-10

문자열 리터럴

s1 = 'hello'
s2 = "hello"

문자열 리터럴 표현은 싱글 따옴표로 감싸거나 쌍따옴표로 감싸는것 둘다 허용한다.

boolean 리터럴

b1 = True
b2 = False

파이썬에서 True, False를 나타내기 위해서는 첫글자가 대문자인 True, False를 사용한다.

None

c = None

None은 변수가 아무것도 가리키고 있지 않음을 의미한다. C/C++, C#, Java의 null과 동일한 개념이다.

pass 키워드

def foo() : # void foo() {}와 동일
    pass
    
class Car :
    pass

pass 키워드는 함수나 클래스를 만들었는데 안에 아무런 구현 내용이 없을 경우 기술한다. 일반적으로 많이 사용될 일은 없지만 테스트 코드나 개발 도중 임시로 코드를 실행 시켜 볼때 에러를 피하기 위해 사용 되기도 한다.

else가 반복문(for, while)에도 놓일수 있다

C/C++, C#, Java와 같은 다른 프로그래밍 언어에서는 볼 수 없는 특징 중에 하나다. 파이썬은 else를 if문에서만 사용하는 것이 아니라 반복문에서도 사용 가능하다.

cnt = 10
while cnt < 10 :
    print('cnt is less than 10')
else :
    print('cnt >= 10')

조건을 만족하는 경우는 while문을 수행하지만, 조건을 만족하지 않는 경우에는 딱 한번 else문을 수행하고 종료하라는 뜻이다.

그런데 이런 기능이 있긴하지만 될 수 있으면 사용하지 말라는 것이 권장 사항이다.

한줄에 2개의 변수를 만들 수 있다

n1, n2 = 10, 20

위와 같이 코드를 작성하면 n1에는 10, n2에는 20이 할당 된다. 이런 파이썬의 특성을 이용해 간단하게 swap 코드를 만들 수 있다.

n1, n2 = 10, 20
n1, n2 = n2, n1
print(n1, n2)

Walrus operator

def foo() :
    return 10

if (ret = foo()) == 10 :
    print('10')

C/C++, C#, Java와 같은 언어들은 아래의 예제 처럼 if문 안에서 함수를 호출하고 그 결과를 if문의 조건으로 사용하는 것이 가능하지만 파이썬에서는 if문에서 함수 호출을 허용하지 않기 때문에 아래와 같은 오류가 발생한다.

> python main.py
  File "D:\main.py", line 4
    if (ret = foo()) == 10 :
            ^
SyntaxError: invalid syntax

하지만 파이썬 3.8부터 Walrus(바다코끼리?) operator라고 := 오퍼레이터를 사용하면 if 문에서도 함수 호출이 가능하도록 변경 되었다.

def foo() :
    return 10

if (ret := foo()) == 10 :
    print('10')

in operator

문자열 또는 시퀀스에 질의하는 값이 있는지 없는지를 판단하는 오퍼레이터다.

s = "ABCD"
b = "AB" in s
print(b)	# True

l = [1, 2, 3, 4]
b = 1 in l
print(b)	# True

마치며

이상 다른 언어와는 사뭇 다른 파이썬만의 특징을 알아보았다. 특히 ++연산자의 경우는 별다른 에러도 출력하지 않기 때문에 호되게 고생한 경험이 있으니 다른것은 몰라도 이것만은 꼭 기억하도록 하자.

파이썬 언어를 배우며 가볍게 살펴 볼 수 있는 기본적인 것들은 이것으로 끝났다. 다음 강좌 [Python] 파이썬 기초부터 시작하기 - 변수 에서는 가볍게 파이썬의 변수 선언과 사용법을 시작하여 조금 깊숙히 메모리 레이아웃까지 살펴 보도록 하겠다.

부록 1. 같이 읽으면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!