# Aliasing
x = 5
y = x
y = 3
print(x)
print(y)
x = [2, 3, 5, 7, 11]
y = x
y[2] = 4
print(x)
print(y)
x 는 바꾸면서 y 값 유지하는 방법
x = [2, 3, 5, 7, 11]
y = list(x)
y[2] = 4
print(x)
print(y)
리스트와 문자열 : 구조적으로 비슷함
리스트 : 자료형 나열
문자열 : 문자 나열
# 인덱싱 (Indexing)
- 리스트 : 인덱싱 가능
- 문자열 : 인덱싱 가능
alphabet_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
print(alphabet_list[0])
print(alphabet_list[1])
print(alphabet_list[4])
print(alphabet_list[-1])
print()
alphabet_string = 'ABCDEFGHIJ'
print(alphabet_string[0])
print(alphabet_string[1])
print(alphabet_string[4])
print(alphabet_string[-1])
# 슬라이싱 (Slicing)
- 리스트 : 슬라이싱 가능
- 문자형 : 슬라이싱 가능
alphabet_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
print(alphabet_list[0:5])
print(alphabet_list[4:])
print(alphabet_list[:4])
print()
alphabet_string = 'ABCDEFGHIJ'
print(alphabet_string[0:5])
print(alphabet_string[4:])
print(alphabet_string[:4])
# 덧셈 연산
- 리스트 : 덧셈 연산 가능
- 문자열 : 덧셈 연산 가능
list_1 = [1, 2, 3, 4]
list_2 = [5, 6, 7, 8]
list_3 = list_1 + list_2
print(list_3)
str_1 = 'Hello'
str_2 = 'World'
str_3 = str_1 + str_2
print(str_3)
# len 함수
- 리스트 : len 함수 사용 가능
- 문자열 : len 함수 사용 가능
my_list = [2, 3, 5, 7, 11]
print(len(my_list))
my_string = 'Hello world!'
print(len(my_string))
# for 반복문
- 리스트 : for 반복문 가능
- 문자열 : for 반복문 가능
alphabets_list = ['C', 'O', 'D', 'E', 'I', 'T']
for alphabet in alphabets_list:
print(alphabet)
print()
alphabets_string = 'CODEIT'
for alphabet in alphabets_string:
print(alphabet)
# Mutable (수정 가능) vs Immutable (수정 불가능)
리스트와 같이 수정 가능한 자료형 : mutable한 자료형
문자열, 숫자, 불린 등과 같이 수정 불가능한 자료형 : immutable한 자료형
- 리스트 : 데이터 수정 가능
numbers = [1, 2, 3, 4]
numbers[0] = 5
print(numbers)
- 문자열 : 데이터 수정 불가능 (데이터 생성, 삭제, 수정 불가능)
name = 'codeit'
name[0] = 'C'
print(name)
TypeError: 'str' object does not support item assignment # 문자열은 변형이 불가능하다는 메시지
cf)
name = 'code' + 'it'
print(name)
# 오류 안남. 문자열을 수정한 것이 아니라 문자열을 이용해 새로운 문자열을 만든 것이기 때문
실습 과제
#
함수 sum_digit은 파라미터로 정수형 num을 받고, num의 각 자릿수를 더한 값을 리턴합니다.
예를 들어서 12의 각 자릿수는 1, 2이니까 sum_digit(12)는 3(1 + 2)을 리턴합니다.
마찬가지로 486의 각 자릿수는 4, 8, 6이니까 sum_digit(486)은 18(4 + 8 + 6)을 리턴하는 거죠.
# 자리수 합 리턴
def sum_digit(num):
num_string = str(num)
sum = 0
for n in num_string:
sum += int(n)
return sum
# sum_digit(1)부터 sum_digit(1000)까지의 합 구하기
i = 1
sum_total = 0 # sum_digit(1) ~ sum_digit(1000) 자리수 합 더해 가는 변수
while i <= 1000:
sum_total += sum_digit(i)
i += 1
print(sum_total)
#
주민등록번호 YYMMDD-abcdefg는 총 열세 자리인데요.
앞의 여섯 자리 YYMMDD는 생년월일을 의미합니다.
- YY → 연
- MM → 월
- DD → 일
뒤의 일곱 자리 abcdefg는 살짝 복잡합니다.
- a → 성별
- bc → 출생등록지에 해당하는 지방자치단체의 고유번호
- defg → 임의의 번호
보시다시피 많은 부분은 특정 규칙대로 정해져 있는데요. 여러분에 대한 몇 가지 정보만 알면, 마지막 네 개 숫자 defg를 제외한 앞의 아홉 자리는 쉽게 알 수 있다는 거죠.
그래서 저희는 주민등록번호의 마지막 네 자리 defg만 가려 주는 보안 프로그램을 만들려고 합니다.
mask_security_number라는 함수를 정의하려고 하는데요. 이 함수는 파라미터로 문자열 security_number를 받고, security_number의 마지막 네 글자를 '*'로 대체한 새 문자열을 리턴합니다.
참고로 파라미터 security_number에는 작대기 기호(-)가 포함될 수도 있고, 포함되지 않을 수도 있는데요. 작대기 포함 여부와 상관 없이, 마지막 네 글자가 '*'로 대체되어야 합니다!
def mask_security_number(security_number):
security_number_list = list(security_number)
security_number_str = ''
for i in range(len(security_number_list)):
if (len(security_number_list) - 4) <= i:
security_number_list[i] = '*'
security_number_str += security_number_list[i]
return security_number_str
# 테스트
print(mask_security_number("880720-1234567"))
print(mask_security_number("8807201234567"))
print(mask_security_number("930124-7654321"))
print(mask_security_number("9301247654321"))
print(mask_security_number("761214-2357111"))
print(mask_security_number("7612142357111"))
과제 해설
접근법 #1 내 코드와 동일
접근법 #2 join() 함수 이용
join() # 문자열로 이루어진 리스트를 구분자로 결합하여 하나의 문자열로 만들어 줌
예제
units = ["cm", "m", "yard"]
units_to_string = ', '.join(units)
print(type(units_to_string))
print(units_to_string)
# units 리스트의 각 요소들이 , (comma) 와 공백으로 결합된 하나의 문자열로 출력됨
str.join(list) 형태
str : 리스트 요소들을 결합할 때 사용될 구분자 (구분자 : 문자열이어야 함)
list : 각 요소가 문자열인 리스트
답
def mask_security_number(security_number):
num_list = list(security_number)
# 마지막 네 값을 *로 대체
for i in range(len(num_list) - 4, len(num_list)):
num_list[i] = '*'
# 리스트를 문자열로 복구하여 반환
return ''.join(num_list)
접근법 #3 문자열 슬라이싱 이용
security_number 의 마지막 네 자리만 제외해서 슬라이싱을 하고, 문자열 " **** "과 연결
def mask_security_number(security_number):
return security_number[:-4] + '****'
#
"토마토"나 "기러기"처럼 거꾸로 읽어도 똑같은 단어를 '팰린드롬(palindrome)'이라고 부릅니다.
팰린드롬 여부를 확인하는 함수 is_palindrome을 작성하려고 하는데요. is_palindrome은 파라미터 word가 팰린드롬이면 True를 리턴하고 팰린드롬이 아니면 False를 리턴합니다.
예를 들어서 "racecar"과 "토마토"는 거꾸로 읽어도 똑같기 때문에 True가 출력되어야 합니다. 그리고 "hello"는 거꾸로 읽으면 "olleh"가 되기 때문에 False가 나와야 하는 거죠.
def is_palindrome(word):
return word == word[::-1]
# 테스트
print(is_palindrome("racecar"))
print(is_palindrome("stars"))
print(is_palindrome("토마토"))
print(is_palindrome("kayak"))
print(is_palindrome("hello"))
해설
문자열의 첫 번째 원소와 마지막 원소 비교 --> 문자열의 두 번째 원소와 끝에서 두 번째 원소 비교 --> ...
문자열 word의 첫 번째 원소의 인덱스 : 0, 마지막 원소의 인덱스 : len(word) - 1
문자열 word의 두 번째 원소의 인덱스 : 1, 끝에서 두 번째 원소의 인덱스 : len(word) - 2
일반화
i 를 0부터 1씩 늘린다고 가정했을 때, 인덱스 i 에 있는 값과 인덱스 len(word) - i - 1 에 있는 값을 비교
cf) i 를 0부터 len(word) - 1 까지 반복할 필요없음. 어차피 반대쪽과 비교하는 것이기 때문에 i 를 len(word) // 2 까지만 반복해도 이미 모든 확인이 끝남
def is_palindrome(word):
for left in range(len(word) // 2):
# 한 쌍이라도 일치하지 않으면 바로 False를 리턴하고 함수를 끝냄
right = len(word) - left - 1
if word[left] != word[right]:
return False
# for문에서 나왔다면 모든 쌍이 일치
return True
# 테스트
print(is_palindrome("racecar"))
print(is_palindrome("stars"))
print(is_palindrome("토마토"))
print(is_palindrome("kayak"))
print(is_palindrome("hello"))