[파이썬 기초 1편] 변수와 문자열 — 에러를 일부러 내면서 배운 것들
파이썬 기초 문법 시리즈
1편. 변수 / 숫자형 / 문자열 ← 현재 글
2편. 리스트 / 튜플
3편. 딕셔너리 / 집합 / 불
들어가며
데이터 분석 공부를 시작하면서 파이썬 기초 문법부터 다시 정리하고 있습니다.
처음엔 "변수? 문자열? 이런 건 그냥 읽고 넘어가면 되는 거 아닌가" 싶었는데, 막상 손으로 쳐보니 생각대로 안 되는 지점이 계속 나왔습니다. 그래서 이번 정리는 문법 나열 대신, 제가 실제로 걸려 넘어진 부분 위주로 남깁니다.
문법책을 눈으로 읽는 것과 셀을 직접 실행해서 빨간 에러를 보는 건 완전히 다른 경험이더군요.
1. 변수
변수는 결국 "이름표"
name = "홍길동"
position = "대리"
email = "steadywing01@gmail.com"
phone_number = "019-8928-1927"
print(name, position, email, phone_number)
홍길동 대리 steadywing01@gmail.com 019-8928-1927
여기까지는 어렵지 않습니다. 문제는 이름을 아무렇게나 지을 수 없다는 데서 시작했습니다.
규칙 1. 대소문자를 구분한다
Age = 30
age = 35
print(Age, age)
30 35
Age와 age는 완전히 다른 변수입니다. 사람 눈에는 같아 보여도 파이썬은 다르게 봅니다.
이게 왜 중요하냐면, 나중에 변수가 수십 개로 늘어났을 때 userName으로 저장해놓고 username으로 불러오는 실수를 하면 "분명히 저장했는데 왜 없다고 하지?" 하면서 한참 헤매게 됩니다. 실제로 제가 그랬습니다.
규칙 2. 특수문자와 숫자로 시작하는 이름은 안 된다
일부러 에러를 내봤습니다.
item?count = 5
SyntaxError: invalid syntax
100days = 100
SyntaxError: invalid decimal literal
밑줄(_)만 예외적으로 허용됩니다. 그래서 phone_number처럼 쓰는 겁니다.
규칙 3. ⚠️ 예약어를 변수로 쓰면 큰일 난다
이게 이번 실습에서 가장 인상 깊었던 부분입니다.
print = "hello"
print(print)
TypeError: 'str' object is not callable
무슨 일이 벌어진 걸까요?
print는 원래 함수입니다. 그런데 print = "hello"로 덮어쓰는 순간, print라는 이름표가 함수에서 떨어져 나와 "hello"라는 문자열에 붙어버립니다. 이제 print(...)를 호출하면 파이썬은 문자열을 함수처럼 호출하려고 시도하고, 당연히 실패합니다.
무서운 건 에러 메시지가 원인을 알려주지 않는다는 점입니다. 'str' object is not callable만 보고 "내가 print를 덮어썼구나"를 떠올리기는 쉽지 않습니다. 게다가 이 상태는 커널을 재시작하기 전까지 계속 유지되기 때문에, 이후에 작성하는 모든 코드에서 print가 고장난 채로 작업하게 됩니다.
list, str, sum, type, id 같은 이름들도 마찬가지입니다. list = [1, 2, 3]처럼 무심코 쓰기 쉬운 이름이라 더 위험합니다.
규칙 4. ⚠️ 주피터에서는 "셀 실행 순서"가 곧 코드 순서다
주피터 노트북을 쓰면서 처음 당황했던 지점입니다.
# 커널 재시작 직후 실행
print(name)
NameError: name 'name' is not defined
분명히 위쪽 셀에 name = "홍길동"이 눈에 보이는데도 에러가 납니다.
핵심은 이겁니다. 파이썬은 화면에 보이는 순서가 아니라, 내가 실행 버튼을 누른 순서대로 기억한다.
커널을 재시작하면 그동안 기억하던 변수가 전부 사라집니다. 화면의 코드는 그대로 남아있으니 "저장은 되어 있는데 왜?" 하고 착각하기 딱 좋습니다. 변수가 있는 셀을 다시 실행하면 정상 동작합니다.
name = "홍길동" # 이 셀을 다시 실행한 뒤에
print(name) # 이 셀을 실행하면 정상
홍길동
💡 교훈: 노트북 작업 중 이상한 에러가 나면, 코드를 의심하기 전에 위에서부터 전부 다시 실행(Restart & Run All)해보는 게 빠릅니다.
2. 숫자형
정수와 실수
x = 5
y = -8
z = 0
print(x, y, z)
print(type(x), type(y), type(z))
5 -8 0
<class 'int'> <class 'int'> <class 'int'>
a = 3.14
b = -0.5
c = 1.0
print(type(a), type(b), type(c))
<class 'float'> <class 'float'> <class 'float'>
1.0처럼 소수점 아래가 0이어도 점이 찍혀 있으면 실수(float) 입니다. 이 구분은 나중에 나눗셈에서 다시 발목을 잡습니다.
큰 숫자는 밑줄로 끊어 읽자
money = 100_000_000_000_000
print(money)
100000000000000
100000000000000을 눈으로 세는 건 고문입니다. 파이썬은 숫자 사이의 밑줄을 그냥 무시하기 때문에, 읽기 좋은 위치에 끊어 쓸 수 있습니다. 출력할 때는 밑줄 없이 나옵니다.
재밌는 건 밑줄 위치가 3자리 단위일 필요도 없다는 점입니다.
money2 = 100_00_0_000_000_000
print(money2)
100000000000000
문법적으로는 통과하지만, 이렇게 쓰면 읽기 편하라고 만든 기능의 취지를 정면으로 배신하는 셈입니다.
지수 표현은 결과가 float이다
num = 1.0e3
print(num)
1000.0
num_under = 2e+10
num_under2 = 2e-10
num_under3 = 0.000000321000011
print(num_under, num_under2, num_under3)
print(type(num_under), type(num_under2), type(num_under3))
20000000000.0 2e-10 3.21000011e-07
<class 'float'> <class 'float'> <class 'float'>
여기서 두 가지가 눈에 띄었습니다.
2e+10은 지수 표기로 썼지만 출력은20000000000.0으로 풀려서 나옵니다.- 반대로
0.000000321000011은 그냥 소수로 썼는데 출력은3.21000011e-07로 지수 표기가 됩니다.
즉, 내가 어떻게 썼는지와 파이썬이 어떻게 보여주는지는 별개입니다. 파이썬은 "그 숫자를 가장 짧게 표현하는 방식"을 알아서 고릅니다. 값 자체는 동일하니 헷갈리지 않으면 됩니다.
정수 + 실수 = 실수
num1 = 10 # int
num2 = 1.0 # float
result = num1 + num2
print(result, type(result))
11.0 <class 'float'>
정수와 실수를 섞으면 더 정밀한 쪽인 실수로 통일됩니다. 정수 쪽에 맞춰 소수점을 버리면 정보가 사라지니까요.
산술 연산 7종
num1 = 10
num2 = 3
print(num1 + num2) # 13 덧셈
print(num1 - num2) # 7 뺄셈
print(num1 * num2) # 30 곱셈
print(num1 / num2) # 3.3333333333333335 나눗셈
print(num1 // num2) # 3 몫
print(num1 % num2) # 1 나머지
print(num1 ** num2) # 1000 거듭제곱
여기서 중요한 포인트 하나. 10 / 3은 나누어떨어지지 않으니 실수가 되는 게 당연해 보이는데, 사실 파이썬 3의 /는 나누어떨어져도 무조건 실수를 돌려줍니다.
print(10 / 5) # 2.0 (2가 아님!)
print(10 // 5) # 2
정수 결과가 꼭 필요하면 //를 써야 합니다. 이걸 모르고 /를 쓰면 인덱스 자리에 실수가 들어가서 TypeError가 나는데, 나중에 리스트를 다룰 때 실제로 마주치게 됩니다.
복합 연산자
money = 0
money += 2000 # money = money + 2000
money -= 500
money *= 3
money /= 3 # ← 여기서 사고 발생
money **= 2
money //= 10
money %= 10
각 단계의 값을 찍어보면 이렇습니다.
| 연산 | 결과 |
|---|---|
money += 2000 |
2000 |
money -= 500 |
1500 |
money *= 3 |
4500 |
money /= 3 |
1500.0 ← 여기서 실수로 변함 |
money **= 2 |
2250000.0 |
money //= 10 |
225000.0 |
money %= 10 |
0.0 |
money /= 3을 지나는 순간 4500이 1500.0이 됩니다. 값은 같아 보이지만 타입이 int에서 float로 바뀐 거고, 이후 모든 연산이 float로 끌려갑니다. 마지막 //와 %까지도 225000.0, 0.0처럼 소수점이 붙어서 나오죠.
돈 계산처럼 정수로 딱 떨어져야 하는 값에서 이런 일이 생기면 곤란합니다. 나눗셈 한 번이 타입 전체를 오염시킨다는 걸 기억해둘 만합니다.
예제 1. 페이지네이션 — //와 %를 같이 쓰는 대표 사례
게시물 100개를 한 페이지에 30개씩 보여주려면 총 몇 페이지가 필요할까?
100 // 30 = 3. 그런데 3페이지만 만들면 남는 10개는 어디에도 못 보여줍니다. 나머지가 있으면 페이지 하나를 더 만들어야 합니다.
post = 100
post_per_page = 30
page_num = post // post_per_page # 3
if post % post_per_page != 0:
page_num += 1 # 나머지 10개를 위한 4페이지
print(page_num)
4
한 줄로 줄이면 이렇게 됩니다.
page_num = (post // post_per_page) + (0 if post % post_per_page == 0 else 1)
//(전체 몫)와 %(남은 것)를 짝으로 쓰는 패턴은 페이지 나누기, 배치 처리, 시간 변환(초 → 분/초) 등에서 계속 나옵니다. 그냥 연산자 두 개가 아니라 하나의 관용구로 외워두는 게 좋겠더군요.
예제 2. 홀짝 판별
birth_year = 1982
remainder = birth_year % 2 # 0이면 짝수, 1이면 홀수
if remainder == 0:
print("짝수")
else:
print("홀수")
짝수
% 2는 홀짝 판별의 표준 관용구입니다. 확장하면 % 3 == 0은 3의 배수, % 100 == 0은 100단위 판별이 됩니다.
3. ⭐ 문자열
데이터 분석에서 가장 많이 만지게 되는 자료형입니다. 실제로 수집한 데이터는 거의 다 문자열 상태로 들어옵니다.
따옴표 안에 따옴표 넣기
message1 = "I'm happy"
message2 = 'I\'m happy'
print(message1)
print(message2)
I'm happy
I'm happy
방법이 두 가지입니다.
- 바깥 따옴표를 다른 걸로 쓴다 — 안에
'가 있으면 바깥은"로. 가장 깔끔합니다. - 백슬래시로 탈출시킨다 —
\'는 "이건 문자열 끝이 아니라 그냥 작은따옴표 글자야"라는 표시입니다.
줄바꿈과 여러 줄 문자열
print("안녕하세요.\n제 이름은 홍길동 입니다")
안녕하세요.
제 이름은 홍길동 입니다
긴 글은 따옴표 3개를 씁니다. 그런데 여기에 함정이 있습니다.
review = """
test text
text test
"""
print(review)
test text
text test
위아래로 빈 줄이 하나씩 생깁니다. """ 바로 뒤의 줄바꿈과 마지막 줄바꿈까지 전부 문자열에 포함되기 때문입니다.
이걸 없애려면 줄 끝에 백슬래시를 붙입니다.
review = '''\
짜장면이 너무너무 맛있는데,
기사 아저씨가 너무 불친절했어요.\
'''
print(review)
짜장면이 너무너무 맛있는데,
기사 아저씨가 너무 불친절했어요.
줄 끝의 \는 "이 줄바꿈은 문자열에 넣지 마" 라는 뜻입니다. 코드에서는 들여쓰기 없이 예쁘게 쓰면서, 실제 문자열에는 불필요한 공백을 안 넣는 방법입니다.
문자열 연산 — 덧셈과 곱셈
text1 = "hello"
text2 = "python"
print(text1 + text2)
hellopython
print("=" * 50)
print("best" * 3)
==================================================
bestbestbest
"=" * 50은 구분선 만들 때 정말 자주 씁니다. 반복문 안에서 로그를 찍을 때 유용합니다.
print("=" * 50)
print("Loop 1.")
print("=" * 50)
단, 문자열 × 문자열은 안 됩니다.
print(text1 * text2)
TypeError: can't multiply sequence by non-int of type 'str'
곱셈은 "몇 번 반복할지"를 정수로 받아야 하는데, "python"은 횟수가 될 수 없으니까요.
길이 재기 — 눈에 안 보이는 공백을 찾는 법
message = "hello"
print(len(message))
5
len()이 진짜 유용해지는 순간은 이겁니다.
text1 = "홍길동"
text2 = "홍길동 " # 뒤에 공백 하나
print(text1, len(text1))
print(text2, len(text2))
홍길동 3
홍길동 4
출력만 보면 완전히 똑같아 보이는데 길이가 다릅니다.
이게 실무에서 왜 중요하냐면, "홍길동"과 "홍길동 "은 파이썬 입장에서 다른 값입니다. 비교하면 False가 나오고, 딕셔너리 키로 쓰면 다른 키가 되고, 데이터를 합칠 때 매칭이 안 됩니다. "분명히 같은 이름인데 왜 조인이 안 되지?"의 범인이 대부분 이 눈에 안 보이는 공백입니다.
의심스러울 땐 len()으로 찍어보는 게 가장 확실합니다.
인덱싱 — 앞에서 세기, 뒤에서 세기
문자열은 글자마다 번호가 붙어 있습니다. 0부터 시작합니다.
문자 9 0 1 2 1 2 - 1 3 2 5 2 2 1
앞에서 0 1 2 3 4 5 6 7 8 9 10 11 12 13
뒤에서 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
앞에서 셀 땐 0부터, 뒤에서 셀 땐 -1부터 시작합니다. 뒤에서 셀 때 -0이 없으니 -1부터인 거죠.
문제. 주민등록번호에서 성별 자리를 뽑아보세요.
regist_num = "901212-1325221"
print(regist_num[7]) # 1
print(regist_num[-7]) # 1
같은 글자에 두 개의 주소가 있는 셈입니다. 어느 쪽을 쓸지는 상황에 따라 다릅니다.
- 문자열 길이가 항상 같다면(주민번호처럼) → 앞에서 세는 게 직관적
- 뒤쪽이 고정이고 앞쪽 길이가 들쭉날쭉하다면 → 뒤에서 세는 게 안전
슬라이싱 — [시작:끝], 끝은 포함 안 됨
문제. 주민등록번호에서 생년월일을 뽑아보세요.
regist_num = "901212-1325221"
print(regist_num[0:6]) # 901212
print(regist_num[:6]) # 901212 (시작 생략 = 처음부터)
print(regist_num[6:]) # -1325221 (끝 생략 = 끝까지)
가장 헷갈렸던 게 끝 번호는 포함되지 않는다는 규칙이었습니다. [0:6]은 0,1,2,3,4,5번째 글자만 가져오고 6번은 안 가져옵니다.
처음엔 불친절하다고 생각했는데, 익숙해지니 오히려 편했습니다. 끝 번호 - 시작 번호 = 가져온 개수가 딱 맞아떨어지거든요. [0:6]은 고민할 것 없이 6글자입니다.
음수 인덱스와도 섞어 쓸 수 있습니다.
print(regist_num[2:6]) # 1212
print(regist_num[-12:-8]) # 1212
print(regist_num[-12:6]) # 1212 (음수 시작 + 양수 끝도 가능)
예제. 주민번호 마스킹
문제. 주민등록번호 뒷자리에서 성별 자리만 남기고 나머지를
*로 가려주세요.
regist_num = "901212-1325221"
temp = regist_num[:8] # 901212-1 (생년월일 + 성별까지)
stars = "*" * 6 # ******
print(temp + stars)
901212-1******
슬라이싱으로 자르고, 곱셈으로 별을 만들고, 덧셈으로 붙이는 3단 조합입니다. 개인정보 마스킹은 실무에서 꼭 필요한 처리라 패턴 자체를 기억해둘 만합니다.
⭐ f-string — 문자열 포매팅
이건 "왜 필요한가"를 실패에서 출발해야 이해가 됩니다.
시도 1. 그냥 더해보기
name = "홍길동"
age = 24
print(name + age)
TypeError: can only concatenate str (not "int") to str
문자열 + 숫자는 안 됩니다. 파이썬 입장에서 +가 "이어붙이기"인지 "더하기"인지 알 수 없거든요.
시도 2. str()로 변환해서 더하기
print(name + "(" + str(age) + ")")
홍길동(24)
동작은 합니다. 그런데 따옴표와 +가 뒤엉켜서 읽기가 괴롭습니다. 변수가 다섯 개쯤 되면 사람이 읽을 수 있는 코드가 아니게 됩니다.
시도 3. f-string
print(f"{name}({age})")
print(f"{name}님 안녕하세요.")
홍길동(24)
홍길동님 안녕하세요.
문자열 앞에 f를 붙이고, 중괄호 안에 변수를 넣으면 끝입니다. 결과물의 모양이 코드에 그대로 보인다는 게 최고의 장점입니다. str() 변환도 알아서 해줍니다.
accuracy = 0.8
print(f"Accuracy: {accuracy}")
Accuracy: 0.8
중괄호 안에는 변수뿐 아니라 식도 들어갑니다.
print(f"정확도: {accuracy * 100}%")
print(f"합계: {10 + 20}")
정확도: 80.0%
합계: 30
앞으로 문자열을 조립할 일이 있으면 고민 없이 f-string을 쓰기로 했습니다.
4. 문자열 메서드 — 데이터 전처리의 도구들
여기서부터는 "문법"이라기보다 실제로 지저분한 데이터를 청소하는 도구에 가깝습니다.
⭐ split() — 문자열 쪼개기
address1 = '서울시 관악구 신림동' # 서울시 뒤에 공백 2개
address2 = '강남구/동작구/노원구'
print(address1.split())
print(address1.split(' '))
print(address2.split('/'))
['서울시', '관악구', '신림동']
['서울시', '', '관악구', '신림동']
['강남구', '동작구', '노원구']
여기가 이번 실습에서 두 번째로 인상 깊었던 지점입니다.
split()과 split(' ')는 같아 보이지만 결과가 다릅니다.
split()— 인자 없이 쓰면 연속된 공백을 하나로 묶어서 처리하고, 빈 값도 안 만듭니다.split(' ')— 공백 하나를 정확히 구분자로 봅니다. 공백이 두 개면 그 사이에 빈 문자열''이 끼어듭니다.
실무 데이터는 공백이 두 개, 세 개씩 들어있는 경우가 흔합니다. 그래서 공백으로 자를 때는 인자 없이 split()을 쓰는 게 안전합니다. 저는 이걸 모르고 split(' ')을 쓰다가 빈 문자열이 섞인 리스트를 받고 한참 봤습니다.
예제. 파일 확장자 분리
file_name1 = "수업자료.pdf"
file_name2 = "수업자료_복습.ipynb"
print(file_name1.split("."))
print(file_name2.split("."))
['수업자료', 'pdf']
['수업자료_복습', 'ipynb']
split()의 결과는 항상 리스트입니다. 그래서 파일명은 [0], 확장자는 [-1]로 꺼냅니다.
참고로
"보고서.최종.v2.xlsx"처럼 점이 여러 개면['보고서', '최종', 'v2', 'xlsx']가 되므로, 확장자는[1]이 아니라[-1]로 꺼내는 게 안전합니다.
replace() — 문자열 바꾸기
message = "오늘의 날씨는 맑음"
result = message.replace("맑음", "흐림")
print(result)
오늘의 날씨는 흐림
여기서 꼭 짚고 갈 것: replace()는 원본을 바꾸지 않습니다. 바뀐 새 문자열을 돌려줄 뿐입니다.
message.replace("맑음", "흐림")
print(message) # 오늘의 날씨는 맑음 ← 그대로!
문자열은 한 번 만들면 못 바꾸는(immutable) 자료형이라 그렇습니다. 반드시 결과를 변수에 다시 담아야 합니다. 이건 뒤에 나올 strip(), lower(), upper()도 전부 동일합니다.
실전. 뒤죽박죽 성별 데이터 정리
수집된 성별 데이터가 이렇게 들어왔다고 해봅시다.
gender = "fffmmm여자mm남자f"
한글과 알파벳이 섞여 있습니다. 이걸 replace()를 연쇄로 써서 정리합니다.
result1 = gender.replace("여자", "f")
result2 = result1.replace("남자", "m")
print(result2)
fffmmmfmmmf
replace()가 문자열을 돌려주니까, 그 결과에 또 replace()를 붙일 수 있습니다. 그래서 이렇게 한 줄로도 됩니다.
print(gender.replace("여자", "f").replace("남자", "m"))
이걸 응용하면 붙어있는 데이터를 낱개로 분리할 수도 있습니다.
print(result2.replace("f", "f ").replace("m", "m "))
print(result2.replace("f", "f ").replace("m", "m ").split())
f f f m m m f m m m f
['f', 'f', 'f', 'm', 'm', 'm', 'f', 'm', 'm', 'm', 'f']
구분자가 없어서 자를 수 없던 문자열에, replace로 공백을 심어놓고 split으로 자르는 발상입니다. 처음 봤을 때 "이런 식으로도 푸는구나" 싶었습니다.
실전. 리뷰에서 노이즈 제거
review = "이거 진짜 웃기닼ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ"
print(review.replace("ㅋ", ""))
이거 진짜 웃기닼
replace(찾을것, "")은 삭제입니다. 빈 문자열로 바꾼다 = 지운다. 텍스트 분석 전에 의미 없는 문자를 걷어낼 때 쓰는 기본 기술입니다.
lower() / upper() — 대소문자 통일
gender = "f,F,f,m,M,m,F,f,M,M"
print(gender.lower())
print(gender.upper())
f,f,f,m,m,m,f,f,m,m
F,F,F,M,M,M,F,F,M,M
같은 성별인데 f와 F로 따로 집계되면 안 되니, 세기 전에 한쪽으로 통일하는 게 먼저입니다. 이메일이나 아이디 비교에서도 필수 전처리입니다.
strip() / lstrip() / rstrip() — 공백 제거
name = " 홍길동 "
print(f"|{name.strip()}|") # 양쪽
print(f"|{name.lstrip()}|") # 왼쪽만
print(f"|{name.rstrip()}|") # 오른쪽만
|홍길동|
|홍길동 |
| 홍길동|
💡 작은 팁: 결과를
|사이에 끼워서 출력한 것에 주목하세요. 공백은 눈에 안 보이기 때문에, 이렇게 경계 문자로 감싸야 얼마나 지워졌는지 확인할 수 있습니다.len()과 함께 공백 디버깅의 필수 기술입니다.
이름 앞뒤의 공백은 사용자 입력에서 정말 흔하게 들어옵니다. 앞서 본 "홍길동" vs "홍길동 " 문제를 떠올려보면, 입력받은 문자열은 일단 strip()부터 거는 습관이 왜 필요한지 알 수 있습니다.
count() — 개수 세기
gender = "F,F,F,M,M,M,F,F,M,M"
print(gender.count("F")) # 5
print(gender.count("M")) # 5
print(gender.count("m")) # 0 ← 대소문자 구분!
print(gender.count("f")) # 0
print(len(gender)) # 19
count()도 대소문자를 구분합니다. 그래서 세기 전에 lower()로 통일하는 게 순서입니다.
예제. 리뷰 키워드 빈도
review = """\
짬뽕은 정말 맵고 맛있었어요. 해산물이 가득 들어가서 만족했습니다.
짜장면은 이 집에서 먹어본 것 중 가장 맛있었어요
짜장면 굿\
"""
print(f"짜장면 등장 횟수: {review.count('짜장면')}")
print(f"짬뽕 등장 횟수: {review.count('짬뽕')}")
짜장면 등장 횟수: 2
짬뽕 등장 횟수: 1
⚠️ f-string 안에서 따옴표를 쓸 때는 바깥과 다른 종류를 써야 합니다.
f"...{review.count('짜장면')}..."처럼 바깥이"면 안쪽은'로.
이게 텍스트 분석의 가장 원시적인 형태입니다. 여러 리뷰에 이걸 돌리면 "어떤 메뉴가 자주 언급되는가"를 알 수 있고, 그게 곧 워드클라우드나 키워드 분석의 출발점입니다.
1편 정리
오늘의 함정 4선
| 함정 | 증상 | 대응 |
|---|---|---|
| 예약어 덮어쓰기 | print = "hello" 후 'str' object is not callable |
print, list, str, sum, type 을 변수명으로 쓰지 않기 |
| 커널 재시작 후 NameError | 코드가 화면에 보이는데도 "정의되지 않았다" | 위에서부터 다시 실행(Restart & Run All) |
/ 나눗셈의 타입 오염 |
4500이 1500.0으로 변해서 이후 계산 전부 float |
정수가 필요하면 // |
split(' ')의 빈 문자열 |
공백 2개 사이에 ''가 끼어듦 |
공백 기준이면 인자 없이 split() |
손에 익혀야 할 것
- 문자열 메서드는 원본을 안 바꾼다 → 결과를 변수에 다시 담기
- f-string → 문자열 조립은 무조건 이걸로
len()과|{...}|→ 눈에 안 보이는 공백 찾는 두 가지 기술//와%는 짝 → 페이지네이션, 홀짝, 단위 변환의 관용구- 슬라이싱
[시작:끝], 끝은 미포함 → 대신끝 - 시작 = 개수
다음 편에서는 여러 값을 한 번에 담는 리스트와 튜플을 정리합니다. lst[8:] = 10은 에러가 나는데 lst[8:] = "python"은 되는, 좀 이상한 이야기가 기다리고 있습니다.