[혼공파8기] Week 3_Chapter 04

너스레:)·2022년 7월 24일
0

python

목록 보기
3/6

기본 미션

리스트, 딕셔너리, 범위 자료형에 대해 이해한 내용을 바탕으로 포스팅하기

1. 리스트 ; [ 요소1, 요소2, ... ]

A. '여러 자료형'으로 구성된 리스트

요번에도 파이썬과 이전에 배웠던 C언어 간의 비교점을 찾을 수 있었다!

파이썬의 리스트는, C언어의 배열 리스트와 달리,
"여러 종류"의 자료형으로도 구성할 수 있다!

C언어의 배열 리스트는 배열 내 모든 요소의 자료형이 '동일'해야하고, 만약 다른 종류의 자료형들을 하나로 묶고 싶다면 '구조체'라는 개념을 도입해야했던 걸로 기억하는데, 파이썬은! 그럴 필요 없다 ^__^!

요거... 되게 유용하게 써먹을 수 있을 것 같으니까..
까먹지 않게 관련 예시를 실행해보자.

# '숫자만'으로 구성된 리스트
[1, 2, 3, 4, 5]

# '문자열만'으로 구성된 리스트
["안", "녕", "하", "세", "요"]

# '여러 자료형'으로 구성된 리스트
[273, 32, 103, '문자열', True, False]

'''
정상 작동됨!
'''

아 참고로 '여러 자료형'에 뭐가 있는지 까먹었을 수도 있으니까
앞에서 배운 '파이썬의 자료형'도 정리해두면..

파이썬의 자료형
=> 문자열(string) / 숫자(number) / 불(boolean)

B. 리스트의 활용

여러 말보단 바로 코드 & 그 결과로 보여주자면...

(1) 인덱스 슬라이싱 ; [ 시작 : 끝+1 ]

(2) 리스트의 특정 요소 변경 ; 인덱스

(3) 뒤에서부터 요소 선택 ; 음수 인덱스

(4) '이중' 리스트 접근 연산자

(5) 리스트 안의 리스트

C. 리스트에서의 IndexError 예외

리스트에서의 IndexError 예외
: 리스트의 길이를 넘는 인덱스로 요소에 접근하려고 할 때 발생

1) 리스트 연산자 : 연결(+), 반복(*), len()

이것도 긴 말보다는 코드로 바로 확인해보면 직관적이다!

# 리스트 선언
list_a = [1, 2, 3]
list_b = [4, 5, 6]

# 출력
print("# 리스트")
print("list_a =", list_a)
print("list_b =", list_b)
print()
"""
# 리스트
list_a = [1, 2, 3]
list_b = [4, 5, 6]
"""

# 기본 연산자
print("# 리스트 기본 연산자")
print("list_a + list_b =", list_a + list_b)
print("list_a * 3 =", list_a * 3)
print()
"""
# 리스트 기본 연산자
list_a + list_b = [1, 2, 3, 4, 5, 6]
list_a * 3 = [1, 2, 3, 1, 2, 3, 1, 2, 3]
"""

# 함수
print("# 길이 구하기")
print("len(list_a) =", len(list_a))
"""
# 길이 구하기
len(list_a) = 3
"""

2) 리스트에 요소 추가하기

(1) 요소 "하나" 추가 -- append, insert

  • append() : 리스트 "뒤"에 요소 추가
  • insert() : 리스트 "특정 위치"에 요소 추가

(2) 한 번에 "여러" 요소 추가 -- extend

  • extend() : '리스트'를 매개변수로 함

'리스트 연결 연산자' VS. '요소 추가'

비파괴적 VS. 파괴적

# 리스트 연결 연산자 : + => 비파괴적
list_a = [1, 2, 3]
list_b = [4, 5, 6]
print(list_a + list_b)  # [1, 2, 3, 4, 5, 6]
print(list_a)           # [1, 2, 3]
print(list_b)           # [4, 5, 6]
# 요소 추가 : append(), insert(), extend() => 파괴적
list_a = [1, 2, 3]
list_b = [4, 5, 6]
list_a.extend(list_b)
print(list_a)   # [1, 2, 3, 4, 5, 6]
print(list_b)   # [4, 5, 6]

'비파괴적'인 것이 기본이다
- '원본'과 '새로운 결과' 모두 활용 가능 👉 선택지 多

BUT 파이썬 : 원본을 직접적으로 조작하는 기능 제공
- '리스트'는 용량이 매우 클 수 있는 가능성이 있기에 '원본'과 '새로운 결과', 두 가지로 생성하는 것은 위험하기 때문이다.

3) 리스트에 요소 제거하기

(1) '인덱스'로 제거 -- del, pop

  • del 키워드 : "범위"를 지정해 리스트의 요소를 한꺼번에 제거 가능
  • pop() : 매개변수 입력 않을 시 '마지막 요소'(인덱스 -1) 제거
list_a = [0, 1, 2, 3, 4, 5]
print("# 리스트의 요소 하나 제거하기")

# 제거 방법[1] - del 키워드
del list_a[1]
print("del list_a[1] :", list_a)    # [0, 2, 3, 4, 5]

# 제거 방법[2] - pop()
list_a.pop(2)
print("pop(2) :", list_a)           # [0, 2, 4, 5]

list_a.pop()
print("pop() :", list_a)            # [0, 2, 4]
# del 키워드 - 범위 지정
list_b = [0, 1, 2, 3, 4, 5, 6]
del list_b[3:6]
print(list_b)                       # [0, 1, 2, 6]

list_c = [0, 1, 2, 3, 4, 5, 6]
del list_c[:3]
print(list_c)                       # [3, 4, 5, 6]

list_d = [0, 1, 2, 3, 4, 5, 6]
del list_d[3:]
print(list_d)                       # [0, 1, 2]

(2) '값'으로 제거 -- remove

  • remove() : 가장 앞쪽에 있어 먼저 발견되는 "하나"만 제거
list_c = [1, 2, 1, 2]
list_c.remove(2)
print(list_c)   # [1, 1, 2]

(+) '모두' 제거 -- clear

  • clear() : general한 용어임
    ; 웹 개발, 인공지능 개발, 리스트, 딕셔너리 등등에서 "모두 제거" 의미

4) 리스트 내부에 값 有/無

in / not in 연산자

list_a = [273, 32, 103, 57, 52]
print(57 in list_a)     # True
print(99 not in list_a) # True

2. 딕셔너리 ; { 키 : 값 }

딕셔너리 VS. 리스트

  • 리스트 : "인덱스"를 기반으로 값 저장
  • 딕셔너리 : "키"를 기반으로 값 저장

A. 딕셔너리 선언 및 요소 접근

# 딕셔너리 선언
dictionary = {
    "name" : "7D 건조 당고",
    "type" : "당절임",
    "ingredient" : ["망고", "설탕", "메타중아황산나트륨", "치자황색소"],
    "origin" : "필리핀"
}

# 딕셔너리 요소 접근
print("name :", dictionary["name"])                 # name : 7D 건조 당고
print("type :", dictionary["type"])                 # type : 당절임
print("ingredient :", dictionary["ingredient"])     # ingredient : ['망고', '설탕', '메타중아황산나트륨', '치자황색소']
print("origin :", dictionary["origin"])             # origin : 필리핀
print()


# 값 변경
dictionary["name"] = "8D 건조 망고"
print("name :", dictionary["name"])                 # name : 8D 건조 망고

# 값 - '리스트'
print(dictionary["ingredient"][1])                  # 설탕

B. 딕셔너리에서의 NameError 예외

키를 '문자열'로 사용할 때는 반드시 따옴표("") 붙여줄 것

dict_key = {
    name : "7D 건조 망고",  # "name"이 아닌 name으로 쓰면 name이라는 "변수"로 인식함
    type : "당절임"         # "type"이 아닌 "type() 함수"로 인식함
}

'''
Traceback (most recent call last):
  File "d:\Workspace\python_hongong\nameError.py", line 2, in <module>
    name : "7D 건조 망고",
NameError: name 'name' is not defined
'''

C. 딕셔너리에서의 KeyError 예외

딕셔너리에서의 KeyError 예외
: 존재하지 않는 키에 접근할 때 발생

1) 딕셔너리에 값 추가하기/제거하기

(1) 추가 -- dictionary[키] = 값

# 딕셔너리에 요소 '추가'하기

# 딕셔너리 선언
dictionary = {}

# 출력 - before
print("요소 추가 이전: ", dictionary)

# 딕셔너리 요소 '추가'
dictionary["name"] = "새로운 이름"
dictionary["head"] = "새로운 정신"
dictionary["body"] = "새로운 몸"

# 출력 - after
print("요소 추가 이후 : ", dictionary)

(2) 제거 -- del

# 딕셔너리에 요소 '제거'하기

# 딕셔너리 선언
dictionary = {
    "name" : "7D 건조 망고",
    "type" : "당절임"
}

# 출력 - before
print("요소 제거 이전 : ", dictionary)

# 딕셔너리 요소 '제거'
del dictionary["name"], dictionary["type"]
#del dictionary["name"]
#del dictionary["type"]

# 출력 - after
print("요소 제거 이후 : ", dictionary)

2) 딕셔너리 내부에 키 有/無

  • 목적
    : 존재하지 않는 키에 접근한 경우에 KeyError 예외를 발생시키지 않고 처리하기 위함

(1) in 키워드

# 키가 존재하는지 확인 -> 값에 접근

# 딕셔너리 선언
dictionary = {
    "name" : "7D 건조 망고",
    "type" : "당절임",
    "ingredient" : ["망고", "설탕", "메타중아황산나트륨", "치자황색소"],
    "origin" : "필리핀"
}

# 사용자로부터 입력 받기
key = input("> 접근하고자 하는 키 : ")

# 딕셔너리 내부에 키 유무 판별 - 키워드 'in' 사용
if key in dictionary :
    print(dictionary[key])
else :
    print("존재하지 않는 키에 접근하고 있습니다.")

(2) get() 함수

# get() 함수
# 키가 '존재하지 않을' 때 - KeyError를 발생시키지 않고 'None'을 출력하는지 확인하기

# 딕셔너리 선언
dictionary = {
    "name" : "7D 건조 망고",
    "type" : "당절임",
    "ingredient" : ["망고", "설탕", "메타중아황산나트륨", "치자황색소"],
    "origin" : "필리핀"
}

# 존재하지 '않는' 키에 접근
value = dictionary.get("존재하지 않는 키")
print("값 : ", value)

# None 확인 방법
if value == None : 
    print("존재하지 않는 키에 접근했었습니다.")

3. 범위 자료형 ; range()

A. 범위의 매개변수

■ 매개변수 1개

■ 매개변수 2개

■ 매개변수 3개

추가 미션

p.157쪽의 1번 문제의 답 쓰고 인증샷

a. 인증샷

b. 코드

# 리스트(list)

list_a = [0, 1, 2, 3, 4, 5, 6, 7]
list_a.extend(list_a)   # extend() : 한 번에 '여러' 요소 추가
print("extend():", list_a)
'''
extend(): [0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7]
'''

list_a = [0, 1, 2, 3, 4, 5, 6, 7]
list_a.append(10)   # append() : 요소 '하나' 추가 - 리스트 '뒤쪽'에
print("append():", list_a)
'''
append(): [0, 1, 2, 3, 4, 5, 6, 7, 10]
'''

list_a = [0, 1, 2, 3, 4, 5, 6, 7]
list_a.insert(3, 0) # insert() : 요소 '하나' 추가 - 리스트 '특정 위치'에
print("insert():", list_a)
'''
insert(): [0, 1, 2, 0, 3, 4, 5, 6, 7]
'''

list_a = [0, 1, 2, 3, 4, 5, 6, 7]
list_a.remove(3)    # remove() : '값'으로 제거하기
print("remove():", list_a)
'''
remove(): [0, 1, 2, 4, 5, 6, 7]
'''

list_a = [0, 1, 2, 3, 4, 5, 6, 7]
list_a.pop(3)   # pop() : '인덱스'로 제거하기 (del 키워드와 동일)
print("pop():", list_a)
'''
pop(): [0, 1, 2, 4, 5, 6, 7]
'''

list_a = [0, 1, 2, 3, 4, 5, 6, 7]
list_a.clear()  # clear() : 모두 제거하기
print("clear():", list_a)
'''
clear(): []
'''

정리

Chapter 04의 단원명은 '반복문'이다.
즉, 위에서 정리한 리스트, 딕셔너리, range() 개념 모두 '반복문'에서 주로 사용되는 개념들임을 잘 알아두고 나중에 실제로 써먹어보자.

파이썬을 되게 애매하게 공부했을 때는 리스트랑 딕셔너리 중에 뭐가 대괄호([])이고, 뭐가 중괄호({})로 묶어야 하는지 은근 헷갈렸는데,
제대로 공부해보니까 이거 뭐 헷갈릴 것도 아니었다 ㅋㅋㅋ

이번에는 어우 정리할 게 너무 많아서 중간에 좀 지칠 뻔했는데
아무튼... 다 정리해냈네..
이렇게 열심히 정리했으니까 절대 절대 까먹지 말자!!!

profile
💻 (CSE) Computer Science and Engineering

0개의 댓글