Zettelkasten/Literature(리터레처)/python - for 반복문.md

python - for 반복문

1. 기본 순회 비교

배열/리스트 순회

// JavaScript
const fruits = ['apple', 'banana', 'cherry'];
fruits.forEach(fruit => console.log(fruit));
// 또는
for (const fruit of fruits) {
    console.log(fruit);
}
# Python
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)

문자열 순회

// JavaScript
for (const char of "hello") {
    console.log(char);
}
# Python
for char in "hello":
    print(char)  # h, e, l, l, o

객체/딕셔너리 순회

// JavaScript
const dict = {a: 1, b: 2, c: 3};
 
// 키만
for (const key in dict) {
    console.log(key);
}
// 또는
Object.keys(dict).forEach(key => console.log(key));
 
// 값만
Object.values(dict).forEach(value => console.log(value));
 
// 키-값 쌍 (구조 분해 할당)
for (const [key, value] of Object.entries(dict)) {
    console.log(key, value);
}
# Python
dict = {'a': 1, 'b': 2, 'c': 3}
 
# 키만
for key in dict:
    print(key)
 
# 값만
for value in dict.values():
    print(value)
 
# 키-값 쌍 (언패킹)
for key, value in dict.items():
    print(key, value)

💡 핵심: dict.items()는 튜플 [('a', 1), ('b', 2)]를 반환하고, Python의 자동 언패킹(JS의 구조 분해 할당)으로 key, value로 분리됨


2. 인덱스 기반 반복

C 스타일 for문

// JavaScript
for (let i = 0; i < 5; i++) {
    console.log(i);  // 0~4
}
 
for (let i = 1; i <= 5; i++) {
    console.log(i);  // 1~5
}
 
for (let i = 0; i < 10; i += 2) {
    console.log(i);  // 0, 2, 4, 6, 8
}
 
for (let i = 10; i > 0; i--) {
    console.log(i);  // 10~1
}
# Python - range() 사용
for i in range(5):
    print(i)  # 0~4
 
for i in range(1, 6):
    print(i)  # 1~5
 
for i in range(0, 10, 2):
    print(i)  # 0, 2, 4, 6, 8
 
for i in range(10, 0, -1):
    print(i)  # 10~1

💡 차이점: Python은 range(start, end, step) 사용 (end는 포함 안 됨)


3. 인덱스 + 값 동시에

// JavaScript
const fruits = ['apple', 'banana', 'cherry'];
 
fruits.forEach((fruit, index) => {
    console.log(index, fruit);
});
 
// 또는
for (const [index, fruit] of fruits.entries()) {
    console.log(index, fruit);
}
# Python - enumerate() 사용
fruits = ['apple', 'banana', 'cherry']
 
for index, fruit in *enumerate*(fruits):
    print(index, fruit)
# 0 apple
# 1 banana
# 2 cherry
 
# 시작 인덱스 지정
for index, fruit in enumerate(fruits, start=1):
    print(index, fruit)
# 1 apple
# 2 banana
# 3 cherry

4. 여러 배열 동시 순회

// JavaScript
const names = ['Alice', 'Bob', 'Charlie'];
const ages = [25, 30, 35];
 
// 방법 1: 인덱스 사용
for (let i = 0; i < names.length; i++) {
    console.log(`${names[i]} is ${ages[i]} years old`);
}
 
// 방법 2: map + entries (비추천)
names.forEach((name, i) => {
    console.log(`${name} is ${ages[i]} years old`);
});
# Python - zip() 사용 (훨씬 간결!)
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
 
for name, age in zip(names, ages):
    print(f"{name} is {age} years old")

💡 Python의 zip()이 훨씬 직관적!


5. 배열 변환/필터링

map()과 filter()

// JavaScript
const numbers = [1, 2, 3, 4, 5];
 
// map - 변환
const squared = numbers.map(x => x ** 2);
// [1, 4, 9, 16, 25]
 
// filter - 필터링
const evens = numbers.filter(x => x % 2 === 0);
// [2, 4]
 
// map + 삼항 연산자
const result = numbers.map(x => x % 2 === 0 ? x : -x);
// [-1, 2, -3, 4, -5]
 
// 체이닝
const result2 = numbers
    .filter(x => x % 2 === 0)
    .map(x => x ** 2);
# Python - List Comprehension (더 간결!)
numbers = [1, 2, 3, 4, 5]
 
# 변환
squared = [x**2 for x in numbers]
# [1, 4, 9, 16, 25]
 
## 중요포인트
[
    x**2           # 1. 각 요소에 적용할 표현식
    for x          # 2. 반복 변수
    in numbers     # 3. 반복할 대상
]
 
 
# 필터링
evens = [x for x in numbers if x % 2 == 0]
# [2, 4]
 
# if-else (삼항 연산자 대체)
result = [x if x % 2 == 0 else -x for x in numbers]
# [-1, 2, -3, 4, -5]
 
# 필터 + 변환 (한 줄에!)
result2 = [x**2 for x in numbers if x % 2 == 0]

2D 배열 생성

// JavaScript
const matrix = Array(3).fill(0).map((_, i) => 
    Array(3).fill(0).map((_, j) => i + j)
);
// [[0,1,2], [1,2,3], [2,3,4]]
# Python - 중첩 List Comprehension (더 읽기 쉬움)
matrix = [[i+j for j in range(3)] for i in range(3)]
# [[0,1,2], [1,2,3], [2,3,4]]

💡 Python의 List Comprehension = JS의 map/filter보다 간결하고 빠름


6. break, continue, else

// JavaScript
// break
for (let i = 0; i < 10; i++) {
    if (i === 5) break;
    console.log(i);  // 0,1,2,3,4
}
 
// continue
for (let i = 0; i < 5; i++) {
    if (i === 2) continue;
    console.log(i);  // 0,1,3,4
}
 
// else 없음 (Python만의 기능)
# Python
# break
for i in range(10):
    if i == 5:
        break
    print(i)  # 0,1,2,3,4
 
# continue
for i in range(5):
    if i == 2:
        continue
    print(i)  # 0,1,3,4
 
# else - break 없이 정상 종료 시 실행 (JS에 없는 기능!)
for i in range(5):
    if i == 10:
        break
else:
    print("완료!")  # 출력됨

💡 Python의 for-else는 JS에 없는 독특한 기능


7. 중첩 for문

// JavaScript
for (let i = 0; i < 3; i++) {
    for (let j = 0; j < 3; j++) {
        console.log(i, j);
    }
}
 
// 구구단
for (let i = 2; i <= 9; i++) {
    for (let j = 1; j <= 9; j++) {
        console.log(`${i} x ${j} = ${i * j}`);
    }
}
# Python (문법만 다를 뿐 동일)
for i in range(3):
    for j in range(3):
        print(i, j)
 
# 구구단
for i in range(2, 10):
    for j in range(1, 10):
        print(f"{i} x {j} = {i*j}")

8. 역순 순회

// JavaScript
const fruits = ['apple', 'banana', 'cherry'];
 
// 방법 1: reverse() (원본 변경)
fruits.reverse().forEach(fruit => console.log(fruit));
 
// 방법 2: 슬라이싱 없음, spread + reverse
[...fruits].reverse().forEach(fruit => console.log(fruit));
 
// 방법 3: 인덱스 역순
for (let i = fruits.length - 1; i >= 0; i--) {
    console.log(fruits[i]);
}
# Python
fruits = ['apple', 'banana', 'cherry']
 
# 방법 1: reversed() (가장 pythonic)
for fruit in reversed(fruits):
    print(fruit)
 
# 방법 2: 슬라이싱 (간결!)
for fruit in fruits[::-1]:
    print(fruit)
 
# 방법 3: range 역순
for i in range(len(fruits)-1, -1, -1):
    print(fruits[i])

9. 유용한 패턴

2D 배열 순회

// JavaScript
const matrix = [[1,2,3], [4,5,6], [7,8,9]];
 
for (const row of matrix) {
    for (const item of row) {
        process.stdout.write(item + ' ');
    }
}
# Python
matrix = [[1,2,3], [4,5,6], [7,8,9]]
 
for row in matrix:
    for item in row:
        print(item, end=' ')

빈 반복문

// JavaScript
for (let i = 0; i < 5; i++) {
    // TODO: 나중에 구현
}
# Python - pass 키워드
for i in range(5):
    pass  # 나중에 구현

한 줄 반복문

// JavaScript
[0,1,2,3,4].forEach(i => console.log(i));
 
// reduce로 합계
const result = [0,2,4,6,8].reduce((sum, x) => sum + x**2, 0);
# Python
[print(i) for i in range(5)]
 
# sum으로 합계 (더 간결!)
result = sum([x**2 for x in range(10) if x % 2 == 0])

10. 문법 비교표

기능 JavaScript Python
C 스타일 반복 for(let i=0; i<5; i++) for i in range(5):
forEach arr.forEach(item => {}) for item in arr:
for...of for(const item of arr) for item in arr:
map arr.map(x => x*2) [x*2 for x in arr]
filter arr.filter(x => x>0) [x for x in arr if x>0]
인덱스+값 arr.entries() enumerate(arr)
여러 배열 없음 (직접 구현) zip(arr1, arr2)
객체 순회 Object.entries(obj) dict.items()
역순 arr.reverse() reversed(arr), arr[::-1]

11. 코딩테스트 필수 패턴

// JavaScript
const arr = [1, 2, 3, 4, 5];
 
// 1. 인덱스만 필요
for (let i = 0; i < arr.length; i++) {
    console.log(i, arr[i]);
}
 
// 2. 인덱스+값
arr.forEach((val, i) => console.log(i, val));
 
// 3. 두 배열 동시 (불편함)
for (let i = 0; i < list1.length; i++) {
    console.log(list1[i], list2[i]);
}
 
// 4. 필터링
const result = arr.filter(x => x > 0);
 
// 5. 변환
const result2 = arr.map(x => x ** 2);
# Python (더 간결!)
arr = [1, 2, 3, 4, 5]
 
# 1. 인덱스만 필요
for i in range(len(arr)):
    print(i, arr[i])
 
# 2. 인덱스+값 (enumerate가 더 편함!)
for i, val in enumerate(arr):
    print(i, val)
 
# 3. 두 배열 동시 (zip으로 간단!)
for a, b in zip(list1, list2):
    print(a, b)
 
# 4. 필터링
result = [x for x in arr if x > 0]
 
# 5. 변환
result = [x**2 for x in arr]

핵심 요약

Python이 더 간결한 것:

  • enumerate() - 인덱스+값
  • zip() - 여러 배열 동시 순회
  • List Comprehension - map/filter 대체
  • range() - C 스타일 for문 대체

JS와 같은 개념:

  • for item in arr = for (const item of arr)
  • dict.items() = Object.entries()
  • 튜플 언패킹 = 구조 분해 할당

Python만의 독특한 기능:

  • for-else
  • 슬라이싱 [::-1] (역순)
  • List Comprehension
    1. Python의 내장 문법 (특별히 지원되는 기능)
    2. for문 + append를 한 줄로 축약
    3. JavaScript의 .map(), .filter()같은 역할
    4. 더 간결하고 빠름 (C로 최적화됨)

댓글

첫 번째 댓글을 남겨보세요.