파이썬 문법: 쉽게 배워보자

1. 파이썬 문법

파이썬은 배우기 쉽고 강력한 프로그래밍 언어로 많은 사람들이 사용하고 있는데요. 이번 포스팅에서는 파이썬 문법에 대해 한 번 알아보도록 하겠습니다.

1.1 변수 할당


변수는 데이터 값을 저장하는 식별자입니다. 변수를 할당할 때 등호(=)를 사용합니다.
   cat = "bezzy"
   print(cat)
   # 출력: bezzy

1.2 변수 네이밍


파이썬에서 변수 이름은 스네이크 케이스를 사용하는 것이 관례입니다. 스네이크 케이스는 단어 사이에 언더스코어(_)를 넣는 방식입니다.

   my_cat_name = "bezzy"

1. 3 동적 타입 시스템


파이썬은 동적 타입 시스템을 가지고 있어 변수가 여러 가지 데이터 타입을 가질 수 있습니다. 변수의 타입은 런타임에 결정됩니다.

   my_variable = "Hello"
   my_variable = 123

1.4 기본 데이터 타입

  • 정수(int): 정수 값을 나타냅니다. 예: 42
  • 부동 소수점(float): 실수 값을 나타냅니다. 예: 3.14
  • 문자열(str): 문자나 텍스트를 나타냅니다. 예: "Hello, Python"
  • 불리언(bool): True 또는 False 값을 나타냅니다. 예: True

1.5 연산자

  • 산술 연산자: +, -, *, /, %
  • 비교 연산자: ==, !=, <, >, <=, >=
  • 논리 연산자: and, or, not

1.6 조건문


조건문을 사용하여 특정 조건에 따라 코드 블록을 실행할 수 있습니다.

   if condition:
       # 조건이 참일 때 실행되는 코드
   else:
       # 조건이 거짓일 때 실행되는 코드

1.7 반복문


반복문을 사용하여 코드 블록을 여러 번 실행할 수 있습니다.
   for item in iterable:
       # 반복 실행되는 코드

1.8 함수


함수는 코드를 재사용하고 모듈화하는 데 사용됩니다.

   def my_function(parameter1, parameter2):
       # 함수 내용
       return result

1.9 리스트


리스트는 여러 항목을 저장하는 데 사용되며, 항목은 순서대로 저장됩니다.

   my_list = [1, 2, 3, 4, 5]

1.10 딕셔너리


딕셔너리는 키-값 쌍을 저장하는 데 사용됩니다. my_dict = {"name": "Alice", "age": 30}

1.11 문자열 포맷팅


문자열 내에 변수 값을 삽입할 때, f-문자열 또는 .format() 메서드를 사용합니다. name = "Alice" age = 30 message = f"My name is {name} and I am {age} years old."

이러한 기본 문법을 이용하여 파이썬으로 다양한 프로그램을 작성할 수 있습니다. 더 복잡한 파이썬 문법 및 기능을 습득하기 위해서는 실제 프로젝트를 진행하고 문서를 참고하는 것이 도움이 됩니다.

2. 기본연산

다음에는 파이썬의 연산과 논리 연산, 그리고 포함 연산을 간단하게 정리해 보도록 하겠습니다.

2.1 기본 연산

파이썬은 다양한 기본 연산을 지원합니다:

  • +: 더하기 연산
  • -: 빼기 연산
  • /: 나누기 연산 (파이썬 2에서는 정수 나누기로 동작했으나 파이썬 3에서는 실수 나누기로 변경)
  • *: 곱하기 연산
  • //: 정수 나누기 연산 (소수점 이하는 버림)
  • %: 나머지 연산 (Modulo Operator)
  • **: 거듭제곱 연산

예제:

a = 10
a += 2
print(a)  # 출력: 12
a %= 5
print(a)  # 출력: 2

2.2 논리 연산

논리 연산은 참(True) 또는 거짓(False) 값을 평가하고, and, or, not 연산자를 사용하여 논리 연산을 수행합니다.

  • and: 모든 조건이 참일 때 참을 반환합니다.
  • or: 하나 이상의 조건이 참일 때 참을 반환합니다.
  • not: 주어진 조건의 반대를 반환합니다.

예제:

# and 연산
result1 = True and True  # 참 and 참 -> 참
result2 = True and False  # 참 and 거짓 -> 거짓

# or 연산
result3 = True or False  # 참 or 거짓 -> 참
result4 = False or False  # 거짓 or 거짓 -> 거짓

# not 연산
result5 = not True  # not 참 -> 거짓
result6 = not False  # not 거짓 -> 참

2.3 포함 연산 (Membership Operators)

포함 연산자는 값이 어떤 iterable한 객체에 포함되어 있는지 여부를 확인합니다.

  • in: 값이 iterable 객체 안에 있으면 참을 반환합니다.
  • not in: 값이 iterable 객체 안에 없으면 참을 반환합니다.

예제:

my_list = [1, 2, 3, 4, 5]
result1 = 3 in my_list  # my_list 안에 3이 있으므로 참
result2 = 6 not in my_list  # my_list 안에 6이 없으므로 참

이러한 연산들을 조합하여 복잡한 조건을 만들고, 프로그램의 흐름을 제어할 수 있습니다. 파이썬은 이러한 연산자를 활용하여 다양한 작업을 수행하는데 유용한 기능을 제공합니다.

물론, 파이썬의 다양한 연산자와 비트 연산자를 간단하게 정리하겠습니다.

2.4 비교 연산 (Comparison Operators)

비교 연산자는 두 개의 값을 비교하고 그 결과를 논리값인 True 또는 False로 반환합니다.

  • <: 작다 (Less than)
  • >: 크다 (Greater than)
  • <=: 작거나 같다 (Less than or equal to)
  • >=: 크거나 같다 (Greater than or equal to)
  • ==: 같다 (Equal)
  • !=: 다르다 (Not equal)

예제:

x = 5
y = 10

result1 = x < y  # True, x는 y보다 작다.
result2 = x == y  # False, x와 y는 같지 않다.

2.5 객체 비교연산 (Object Comparison Operators)

  • is: 두 객체가 동일한 객체를 가리키는지 확인합니다.
  • is not: 두 객체가 서로 다른 객체를 가리키는지 확인합니다.

예제:

a = [1, 2]
b = [1, 2]
c = a

result1 = a is b  # False, a와 b는 서로 다른 객체
result2 = a is c  # True, a와 c는 동일한 객체

비트 연산자는 정수 값을 이진수로 변환하고, 비트 단위 연산을 수행합니다.

2.6 비트 연산 (Bitwise Operators)

  • &: 비트 AND 연산 (각 비트를 비교하고 둘 다 1인 경우에만 1을 반환)
  • |: 비트 OR 연산 (각 비트를 비교하고 둘 중 하나라도 1인 경우 1을 반환)
  • ^: 비트 XOR 연산 (각 비트를 비교하고 서로 다른 경우 1을 반환)
  • ~: 비트 NOT 연산 (각 비트를 반전)
  • <<: 비트를 왼쪽으로 이동 (2의 거듭제곱을 곱하는 효과)
  • >>: 비트를 오른쪽으로 이동 (2의 거듭제곱을 나누는 효과)

예제:

x = 9  # 이진수로 1001
y = 10 # 이진수로 1010

result1 = x & y  # 비트 AND 연산, 결과: 1000 (8)
result2 = x | y  # 비트 OR 연산, 결과: 1011 (11)
result3 = x ^ y  # 비트 XOR 연산, 결과: 0011 (3)
result4 = ~x     # 비트 NOT 연산, 결과: 11110110 (-10)
result5 = x << 2 # 왼쪽으로 2 비트 이동, 결과: 0010 (2)
result6 = x >> 2 # 오른쪽으로 2 비트 이동, 결과: 0001 (1)

비트 연산은 이진수를 다룰 때 유용하며, 일부 하드웨어 레벨 연산에서 사용될 수 있습니다.

3. 조건문 (Conditional Statements)

조건문은 조건에 따라 프로그램의 실행 흐름을 제어하는 데 사용됩니다. 파이썬에서 조건문은 if, elif (else if), else 키워드를 사용하여 구성됩니다.

if 조건:
    # 조건이 참일 때 실행되는 코드
elif 다른_조건:
    # 다른 조건이 참일 때 실행되는 코드
else:
    # 모든 조건이 거짓일 때 실행되는 코드

조건문에서는 들여쓰기 (indentation)가 매우 중요합니다. 파이썬은 들여쓰기를 통해 코드 블록을 구분하므로 들여쓰기를 정확하게 해야 합니다.

인라인 조건문 (Inline Conditional)

한 줄로 간단한 조건문을 작성할 때 인라인 조건문을 사용할 수 있습니다.

값1 if 조건 else 값2

예제:

x = 5
result = "크다" if x > 10 else "작거나 같다"

4. 반복문

4.1 for 반복문

for 반복문은 주어진 iterable 객체의 모든 요소를 반복적으로 실행하는 데 사용됩니다.

for 변수 in iterable_객체:
    # 실행 코드

예제:

fruits = ['사과', '바나나', '딸기']
for fruit in fruits:
    print(fruit)

Iterables (반복 가능한 객체)

반복 가능한(iterable) 객체는 여러 개의 요소를 가지고 있고, 순차적으로 접근할 수 있는 객체를 말합니다. 예를 들어, 문자열, 리스트, 튜플, 딕셔너리, 집합 등은 모두 반복 가능한 객체입니다.

Iterators (반복자)

반복자(iterator)는 반복 가능한 객체로부터 값을 하나씩 가져오는 객체를 말합니다. 반복자는 iter() 함수로 생성하며, next() 메서드를 사용하여 값을 하나씩 가져올 수 있습니다.

my_list = [1, 2, 3]
my_iterator = iter(my_list)

print(next(my_iterator))  # 1
print(next(my_iterator))  # 2
print(next(my_iterator))  # 3

반복자는 StopIteration 예외가 발생할 때까지 요소를 반환하며, 모든 요소를 순회한 후에는 예외가 발생합니다.

이제 조건문과 반복문에 대한 간단한 정리를 마쳤습니다. 필요한 경우 더 자세한 내용을 추가로 설명해드릴 수 있습니다.

4.2 while 반복문

while 반복문은 주어진 조건이 참인 동안 반복적으로 코드를 실행하는 데 사용됩니다. 조건이 거짓이 될 때까지 코드가 반복 실행됩니다.

while 조건:
    # 조건이 참일 때 실행되는 코드

예제:

count = 0
while count < 5:
    print(count)
    count += 1

4.3 반복문 분기

  • break: break 문은 반복문을 즉시 종료하고 반복문에서 빠져나옵니다. 다음 코드 블록이 실행됩니다.

예제:

while True:
    user_input = input("종료하려면 'q'를 입력하세요: ")
    if user_input == 'q':
        break
    print("계속 실행 중...")
  • continue: continue 문은 현재 반복 회차를 스킵하고 다음 반복 회차로 넘어갑니다. 즉, 반복문의 처음으로 돌아가 다음 반복을 실행합니다.

예제:

for i in range(1, 6):
    if i == 3:
        continue
    print(i)

5. 함수

함수는 프로그램의 재사용 가능한 부분을 모듈화하고 코드를 구조화하는데 사용됩니다.

5.1 함수 문법

파이썬에서 함수는 다음과 같이 정의됩니다:

def 함수_이름(파라미터1, 파라미터2, ...):
    # 함수 본문
    return 반환값

예제:

def add(a, b):
    result = a + b
    return result

sum_result = add(3, 5)
print(sum_result)  # 8

함수는 자체의 네임스페이스를 가지며, 함수 내부에서 선언된 변수들은 함수 내에서만 유효합니다. 이를 통해 변수 이름의 충돌을 방지하고 함수의 독립성을 보장할 수 있습니다. 이제 while 반복문과 함수에 대한 간단한 정리를 마쳤습니다.

5.2 함수 인자 (Arguments)

함수의 인자는 함수가 실행될 때 외부에서 받아오는 입력을 의미합니다. 파이썬 함수에 입력을 제공하는 방법에는 여러 가지가 있습니다.

5.2.1 위치 인자 (Positional Arguments)

위치 인자는 함수에 인자를 제공하는 가장 간단한 방법입니다. 함수의 정의 부분에 입력 파라미터를 콤마로 구분하여 제공하면 함수를 실행하는 부분에서 순서에 맞게 해당 파라미터에 입력값이 들어가게 됩니다.

def my_function(param1, param2, param3):
    # 함수 내용

인자에 디폴트 값을 줄 수도 있지만 이 때에는 디폴트 인자가 다른 인자보다 선행할 수 없습니다. 즉, 디폴트 값을 가진 인자 여러 개가 디폴트 값을 가지지 않은 위치 인자 중간에 끼어있다면, 함수에 전달되는 인자들이 디폴트 값을 재설정하기 위한 것인지 원래 위치 인자에 넣기 위한 것인지 알 수 없기 때문입니다.

주의! 가변 디폴트 변수

함수 인자의 디폴트 값은 함수가 정의될 때(즉, def 키워드로 시작하는 함수 정의문이 실행될 때) 한 번만 선언됩니다. 그래서 함수 인자에 디폴트 값으로 가변 객체(예를들어, 빈 리스트)와 같은 것을 주고 해당 값에 대한 작업을 수행하면 함수가 실행될 때마다 파라미터가 초기화되지 않고 변화가 누적됩니다. 이것을 간과하면 프로그램에서 예기치 않은 오류가 발생할 수 있으므로 주의가 필요합니다.

가변 객체를 사용하는 경우, 디폴트 값을 None으로 주고, 함수 내부에서 디폴트 값을 초기화하는 것이 좋습니다.

def my_function(arg=None):
    if arg is None:
        arg = []
    # 함수 내용

파이썬의 함수로는 변수가 어떻게 전달될까?

파이썬에서 함수로 변수가 전달되는 방식은 “할당에 의한 전달(passed by assignment)”입니다. 파이썬에서 모든 값은 객체(object)이고 모든 변수는 해당 객체를 가리키는 것입니다.

예를 들어, 3이라는 불변 객체를 a라는 변수가 가리키고 있는 상황에서 a += 1과 같은 코드를 실행한다고 해봅시다. 이 코드를 실행하면 a 변수가 4라는 다른 새로운 객체를 가리키게 됩니다. 즉, a 변수는 새로운 객체를 가리키게 되며 기존 객체 3은 사라집니다.

함수에 이러한 불변 객체를 가리키는 변수가 인자로 전달될 때도 마찬가지입니다. 함수 내부에서 해당 변수에 새로운 값을 할당하더라도 원래 변수가 가리키는 객체에는 영향을 주지 않습니다. 이는 가변 객체가 전달될 때는 조금 다르게 작동합니다.

가변 객체의 경우

함수에 가변 객체를 가리키는 변수를 인자로 전달하면, 함수 내부에서도 해당 객체를 참조합니다. 따라서 함수 내부에서 가변 객체의 내용을 변경하면 함수 외부에서도 같은 객체를 참조하는 다른 변수에 영향을 미칩니다.

이해를 돕기 위한 예시:

a = [1, 2, 3, 4]

def modify_list(lst):
    lst[2] = 100

modify_list(a)
print(a)  # 출력: [1, 2, 100, 4]

위의 예시에서 modify_list 함수는 가변 객체인 리스트 a를 인자로 받아서 해당 리스트의 내용을 변경하고 있습니다. 함수를 호출한 후에는 a 변수가 가리키는 리스트의 내용이 변경되어 있습니다. 이는 함수 내부와 외부에서 같은 객체를 참조하고 있기 때문입니다.

파이썬의 함수 인자 전달 방식은 “passed by assignment”로 이해하면 됩니다. 이를 이해하면 함수 호출 시 객체에 대한 참조가 어떻게 동작하는지 이해하기 쉽습니다.

5.2.2 가변 길이 인자 (Variable-length arguments)

가변 길이 인자는 함수에 미리 정해진 개수의 인자가 아니라 다양한 개수의 인자를 전달할 수 있게 해줍니다. 이를 위해 파이썬에서는 별표(*)를 사용하여 컨테이너 타입의 데이터를 풀어내는(unpack)데 활용할 수 있습니다.

Container Unpacking

컨테이너 타입(튜플, 리스트, 세트 등)의 데이터를 별표(*)로 언패킹(unpack)할 수 있습니다.

t = ('I', 'AM', 'Tuple')
print(*t)
# 출력: I AM Tuple

함수에서 가변 길이 인자를 사용하려면 함수 정의 부분에서 *args를 이용합니다.

def use_variable_args(*args):
    print(args)

use_variable_args(*t)
# 출력: ('I', 'AM', 'Tuple')

주의: 가변 길이 인자는 위치 인자와 함께 사용될 때 가장 마지막에 나와야 합니다. 그렇지 않으면 문법 에러가 발생합니다.

5.2.3 가변 키워드 인자 (Variable-length keyword arguments)

키워드 인자 또한 가변 길이로 전달할 수 있습니다. 이 경우에는 파이썬의 사전(dictionary)를 언패킹해서 함수에 전달하면 됩니다.

d = {'1': 'I', '2': 'AM', '3': 'DICT'}

def use_kwargs(**kwargs):
    for k, v in kwargs.items():
        print(k, v)

use_kwargs(**d)
# 출력:
# 1 I
# 2 AM
# 3 DICT

가변 키워드 인자의 경우에도 가변 길이 인자와 마찬가지로 함수 정의에서 **kwargs를 사용합니다.

주의: 가변 키워드 인자 또한 가변 길이 인자 다음에 와야 합니다. 그렇지 않으면 문법 에러가 발생합니다.

가변 길이 인자와 가변 키워드 인자를 함께 사용할 수도 있습니다. 이 경우에는 가변 길이 인자가 먼저 나와야 합니다.

def my_function(a, b, *args, **kwargs):
    # 함수 내용

이렇게 하면 위치 인자 ab를 필수로 받고, 가변 길이 인자 args는 위치 인자 뒤에, 가변 키워드 인자 kwargs는 가변 길이 인자 뒤에 나오게 됩니다.

my_function(1, 2, 'foo', 'bar', x=100, y=200)

위 코드에서 12는 위치 인자로 전달되고, 'foo''bar'는 가변 길이 인자 args로 전달되며, x=100, y=200은 가변 키워드 인자 kwargs로 전달됩니다.