본문 바로가기

Python 입문

Python 문법 핵심만 — C# 개발자가 2시간만에 파악한 것들

C# 개발자로 일하다가 Python 문법을 처음 봤을 때 솔직히 "이거 너무 쉬운 거 아닌가?" 싶었어요.

근데 막상 쓰다 보면 C#이랑 미묘하게 달라서 자꾸 실수하는 부분들이 생기더라고요. 오늘은 C# 개발자 눈으로 봤을 때 "이건 알아야 해" 싶은 Python 문법만 추려봤어요.


1. 문자열 포맷팅 — f-string

C#에서 문자열 보간은 이렇게 하죠:

string name = "잠탱이";
int age = 30;
Console.WriteLine($"이름: {name}, 나이: {age}");

Python f-string도 거의 똑같아요:

name = "잠탱이"
age = 30
print(f"이름: {name}, 나이: {age}")

$"" 대신 f"" 예요. 거의 같아서 금방 익숙해져요.


2. None — C#의 null

C#의 null 이 Python에선 None 이에요:

// C#
string result = null;
if (result == null) { ... }
# Python
result = None
if result is None:  # == 대신 is 사용
    ...

Python에서 None 비교는 == 보다 is 를 쓰는 게 권장 스타일이에요.


3. 딕셔너리 — C#의 Dictionary

C#:

var dict = new Dictionary<string, int>();
dict["apple"] = 1;
dict["banana"] = 2;
Console.WriteLine(dict["apple"]);

Python:

dict = {"apple": 1, "banana": 2}
print(dict["apple"])  # 1

# 키 없을 때 기본값 반환
print(dict.get("orange", 0))  # 0

.get() 메서드가 유용해요. 키가 없을 때 예외 대신 기본값을 반환해줘요.


4. 튜플 — 변경 불가능한 리스트

C#엔 없는 개념이에요 (ValueTuple이랑 비슷):

# 튜플 — 한 번 만들면 변경 불가
point = (10, 20)
x, y = point  # 언패킹
print(x)  # 10
print(y)  # 20

AI 개발할 때 함수에서 여러 값 반환할 때 자주 써요:

def get_size(text: str) -> tuple[int, int]:
    return len(text), len(text.encode('utf-8'))

chars, bytes_size = get_size("안녕하세요")

5. enumerate — 인덱스 + 값 동시에

C#에서 인덱스랑 값 같이 쓰려면:

for (int i = 0; i < list.Count; i++) {
    Console.WriteLine($"{i}: {list[i]}");
}

Python은 enumerate 로 깔끔하게:

items = ["사과", "바나나", "딸기"]
for i, item in enumerate(items):
    print(f"{i}: {item}")
# 0: 사과
# 1: 바나나
# 2: 딸기

6. with 문 — C#의 using이랑 같아요

C#:

using (var file = File.OpenRead("data.txt")) {
    // 자동으로 닫힘
}

Python:

with open("data.txt", "r") as file:
    content = file.read()
    # 블록 끝나면 자동으로 닫힘

AI 개발할 때 파일 읽고 쓸 일이 많아서 꼭 알아야 해요.


7. args, *kwargs — 가변 인수

C#의 params 랑 비슷한데 더 유연해요:

# *args — 위치 인수 여러 개
def add(*args):
    return sum(args)

add(1, 2, 3)  # 6

# **kwargs — 키워드 인수 여러 개
def greet(**kwargs):
    print(f"이름: {kwargs['name']}, 나이: {kwargs['age']}")

greet(name="잠탱이", age=30)

LangChain이나 FastAPI 코드 보면 **kwargs 자주 나와요. 이게 뭔지 알아야 코드가 읽혀요.


8. 람다 — C# LINQ랑 비슷해요

C#:

var sorted = list.OrderBy(x => x.Length).ToList();

Python:

items = ["banana", "apple", "cherry"]
sorted_items = sorted(items, key=lambda x: len(x))
# ['apple', 'banana', 'cherry']

lambda x: x.length 대신 lambda x: len(x) 예요. 구조는 거의 같아요.


9. 타입 힌트 — C# 처럼 타입 명시하기

Python은 타입 선언이 없지만, 타입 힌트로 명시할 수 있어요:

def chat(message: str, history: list[str] = []) -> str:
    # message는 str, history는 list[str], 반환값은 str
    return "응답"

FastAPI는 타입 힌트를 적극 활용해요. C# 개발자라면 타입 힌트 쓰는 습관 들이는 게 좋아요.


정리

개념 C# Python
문자열 보간 $"이름: {name}" f"이름: {name}"
null null None
null 비교 == null is None
딕셔너리 Dictionary<K,V> {}
파일 처리 using with
가변 인수 params *args, **kwargs
람다 x => x.Length lambda x: len(x)

C# 배경이 있으면 Python 문법은 생각보다 금방 익혀요. 개념이 비슷한 게 많아서 "아 이거랑 같은 거네" 하는 순간이 많을 거예요.

다음 글은 드디어 Gemini API 발급부터 첫 응답까지예요!