본문 바로가기

SK네트웍스 Family AI캠프 10기/Daily 회고

3일차. 자료구조 & 제어문

더보기

 

3일 차 회고

 

아직 3일 차라서 그런지 마음이 붕 뜬 느낌이다. 내가 이쪽 분야에 발을 들이게 된 것도 엄청난 꿈이 있는 것도 아니고 단순한 흥미 때문인데 내가 주체적으로 강의에 집중할 수 있을지를 모르겠다. 그래도 열심히 해서 굳이 AI가 아니더라도 데이터 직무 쪽으로 취직을 하고 싶다는 생각이 있어서 일단은 열심히 듣고 강의를 듣다가 또 흥미가 생기게 된다면 그쪽을 더 깊게 파봐도 괜찮을 것 같다. 일단 지금은 데이터 분석 쪽에 관심이 있어서 수업이 모두 끝나고 강사님께 여쭤봤더니 토이 프로젝트를 하나 해보는 것도 괜찮을 것 같다고 하셔서 고민을 좀 해봐야 할 것 같다.

 

 

 

 

1. 자료구조

 

 

1-0. 가상환경 세팅

 

py -3.13 -m venv .venv # 가상환경 생성
.\.venv\Scripts\activate # 가상환경 활성화
python -m pip install --upgrade pip # pip 업그레이드
pip jupyter # jupyter 설치

 

 

1-1. 사칙연산

 

a = 3
b = 10

# 덧셈
print(a + b) # 13

# 뺄셈
print(a - b) # -7

# 곱셈
print(a * b) # 30

# 나눗셈
print(a / b) # 0.3

# 제곱
print(a ** b) # 59049

 

a = 7
a = 3

# 몫
print(a // b) # 2

# 나머지
print(a % b) # 1

 

 

1-2. 문자열

 

문자열은 " " 또는 ' '을 사용하여 코드를 작성한다.

문자열 안에 " 또는 '을 써야 하는 경우, \(escape character)을 사용하여 코드를 작성한다.

 

문자열의 길이를 출력하는 len() 함수는 size가 존재하는 데이터 타입에만 사용할 수 있다.

 

숫자는 문자열로 표현이 가능하지만, 문자열은 숫자로 표현이 불가능하다.

숫자는 str() 함수를 통해 문자열로 변환할 수 있다.

하지만, 문자열은 숫자로 이루어졌을 경우, int() 또는 float() 함수를 통해 숫자로 변환할 수 있다.

이때, 정수 문자열은 int() 함수로만, 실수 문자열은 float() 함수로만 숫자로 변환할 수 있다. 

 

 

1-3. 인덱싱

 

인덱싱은 size의 값이 존재하는 데이터 타입인 경우에만 사용이 가능하다.

# H(0), e(1), l(2), l(3), o(4)
# H(-5), e(-4), l(-3), l(-2), o(-1)

a = "Hello"

a[0], a[-5] # 둘 모두 'H'를 출력한다.

 

 

1-4. 슬라이싱

 

슬라이싱 또한 size의 값이 존재하는 데이터 타입인 경우에만 사용이 가능하다.

# H(0), e(1), l(2), l(3), o(4)
# H(-5), e(-4), l(-3), l(-2), o(-1)

a = "Hello"

a[1:], a[1::1] # 둘 모두 'ello'를 출력한다.
a[1::2] # 'el'을 출력한다.
a[-1::-1] # 'olleH'를 출력한다.
a[-1::-2] # 'olH'를 출력한다.

 

 

1-5. f-string & .format()

 

"나는 수박을 먹었습니다."
"나는 밥을 먹었습니다."
"나는 커피를 먹었습니다."

food = "수박을"
print(f"나는 {food} 먹었습니다.")

food = "밥을"
print("나는 {food} 먹었습니다.".format(food=food))

food1 = "밥을"
print("나는 {food2} 먹었습니다.".format(food2=food1))

food3 = "커피"
food4 = ", 빵"
food5 = ", 과자를"
print("나는 {0}{1}{2} 먹었습니다.".format(food3, food4, food5))

 

 

1-6. 기타 문자열 포매팅

 

%d: 숫자를 표현
print("I eat %d apples." % 3)
# I eat 3 apples.

%s: 문자열을 표현
print("I eat %s apples." % "five")
# I eat five apples.

num = 10
day = "three"
print("I ate %d apples, so I was sick for %s days." % (num, day))
# I ate 10 apples, so I was sick for three days.

pi = 3.141592
print("파이는 %0.2f" % pi)
# 파이는 3.14

 

 

1-7. 문자열 관련 함수

 

a = "Hello World"

# count(): 문자열 내 특정 문자의 개수를 반환
a.count("l") # 3
a.count("a") # 0
a.count(" ") # 1

# find(): 문자열 내 특정 문자의 위치를 반환
a.find("H") # 0
a.find("a") # 해당 문자열이 없을 경우, -1 반환

# split(): 문자열을 특정 문자 기준으로 나누어 리스트로 반환
a.split(" ") # ['Hello', 'World']
a.split("o") # ['Hell', ' W', 'rld']

# upper(): 대문자로 변환
a.upper() # 'HELLO WORLD'

# lower(): 소문자로 변환
a.lower() # 'hello world'

# strip(): 문자열 앞뒤 공백 제거
"  Hello World  ".strip() # 'Hello World'

# lstrip(): 문자열 왼쪽 공백 제거
"  Hello World  ".lstrip() # 'Hello World  '

# rstrip(): 문자열 오른쪽 공백 제거
"  Hello World  ".rstrip() # '  Hello World'

# replace(): 문자열 내 특정 문자열을 변경
a.replace("       ", "Goodjob") # 'Hello World'
a.replace("World", "Goodjob") # 'Hello Goodjob'

 

 

1-8. 문자열 연산

 

문자열끼리는 덧셈을 통해 연결할 수 있다.

a = "Hello"
b = "World"

print(a + b) # HelloWorld

 

문자열과 숫자 연산은 곱셈을 통해 반복할 수 있다.

a = "Hello"

print(a * 3) # HelloHelloHello

 

 

1-9. 리스트(List)

 

리스트의 선언은 다음과 같이 할 수 있다.

a = []
b = list()

 

리스트는 size를 갖는 데이터 타입이기 때문에 인덱싱, 슬라이싱을 할 수 있다.

x = [1, 2, 3, 4, 5] # list 선언

print(x[0]) # 1
print(x[1:3:]) # [2, 3]
print(x[-1::-2) # [5, 3, 1]

 

리스트에는 다양한 형식의 데이터가 올 수 있다.

a = [] # 리스트가 선언되었지만, 데이터는 없다.
b = [1, -2, 3.14]
c = ['a', 'b']
d = [1, 2, 'a', 'b']
e = [1, 'a', [1, 2, 3]]

 

 

리스트 안에 리스트가 있는 경우, 데이터는 다음과 같은 방법으로 출력할 수 있다.

print(e[2][2]) # 3

 

리스트는 수정이 가능(mutable)하기 때문에, 요소를 추가하거나 삭제 또는 변경할 수 있다.

# 요소의 변경

e[1] = 'b'
print(e) # [1, 'b', [1, 2, 3]]

d[2::] = [3, 4]
print(d) # [1, 2, 3, 4]

e[2][2] = 9
print(e) # [1, 'b', [1, 2, 9]]

 

# 요소의 추가
# append()
a = [1, 2, 3, 4]

a.append(5)
print(a) # [1, 2, 3, 4, 5]

# extend()
a = [1, 2, 3, 4]

a.extend([5])
print(d) # [1, 2, 3, 4, 5]

 

또한, 요소의 순서도 변경할 수 있다.

b = [1, 3, 2, 4, 5]

b.sort()
print(d) # [1, 2, 3, 4, 5]

b.reverse()
print(d) # [5, 4, 3, 2, 1]

 

리스트의 요소에 대해 조회를 하거나 개수를 구할 수 있다.

c = ['a', 'b', 'c', 'd']

c.index("b") # 1

c.count("a") # 1

 

문자열을 리스트로 변경할 수 있다.

list("10") # ['1', '0']

 

 

리스트의 길이는 len() 함수를 통해 구할 수 있다.

len(c) # 4

 

1-10. 튜플(Tuple)

 

튜플의 선언은 다음과 같이 할 수 있다.

a = ()
b = tuple()

 

튜플은 size를 갖는 데이터 타입이기 때문에 인덱싱, 슬라이싱을 할 수 있다.

x = (1, 2, 3, 4, 5) # tuple 선언

print(x[0]) # 1
print(x[1:3:]) # (2, 3)
print(x[-1::-2]) # (5, 3, 1)

 

튜플에는 다양한 형식의 데이터가 올 수 있다.

a = () # 튜플이 선언되었지만, 데이터는 없다.
b = (1,)
c = (1, 2)
d = (1, 'a', 2)
e = (1, 'a', (1, 2, 3))

 

튜플 안에 리스트가 있는 경우, 데이터는 다음과 같은 방법으로 출력할 수 있다.

print(e[2][2]) # 3

 

튜플은 수정이 불가능(immutable)하기 때문에, 요소를 추가하거나 삭제 또는 변경할 수 없다.

또한, 튜플의 요소에 대해 조회를 하거나 개수를 구할 수 있다.

a = ('a', 'b', 'c', 'd')

a.index("b") # 1

a.count("a") # 1

 

문자열을 튜플로 변경할 수 있다.

tuple("10") # ('1', '0')

 

튜플의 길이는 len() 함수를 통해 구할 수 있다.

len(a) # 4

 

 

1-11. 딕셔너리(Dictionary)

 

딕셔너리의 선언은 다음과 같이 할 수 있다.

a = {}
b = dict()

 

딕셔너리는 key와 value로 이루어져 있다.

dic = {
    "key":"value"
}

 

딕셔너리는 다양한 형식의 데이터가 올 수 있으며, 다음과 같은 방법으로 데이터를 조회할 수 있다.

또한, size를 갖는 데이터 타입이기 때문에 인덱싱, 슬라이싱을 할 수 있다.

dic = {
    "name": "홍길동",
    "age": 20,
    "phone": "010-1234-5678"
    "list": [1, 2, 3],
    "tuple": (1, 2, 3, 4),
    "dict": {
        "a": 1,
        "b": 2
    }
} # dict 선언

print(dic["list"]) # [1, 2, 3]
print(dic["phone"][-4::]) # '5678'
print(dic["dict"]["a"]) # 1

 

딕셔너리의 key 값과 value 값을 다음과 같이 조회할 수 있다.

dic.keys() # dict_keys(['name', 'age', 'phone', 'list', 'tuple', 'dict'])

dic.values() # dict_values(['홍길동', 20, '010-1234-5678', [1, 2, 3], (1, 2, 3, 4), {'a': 1, 'b': 2}])

 

이를 통해 찾고자 하는 key 값 또는 value 값이 존재하는지 확인할 수 있다.

"name" in dic.keys() # True
"aaaa" in dic.keys() # False

20 in dic.values() # True
[1, 2] in dic.values() # False

 

딕셔너리는 get() 함수를 통해 주어진 key에 따라 해당하는 값을 반환한다.

dic.get("name", "Hello World") # '홍길동'
dic.get("aaaa", "Hello World") # 'Hello World'

 

딕셔너리는 수정이 가능(mutable)하기 때문에, 요소를 추가하거나 삭제 또는 변경할 수 있다.

# 요소의 추가
dic["aaaa"] = "1111"
print(dic)
"""
dic = {
    'name': "홍길동",
    'age': 20,
    'phone': "010-1234-5678"
    'list': [1, 2, 3],
    'tuple': (1, 2, 3, 4),
    'dict': {
        "a": 1,
        "b": 2
    },
    'aaaa': '1111'
}
"""

# 요소의 변경
dic["aaaa"] = "2222"
print(dic)
"""
dic = {
    'name': "홍길동",
    'age': 20,
    'phone': "010-1234-5678"
    'list': [1, 2, 3],
    'tuple': (1, 2, 3, 4),
    'dict': {
        "a": 1,
        "b": 2
    },
    'aaaa': '2222'
}
"""

# 요소의 삭제
del dic["aaaa"]
print(dic)
"""
dic = {
    'name': "홍길동",
    'age': 20,
    'phone': "010-1234-5678"
    'list': [1, 2, 3],
    'tuple': (1, 2, 3, 4),
    'dict': {
        "a": 1,
        "b": 2
    }
}
"""

 

딕셔너리는 items() 함수를 통해 요소들을 tuple인 (key, value) 형식으로 출력할 수 있다.

dic.items()
# dict_items([('name', '홍길동'), ('age', 20), ('phone', '010-1234-5678'),
# ('list', [1, 2, 3]), ('tuple', (1, 2, 3, 4)), ('dict', {'a': 1, 'b': 2})])

 

 

1-12. 집합(Set)

 

집합의 선언은 다음과 같이 할 수 있다.

a = set()

 

집합은 중복을 허용하지 않고, 순서가 없다.

a1 = [1, 2, 3, 3, 7, 8, 9]
a2 = [0, 1, 4, 5, 6, 8, 10]

a1 = set(a1) # {1, 2, 3, 7, 8, 9}
a2 = set(a2) # {0, 1, 4, 5, 6, 8, 10}

 

집합은 다양한 연산이 가능하다.

이때, 차집합은 기준이 되는 집합에 따라 결과가 달라진다.

# 교집합
a1 & a2 # {1, 8}
a1.intersection(a2) # {1, 8}

# 합집합
a1 | a2 # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
a1.union(a2) # {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

# 차집합
a1 - a2 # {2, 3, 7, 9}
a1.difference(a2) # {2, 3, 7, 9}

a2 - a1 # {0, 4, 5, 6, 10}
a2.difference(a1) # {0, 4, 5, 6, 10}

 

 

1-13. Boolean

 

boolean 값에는 True(참)와 False(거짓)가 있다.

a = True
b = False

 

bool 연산의 결과는 다음과 같다.

True + True -> True
True + False -> False
False + True -> False
False + False -> False

 

숫자와 문자를 bool 형식으로 바꿀 수 있고, 결과는 다음과 같다.

# 숫자 -> bool
a = 0
b = 1
c = -1
d = 3.14

bool(a) # False
bool(b) # True
bool(c) # True
bool(d) # True

# 문자 -> bool
a = str()
b = ''
c = ""
d = "Hello"
e = "Hello World"

bool(a) # False
bool(b) # False
bool(c) # False
bool(d) # True
bool(e) # True

 

 

 

2.  제어문

 

 

2-1. 조건문(if ~ else)

 

조건문은 조건이 True(참)일 경우에 실행한다.

if True:
    print("Hello World")
# Hello World

if False:
    print("Hello World")
#

 

조건이 True인 경우와 False인 경우로 나눌 때는 if ~ else를 사용한다.

if True:
    print("Hello World")
else:
    print("Good job")

 

조건을 여러 가지로 나누고 싶을 경우 if ~ elif ~ else를 사용한다.

"""
- 20대인 경우, "20대"
- 30대인 경우, "30대"
- 40대 이상인 경우, "40대 이상"
- 그 외인 경우, "미성년자"
"""

age = 35

if age >= 40:
    print("40대 이상")
elif age >= 30:
    print("30대")
elif age >= 20:
    print("20대")
else:
    print("미성년자")
    
# 30대

 

x의 type에 따라 결과가 달라지는 코드는 다음과 같이 작성할 수 있다.

이때, type() 함수 외에도 isinstance() 함수를 사용할 수 있다.

x = 10

# type() 함수
if type(x) == int:
    print("Hi")
elif type(x) == str:
    print("Good")
else:
    print("Hello")

# isinstance() 함수
if isinstance(x, int):
    print("Hi")
elif isinstance(x, str):
    print("Good")
else:
    print("Hello")

 

 

2-2. 반복문(for)

 

반복문은 반복적인 작업을 해야 할 때 효율적으로 코드를 작성할 수 있게 한다.

a = [1, 2, 3, 4, 5]

for i in a:
    print(i)

"""
1
2
3
4
5
"""

 

전에 구현했던 구구단도 반복문을 통해 효율적으로 구현할 수 있다.

num = 2

for i in [1, 2, 3, 4, 5]:
    print(f"{num} * {i} = {num * i}")

"""
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
"""

 

for문에서는 다양한 자료형을 변수로 받을 수 있다.

# list

lst = [
    {
        "name": "홍길동",
        "age": 20
    },
    {
        "name": "신사임당",
        "age": 30
    }
]

for i in lst:
print(i)

"""
{'name': '홍길동', 'age': 20}
{'name': '신사임당', 'age': 30}
"""

for i in lst:
    print(f"이름은 {i['name']}이고, 나이는 {i['age']}입니다.")

"""
이름은 홍길동이고, 나이는 20입니다.
이름은 신사임당이고, 나이는 30입니다.
"""
# dict

dic = {
    "name": "홍길동",
    "age": 20,
    "phone": "010-1234-5678"
}

for i in dic: # for i in dic.keys()
    print(i)

"""
name
age
phone
"""

for i in dic.values():
    print(i)

"""
홍길동
20
010-1234-5678
"""

for i in dic.items():
    print(i)

"""
('name', '홍길동')
('age', 20)
('phone', '010-1234-5678')
"""

 

리스트에 요소를 삽입할 때도 반복문을 통해 효율적으로 구현할 수 있다

lst = []
for i in [1, 2, 3, 4, 5]:
    lst.append(i)
print(lst) # [1, 2, 3, 4, 5]

lst = [
    i for i in [1, 2, 3, 4, 5]
]
print(lst) # [1, 2, 3, 4, 5]

 

리스트는 단순 요소만 저장되어 있기 때문에, 인덱스도 같이 출력하고 싶을 때는 enumerate() 함수를 사용한다.

lst = ['a', 'b', 'c', 'd']

for item in enumerate(lst):
    print(item)

"""
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
"""

for idx, val in enumerate(lst):
    print(idx, val)

"""
0 a
1 b
2 c
3 d
"""

.

for문이 정상적으로 완료되었는지 확인하기 위해서는 else를 사용할 수 있다.

lst = [1, 2, 3, 4, 5]

for i in lst:
    if i % 2 == 0
        print(f"{i}는 짝수입니다.")
else:
    print("Hello World")

 

 

2-3. break

 

break를 통해 반복문을 멈추고 빠져나올 수 있다. 

for i in [1, 2, 3, 4, 5]:
    if i not in [1, 2]:
        break
    print(i)

"""
1
2
"""

 

 

2-4. continue

 

continue를 통해 아래의 코드를 생략하고 다음 반복문을 진행한다.

for i in [1, 2, 3, 4, 5]:
    if i in [1, 2]:
        continue
    print(i)

"""
3
4
5
"""

 

 

2-5. pass

 

pass는 아직 기능을 구현하지 못했을 때 사용할 수 있다.

for i in [1, 2, 3, 4, 5]:
    if i in [1, 2]:
        pass
    print(i)

"""
1
2
3
4
5
"""