# [Python TIL] Python 기초 복습

## 1\. 🔤 출력과 입력의 기초

### ✅ `print()` 함수

`print()`는 출력하고 싶은 값을 화면에 보여주는 함수이다. 인자로 문자열, 숫자, 리스트, 변수 등 다양한 자료형을 넣을 수 있다.  
호출할 때마다 기본적으로 **줄바꿈(\\n)**이 함께 이루어진다.

```python
print("Hello, Python!")
print(3 + 4) # +는 숫자 뿐만 아니라 문자도 연산이 가능하다 (문자열을 이을 때 사용)
```

**실행 결과**

```javascript
Hello, Python!
7
```

**줄바꿈 없이 출력하고 싶다면** `end=""` 옵션을 사용한다.

```python
print("A", end="")
print("B")
```

**결과**

```javascript
AB
```

---

### ✅ f-string을 이용한 출력

`f-string`은 문자열 안에 변수나 표현식을 직접 넣어 출력할 수 있는 방식이다. 문자열 앞에 `f`를 붙이고 중괄호 `{}` 안에 변수명을 넣는다.

```python
name = "Alice"
age = 25
print(f"{name}의 나이는 {age}살입니다.")
```

**결과**

```javascript
Alice의 나이는 25살입니다.
```

복잡한 수식도 중괄호 안에 넣을 수 있다.

```python
print(f"내년이면 {age + 1}살이 됩니다.")
```

---

### ✅ 역슬래시 출력

문자열 안에서 `\`는 특수문자(이스케이프 문자)로 인식된다. 예를 들어 `\n`은 줄바꿈, `\t`는 탭이다.  
그래서 일반 `\`를 출력하고 싶다면 **두 번 써야 한다.**

```python
print("C:\\Users\\Alice\\Documents")
```

**결과**

```javascript
C:\Users\Alice\Documents
```

---

### ✅ `input()` 함수

`input()`은 사용자의 입력을 문자열 형태로 받아오는 함수이다.

```python
name = input("이름을 입력하세요: ")
print(f"안녕하세요, {name}님!")
```

**입력**

```javascript
이름을 입력하세요: Alice
```

**출력**

```javascript
안녕하세요, Alice님!
```

---

### ✅ 여러 개 입력받기

```python
a, b, c = input("세 개의 숫자를 입력하세요: ").split()
print(a, b, c)
```

**입력**

```javascript
100 200 300
```

**출력**

```javascript
100 200 300
```

`split()`은 공백 기준으로 문자열을 나눠 리스트로 만들고, 각각의 변수에 할당해준다.

---

### ✅ `sys.stdin.readline()` (빠른 입력)

기본 `input()` 함수보다 더 빠른 입력이 필요한 경우 `sys.stdin.readline()`을 사용할 수 있다.  
파일에서 데이터를 읽어오거나 반복적으로 많은 입력을 받아야 할 때 유용하다.

```python
import sys
data = sys.stdin.readline().strip()
print(data)
```

`strip()`을 붙이는 이유는 입력 끝에 자동으로 붙는 `\n`을 제거하기 위함이다.

---

## 2\. 🎲 `random` 함수 소개

파이썬에서 랜덤한 값을 만들고 싶을 때는 `random` 모듈을 사용한다.

```python
import random
```

### ✅ `random.randint(a, b)`

a 이상 b 이하의 정수 중 하나를 무작위로 반환한다.

```python
print(random.randint(1, 6))  # 주사위
```

---

### ✅ `random.choice(seq)`

시퀀스(리스트, 문자열 등)에서 **무작위로 하나의 요소**를 선택한다.

```python
colors = ["red", "green", "blue"]
print(random.choice(colors))
```

---

### ✅ `random.shuffle(list)`

리스트의 요소들을 제자리에서 무작위로 섞는다. 반환값은 없고 원본 리스트가 변경된다.

```python
numbers = [1, 2, 3, 4, 5]
random.shuffle(numbers)
print(numbers)
```

---

### ✅ 작은 예제: 주사위 시뮬레이터

```python
import random
print(f"주사위 결과: {random.randint(1, 6)}")
```

---

## 3\. 🔁 반복문 함수

#### ✅ `range(n)`

0부터 n-1까지의 숫자를 생성하는 내장 함수이다. 반복문에서 자주 사용된다.

```python
for i in range(5):
    print(i)
```

**결과**

```javascript
0
1
2
3
4
```

---

### ✅ `while`문

`while`은 주어진 조건이 `True`인 동안 반복 실행된다.

```python
count = 3
while count > 0:
    print(count)
    count -= 1
```

**결과**

```javascript
3
2
1
```

---

### ✅ 무한 루프와 `break`

조건을 `True`로 고정하면 무한 루프가 되며, 이를 `break`로 탈출할 수 있다.

```python
while True:
    text = input("종료하려면 'exit' 입력: ")
    if text == "exit":
        break
```

---

### ✅ `for`문에서 인덱스 안 쓸 때

변수 `_`를 쓰면 변수를 쓰지 않고 반복만 하라는 의미가 된다.

```python
for _ in range(3):
    print("반복 중!")
```

---

### ✅ `continue`: 다음 반복으로 건너뛰기

```python
for i in range(5):
    if i == 2:
        continue
    print(i)
```

**결과**

```javascript
0
1
3
4
```

---

## 4\. ✂️ 문자열 메서드 정리

문자열은 불변(immutable) 자료형이지만 다양한 메서드로 복사본을 만들 수 있다.

### ✅ `.upper()` – 모두 대문자로

```python
s = "python"
print(s.upper())  # 'PYTHON'
```

---

### ✅ `.lower()` – 모두 소문자로

```python
s = "PyTHon"
print(s.lower())  # 'python'
```

---

### ✅ `.capitalize()` – 첫 글자만 대문자로

```python
s = "python programming"
print(s.capitalize())  # 'Python programming'
```

---

### ✅ `.replace(old, new)` – 특정 문자열 바꾸기

```python
s = "I like apple"
print(s.replace("apple", "banana"))  # 'I like banana'
```

---

### ✅ `.strip()` – 문자열 앞뒤 공백 제거

```python
s = "   hello world   "
print(s.strip())  # 'hello world'
```

---

### ✅ `.split()` – 구분자 기준으로 나누기

```python
s = "one,two,three"
print(s.split(","))  # ['one', 'two', 'three']
```

---

### ✅ `.join()` – 리스트를 문자열로 합치기

```python
words = ['one', 'two', 'three']
print("-".join(words))  # 'one-two-three'
```

---

---

## 5\. 📚 리스트 주요 메서드

| 메서드 | 정의 | 인자 | 반환값 | 예시 | 결과 |
| --- | --- | --- | --- | --- | --- |
| `.append(x)` | 리스트 끝에 항목 x 추가 | `x`: 추가할 값 | 없음 (`None`) | `fruits.append("grape")` | `['apple', 'banana', 'grape']` |
| `.insert(i, x)` | 인덱스 i 위치에 항목 x 삽입 | `i`: 위치, `x`: 값 | 없음 (`None`) | `fruits.insert(1, "kiwi")` | `['apple', 'kiwi', 'banana']` |
| `.remove(x)` | 리스트에서 첫 번째로 나오는 항목 x 삭제 | `x`: 삭제할 값 | 없음 (`None`) | `fruits.remove("apple")` | `['banana', 'apple']` |
| `.pop(i)` | 인덱스 i에 있는 항목 삭제하고 반환 | `i` (선택): 삭제할 위치 (기본은 마지막) | 삭제된 값 | `fruits.pop(1)` | `'banana'` |
| `.sort()` | 리스트를 제자리에서 정렬 | 없음 | 없음 (`None`) | `numbers.sort()` | `[1, 2, 3, 4]` |
| `.reverse()` | 리스트를 거꾸로 뒤집음 | 없음 | 없음 (`None`) | `numbers.reverse()` | `[4, 3, 2, 1]` |
| `.count(x)` | 리스트에서 항목 x의 개수 반환 | `x`: 검색할 값 | 정수 | `fruits.count("apple")` | `2` |
| `.index(x)` | 항목 x가 처음 나오는 인덱스 반환 | `x`: 검색할 값 | 정수 | `fruits.index("banana")` | `1` |
| `.clear()` | 모든 항목 제거 | 없음 | 없음 (`None`) | `fruits.clear()` | `[]` |
| `.copy()` | 리스트 복사본 생성 | 없음 | 새로운 리스트 | `copy_list = fruits.copy()` | `copy_list == fruits` |
