변수와 타입
모든 프로그램은 무언가를 기억해야 합니다. 퀴즈는 플레이어의 이름을 기억해야 하고, 게임은 현재 점수를 기억해야 하며, 날씨 스크립트는 확인 중인 도시를 기억해야 합니다. Python은 이를 위해 변수를 사용합니다. 값에 붙이는 이름으로, 프로그램 전체에서 그 값을 사용할 수 있게 합니다.
player_name = "민지"
score = 0
city = "서울"세 줄, Python이 이제 기억해야 할 세 가지입니다. 각 줄마다 Python은 오른쪽의 값을 먼저 계산한 다음 왼쪽 이름으로 저장합니다. 나중에 그 이름을 사용하면 Python이 값을 돌려줍니다.
값 저장하기
= 기호는 수학 시간에서 온 사람들을 거의 항상 헷갈리게 합니다. Python에서 =는 "같다"는 뜻이 아닙니다. **이 값을 이 이름으로 저장하라**는 뜻입니다.
city = "서울"city가 "서울"을 얻습니다. Python에 "서울"을 기억하고 city라고 레이블을 붙이라고 말하는 것입니다.
변수의 값은 언제든지 바꿀 수 있습니다. Python은 가장 최근 값을 사용합니다.
score = 0
score = 10 # score는 이제 10
score = 15 # score는 이제 15=는 수학 시간 "같다"가 아니라 "이 값을 이 이름으로 보관하라"는 뜻입니다. 언제든지 바꿀 수 있고 Python이 가장 최신 값을 유지합니다. 선언도 설정도 필요 없고, 이름을 붙이면 그냥 존재합니다. 이걸 과하게 생각하는 데 정말 오래 걸렸어요. 변수 이름 짓기
이름은 당신이 선택합니다. Python은 몇 가지 엄격한 규칙이 있고, 커뮤니티는 처음부터 따를 가치가 있는 관례를 따릅니다. 명확한 이름은 코드를 나중에 읽기 쉽게 합니다. 암호 같은 이름은 고통을 초래합니다.
Python이 강제하는 규칙:
- 문자, 숫자, 언더스코어만 가능합니다. 공백이나 하이픈은 안 됩니다.
- 문자나 언더스코어로 시작해야 합니다. 숫자로 시작할 수 없습니다.
- 대소문자를 구분합니다.
score,Score,SCORE는 세 개의 다른 변수입니다.
모두가 따르는 관례(PEP 8):
| 대상 | 스타일 | 예시 |
|---|---|---|
| 변수와 함수 | snake_case | user_name, total_price |
| 상수 | UPPER_SNAKE_CASE | MAX_RETRIES, BASE_URL |
| 클래스 | PascalCase | UserAccount, DataLoader |
# 명확한 이름, 한눈에 읽을 수 있음
user_name = "민지"
total_price = 49.99
is_logged_in = True
MAX_RETRIES = 3
# 이런 건 한 시간 안에 후회할 겁니다
x = "민지"
tp = 49.99
b = True일찍 알면 좋은 함정 하나: 변수 이름을 list, input, type, print 같은 Python 내장 함수로 지으면 안 됩니다. Python이 허용하지만, 그 범위의 나머지에서 내장 함수를 조용히 망칠 것이고, 그 결과로 나타나는 오류는 추적하기 어렵습니다.
snake_case를 고집하면 당신은 완벽합니다. 제 한 가지 초보자 실수: 변수를 list나 print로 부르지 마세요. Python이 허용하면 나중에 경고 없이 모든 게 이상해집니다. 저장할 수 있는 것
Python은 거의 모든 프로그램에서 사용할 네 가지 타입을 가지고 있습니다. Python은 값을 어떻게 썼는지를 보고 타입을 파악합니다. 타입을 명시적으로 선언할 필요가 없습니다.
텍스트(str)
모든 텍스트는 따옴표(단일 또는 이중)로 감쌉니다. 따옴표는 Python에 문자 그대로의 문자를 의도한 것이고, 변수 이름이 아님을 알립니다. 한 번 만들어진 문자열은 제자리에서 바뀔 수 없습니다. 문자열 장에서 문자열로 할 수 있는 모든 것을 다룹니다.
player_name = "민지"
city = "서울"
message = '게임 오버'텍스트에 아포스트로피가 포함되면, 이스케이프할 필요가 없도록 이중 따옴표를 사용하세요.
note = "It's a great day"
note = 'It\'s a great day' # 같은 결과, 이스케이프 사용정수(int)
정수는 따옴표나 소수점 없이 쓰입니다. Python은 이를 정수라 부릅니다. 원하는 만큼 클 수 있습니다. Python은 아무런 특별한 노력 없이 임의로 큰 숫자를 처리합니다.
score = 0
age = 28
population = 8_100_000_000 # 언더스코어는 읽기 쉽게 하는 것일 뿐8_100_000_000의 언더스코어는 읽기 위함일 뿐입니다. 소수(float)
소수점이 있는 모든 숫자는 float입니다. 대부분의 계산에서 예상대로 작동합니다. 한 가지 알아야 할 것: 어떤 소수 값은 이진수로 정확히 저장될 수 없어서 작은 반올림 오류가 생길 수 있습니다.
price = 4.99
temperature = 36.6
0.1 + 0.2 # 0.30000000000000004일반 작업에서는 이것이 거의 중요하지 않습니다. 센트 미만의 금액이 중요한 금융 계산의 경우, Python은 올바르게 처리하는 decimal 모듈을 가지고 있습니다. 이는 숫자 장에서 다룹니다.
0.1 + 0.2는 0.30000000000000004를 줍니다. 버그가 아니라 이진수입니다. 돈에는 decimal.Decimal을 사용하세요. 참/거짓(bool)
어떤 것들은 켜졌거나 꺼져있습니다. Python은 이를 위해 부울을 사용합니다. 정확히 두 값, True와 False입니다. 지금은 작아 보이지만, 프로그램의 모든 조건과 분기는 부울에서 실행됩니다.
is_logged_in = True
has_errors = FalsePython은 또한 어떤 값들을 조건에서 사용할 때 False인 것처럼 취급합니다. 0, 0.0, "", None(Python의 "여기 값이 없다")은 모두 False처럼 행동합니다. 다른 모든 것은 True처럼 행동합니다. 이는 제어 흐름 장에서 유용해집니다.
True와 False, 그리고 당신이 쓸 모든 if 뒤에 있습니다. 재미있는 부분: 0, "", [], None은 모두 False로 세어집니다. 다른 모든 것은 True입니다. 타입 확인과 변환
값의 타입이 확실하지 않을 때, type()이 말해줍니다. 값이 특정 타입인지 확인하려면, isinstance()이 더 신뢰할 수 있는 도구입니다.
print(type("hello")) # <class 'str'>
print(type(42)) # <class 'int'>
print(type(3.14)) # <class 'float'>
print(type(True)) # <class 'bool'>
isinstance(42, int) # True
isinstance("hi", str) # TruePython은 타입을 자동으로 혼합하지 않습니다. 문자열과 숫자를 연결하면 TypeError가 발생합니다.
score = 42
print("Your score is " + score) # TypeError
print("Your score is " + str(score)) # 작동타입 이름을 함수로 사용하여 명시적으로 변환하세요.
| 호출 | 결과 |
|---|---|
str(42) | "42" |
int(3.9) | 3 (내림, 반올림 아님) |
float("3.14") | 3.14 |
int("3.14") | ValueError: 소수 문자열을 정수로 직접 변환할 수 없음 |
int(float("3.14")) | 3 (먼저 float로 변환, 그 다음 정수로) |
bool(0) / bool("") | False |
type()은 무언가가 무엇인지 알려줍니다. isinstance()는 주어진 타입인지 확인합니다. 그리고 Python은 문자열과 숫자를 붙이지 않으므로 str()이나 int()로 먼저 변환하세요. 모두가 한 번씩 실패합니다. 실제 사용
네 가지 타입이 작은 스크립트에서 함께 작동합니다. 출력 줄은 f-문자열을 사용하여 텍스트에 값을 포함합니다. 열기 따옴표 앞에 f를 붙이고 변수를 {}로 감싸세요. Python이 변수의 실제 값으로 바꿉니다. 다음 장에서 이를 제대로 배웁니다.
player_name = "민지"
level = 3
accuracy = 0.94
is_premium = True
print(f"{player_name} is on level {level} with {accuracy:.0%} accuracy.")
print(f"Premium account: {is_premium}")타입이 중요한 이유는 level + 1은 작동하지만 player_name + 1은 그렇지 않기 때문입니다. 각 변수는 정확히 한 종류의 것을 담습니다. Python은 자동으로 이들을 섞지 않습니다.

