Data_10기

Python 라이브 세션 2,3회차

senu 2025. 11. 5. 17:32
########################################################################
# 오전세션_이론
########################################################################

# day1: 변수, ㅔ이터 타입, 간단한 함수, 문자열 다루기
# day2: 자료구조 (list, tuple, dictionary)

# 테이터 형식
a = 10
b = "abc"
b[0]
c = 3.14
d = True
e = None

# LIST
# [] 대괄호로 표현을 할 수 있음
# 순서가 있는 자료 구조.

l = [1, 2, 3, 4, 5]
ages = [10, 23, 40, 32]
age1 = ages[0]   # 인덱싱
age2 = ages[1]   # 인덱싱
age4 = ages[-1]   # 인덱싱
age1_age2 = ages[0:2]   # 슬라이싱 시작숫자:끝숫자의 인덱스번호+1
age3_age4 = ages[2:4]

# 리스트에서 자주 사용하는 함수들
# 1) append: 마지막에 하나의 요소를 추가 (마지막이라고 위치가 정해져 있음.)
ages.append(60)
print(ages)

# 2) insert: 순서를 지정해서 넣어줄 수 있음 (특정 인덱스 위치에 하나의 요소를 추가)
ages.insert(1, 15)   # 1: 인덱스 번호. 즉, 2번 째 자리에 15(요소)를 추가.
print(ages)

# 3) remove: 특정 값을 지우는 함수
# 인덱스 위치로 필요한(제거하고자 하는) 요소를 찾는게 아니라 값으로 찾는것.
ages.remove(60)
print(ages)

ages2 = [10, 15, 23, 60, 40, 32, 60]
ages2.remove(60)   # 함수는 앞에서 먼저 만나는거에 대해서 작동함.
print(ages2)   # [10, 15, 23, 40, 32, 60]
# 특정값을 지울 떄, 값이 여러 개일 경우, 제일 처음 만나는 값을 지움

# 4) pop: 마지막 요소 하나를 꺼내기
last_age = ages.pop()   # 위치가 정해져있는 값을 꺼내기 때문에 괄호 안에 아무것도 적지 않아도 됨
print(ages)
print(last_age)

# pop 사용 예시
# 3명의 나이가 적힌 종이 [20, 10, 30]
# 나이가 많은 순서대로 10살씩 더해서 출력
# 풀이
# 1. 순서대로 정렬함 [10, 20, 30]
# 2. pop 30 + 10, pop 20 + 10, pop 10 + 10

# 5) sort: 오름차순 정렬
# 어떤 값을 함수에 줄 필요 없음. 위치나 값이 필요 없음.
ages.sort()
print(ages)

# 문자열 리스트 => 알파벳 순서
list1 = ['a', 'd', 'b', 'g', 'e', 'i']
list1.sort()
print(list1)


# Tuple 튜플
# 튜플은 변경이 불가능한 리스트.
# 소괄호로 선언하고 주로 데이터 보호 목적에서 사용됨.
# 그래서 정렬도 안 됨. but 리스트 안에 튜플이 요소로 있으면 정렬 가능.
seoul = (37.5665, 126.9789)   # 좌표값 같은거 쓸 때 튜플 사용함



# Dictionary 딕셔너리
# {} 중괄호로 선언
# key(키) - value(값)
# list, tuple은 값에 접근하기 위해 인덱스(위치)가 중요했는데
# 얘는 값에 접근하기 위해 key가 중요하기 때문에 key가 중요함.
student = {
    "name":"Hannah",
    "age":25,
    "major":"Data Science"
}

b = student["name"]   # key가 위치가 됨. 인덱스 안됨. 그래서 위치보다 key값들이 중요해짐.
print(b)

# keys: 키값을 다 가져오기
student.keys()

# valuses: 값들을 다 가져오기
student.values()

# items: 키, 값 모두 가져오기
student.items()

# # 없는 키 접근할 때
# cls = student["class"]
# print(cls)

#Traceback (most recent call last):
#  File "C:\Users\puppk\Desktop\내배캠\python_study\day2.py", line 91, in <module>
#    cls = student["class"]
#          ~~~~~~~^^^^^^^^^
#KeyError: 'class'
# 이런 오류 나면 코드 멈춰지니까 get으로 확인할 수 있음. ↓↓↓

# class라는 키 찾고 싶을 때
cls_get = student.get("class")
print(cls_get)   # None (없는 키 접근할 때 None; class에 대한 값이 없음)

# Dictionary에서 pop하는 경우 즉, 특정 키에 대한 값을 가져올 경우,
# pop(키)


# 리스트 안에 딕셔너리
# 리스트로 순서를 주고, 딕셔너리로 정체로 알려준다.
students = [
    {"name": "Hannah", "age": 25, "score": 90},
    {"name": "Minji", "age": 21, "score": 85},
    {"name": "Yumi", "age": 23, "score": 95}
]


# 미니퀴즈
# Q1. 리스트





########################################################################
# 오후세션_실습
########################################################################

# 변수를 쓰는 이유: 재사용하기 위해, 중간중간 결과를 저장하고 가능.
# 문법은 이걸 왜 사용하는지를 알고 있으면 금방 외울 수 있음.
# 리스트는 같은 성질을 묶어줄 때 사용.
# 값을 []에 넣어주는데 순서가 정해져있음 => 인덱싱하는 방법은 문자열과 같음

# List 활용
# 점수 평균 구하기
scores = [90, 85, 77, 95, 88]
sum_scores = scores[0] + scores[1] + scores[2] + scores[3] + scores[4]
length_scores = 5

m = sum_scores / length_scores

# 내장함수 사용하기
sum_scores2 = sum(scores)
length_scores2 = len(scores)

m2 = sum_scores2 / length_scores2

# max(), min(): 리스트 안에 최대값, 최소값을 출력해주는 함수
max_score = max(scores)
min_score = min(scores)

# 리스트의 구조를 보고 값에 접근하는 방법을 배웠지만, 함수를 사용해서 접근하는 방법도 중요함.



# Tuple 활용
coord = {37.5665, 126.9789}
coord_1 = coord[0]   
coord_2 = coord[1]   # 이런식으로 튜플 값에 접근 가능

# 첫 번쨰 학생의 성적 수정하는 경우,
first_stu = scores[0]
print(first_stu)
scores[0] = 91
print(scores)




# Dictionary 활용
# key가 중요. 순서가 중요하지 않음.
# 값 변경 가능
student = {
    "name": "Hannah",
    "age": 25,
    "major": "Data Science"
}

name = student["name"]




# 정리
# list, tuple, dictionary는 많은 데이터를 다루기 위해 사용
# list를 가장 많이 사용하는데 그 이유는 인덱싱, 슬라이싱 가능하고, 수정 가능하기 때문
# list에서 자주 사용하는 함수: append, insert, sort, remove, pop, get, sum, len, max, min 등 
# list와 tuple의 차이점: 수정가능 유무, tuple이 속도가 좀 더 빠름, tuple으니 위도경도같은 고정된(불변의)값을 보호하고 싶을 때 사용
# dictionary는 값에 정체성을 부여(태그)하기 위해 사용 (=> 키)
# list와 dict를 같이 사용하기도 함. 이때, 리스트로 순서를 줄 수 있고, 딕셔너리로 값에 정체성을 부여할 수 있다는 장점이 있음
# 뭐 실습이라고 하기 보다는 그냥 정리 시간이네 좋아 이것도.
# list: [] / tuple: () / dictionary: {}

 

########################################################################
# 오전세션_이론
########################################################################

# 흐름과 제어: 프로그램은 위에서부터 내려옴
# 조건문, 반복문, 둘의 결합

#=======================================================================
# 조건문: IF문
#=======================================================================
'''
if: 만약에~

if 조건식:
    (true) 실행문1("짝수입니다")
elif 다른 조건식:
    (1 -> false)
    (true) 실행문2("홀수입니다")
else:   # else에는 아무 조건을 적어주지 않음. 위에서 조건 주고 남은 나머지에 해당하는 내용이기 때문.
    0이나 문자열 ("짝수도 홀수도 아닙니다.")
'''

'''
# if와  else는 이 구문에서 한 번만 사용가능
# 그러나 elif는 여러번 사용해서 조건을 여러개 줄 수 있음

if 오늘이 월요일:
    (true) 월요일입니다
elif 오늘 화요일:
    (true) 화요일입니다
elif 오늘 수요일:
    (true) 수요일입니다
elif 오늘 목요일:
    (true) 목요일입니다
elif 오늘 금요일:
    (true) 금요일입니다
elif 오늘 토요일:
    (true) 토요일입니다
else:
    일요일입니다
'''


## 실습1)
# 홀수 짝수 판별 -> 조건 줄 때 짝수를 먼저 주는게 좋긴함
# if 홀수:
#   true "홀수입니다"
# elif 짝수:
#   true "짝수입니다"
# else:
#   "홀수도 짝수도 아닙니다"

# 조건에서 먼저 걸리는게 많은걸 위에 적어주는게 좋음
# 0을 거르고 싶으면 중간에 조건을 넣기보단 아래에 넣어주는게 더 효율적임
# 짝수 - 홀수 - 0 이런식으로 필터링 해주는게 좋음

num = int(input())

if num % 2 == 0:
    print("짝수입니다.")
elif num % 2 != 0:
    print("홀수입니다.")
else:
    print("짝수도 홀수도 아닙니다.")


#=======================================================================
# 반복문: FOR문, WHILE문
#=======================================================================
# 같은 동작을 여러번 해야할 때 사용하는 구문
# python에서 반복문을 나타내는 구문: FOR, WHiLE
# -> 따라서 자료구조와 연결시켜서 생각해볼 수 있어야 함

# 문법 구조
'''
for 변수 in 반복할 대상:
    반복할 내용
'''

# 1) 리스트 순회
# for ... in
fruits = ["사과", "바나나", "딸기"]

for fruit in fruits:
    print(fruit)   # 반복문에서 리스트의 값들을 fruit이라는 변수에 담아줬으니까, 리스트명을 print 안에 적어줄 필요 없음
# 1st 순회: fruit = fruits[0] = 사과
# 2nd 순회: fruit = fruits[1] = 바나나
# 3rd 순회: fruit = fruits[2] = 딸기


# for ... in range(1, n+1):
# range는 범위를 나타냄 -> 따라서 이때부터는 위치값(인덱스값)이 필요해짐
# 횟수까지 고려 -> 몇 번할지, 몇 번 순회를 돌지까지
for i in range(2,6):
    print(i)

n = int(input("N을 입력해주세요."))
total = 0

for i in range(1, 6):
    total = total + i   # total += i (같은 의미)  # total+1=total 이렇게 순서 바뀌면 의미 달라짐;
    print(total)
print(total)
# i = 1 -> total + 1 = 1
# i = 2 -> total + 2 = 3
# i = 3 -> total + 3 = 6

# 들여쓰기 잘못하면 선언 자체가 안 될 수도 있어서 들여쓰기 잘 해줘야함


# for -> 순회할 공간, 횟수를 지정해주는 반복문
# while -> 순회할 공간은 있는데 횟수를 지정해줄 수 없을 때 즉, 어떤 특정 조건에서 동작하게해주는 반복문
# while은 조건이 만족할 때까지 순회를 함
# while은 false가 되었을 때 반복 종료
'''
[1,3,5,7,8]   # 7까지 돌고 8앞에서 멈춤
while 조건식:
    실행문

특정 조건에서만 동작하게 하는 반복문
조건을 잘못 작성하면 영원히 끝나지 않는 반복문이 되어 버림. 조건 잘 써줘야 함.
'''

n = 5
while n > 0:   # n이 0보다 클 때(까지)
    print(n)
    n -= 1

print("발사!")


# 반복문 순회 과정 손으로 작성해보기
# if문, for문(for in, for in range), while문
# 손으로 적기










########################################################################
# 오후세션_실습
########################################################################
# if, for, while은 손코딩만큼 효과 좋은거 없음

# for
# for 변수 in 반복할 대상:   -> 변수(반복할 때마다 새로운 값이 들어가는 것) / 반복할 횟수가 정해져 있음. 대상이 가진 크기만큼 반복 가능. /  개체를 정해서 반복하는 것.
#     실행문
fruits = ["사과", "바나나", "딸기"]
for fruit in fruits:
    print(fruit)

# 반복할 대상 -> 순환 가능한 객체(iterable)
# str "pythohn" 이런 문자열도 인덱싱 가능하기 때문에, 반복할 대상에 들어갈 수 있음
# tuple (10, 20)  : 얘도,
# dic {"a":"b"} : 얘도 반복할 대상 가능
# set {1, 2, 3} : set은 중복을 허용..? 쨌든 이런것도 있는데 얘도 반복할 대상 가능
# 반복할 대상에 들어갈 수 없는 것 -> int, float, bool (여러개가 있어야 함 이렇게 한 개 덜렁 있는 건 안됨)

# for 변수 in range(시작값, 끝값+1):   -> 변수 시작값 ~ 끝값까지 범위를 만들어 주는 것 / 횟수 중심으로 반복을 정해주는 구문임
#     실행문
for i in range(1, 6):   # 5까지 반복하고 싶으면 5+1해서 6 적어줘야 됨
    print(i)

total = 0
for i in range(1, 6):
    total += i   # i는 for문 안에서만 사용하는 변수. 블럭 단위로 작성 필수. 반복시키고 싶은거면 for문 안에, 고정된 값을 지정해주고 싶으면 for문 위에, 바깥에 작성하는 것이 좋음.

# while
# while 조건식:   # 횟수를 정하고 싶지 않을 때 -> 조건에 따라 반복문을 실행하고 싶을 때 사용하는 반복문
#     실행문
n = 5
while n > 0:   # while은 조건이 만족할 때까지 -> 종료될 때까지 돌아감
    print(n)
    n -= 1   # n = n-1 (같은 의미)


scores = [88, 95, 67, 70, 100]

for s in scores:
    if s >= 80:
        print(f"{s}점 → 합격")
    else:
        print(f"{s}점 → 불합격")
# ⅰ) s = 88 -> 88>=100: true -> 합격
# ⅱ) s = 95 -> 95>=100: true -> 합격
# ⅲ) s = 67 -> 67>=100: false -> 합격
# ⅳ) s = 70 -> 70>=100: false -> 합격
# ⅴ) s = 100 -> 100>=100: true -> 합격



#=======================================================================
# 반복문 흐름 제어 구문: break, continue
#=======================================================================
# break: 즉시 멈춘다; 조건 만나면 for문 끝내라
# continue: 일단 넘어간다; 조건을 만나면 넘기고 다시 for문으로 올라가라

for i in range(1, 10):   # i 1 ~ 9
    if i == 5:   # 5 나오면
        break   # 그냥 끝내주세요
    print(i)
# ⅰ) i=1 -> print: 1
# ⅱ) i=2 -> print: 2
# ⅲ) i=3 -> print: 3
# ⅳ) i=4 -> print: 4
# ⅴ) i=5 -> 반복문 종료
# 참고로 break는 while문에서 자주 쓰임


### break
# 1, 2, 3, 4, 5, ...
# 5를 만나면 반복문을 종료하고 싶을 때
count = 1
while True:   # 간편해서 많이 쓰이나 잘못쓰면 무한루프 에러에 빠질 수 있다.
    if count == 5:
        print("5에 도달했습니다.")
        break
    count += 1

# if 문 안에 print가 있으면 ..? print가 break 안에 있는지 밖에 있는지 구분할 줄 알아야 함.



### continue
# 이번만 건너뛰기
for i in range(1, 6):
    if i % 2 == 0:
        continue   # continue는 for랑 짝꿍. continue: 조건을 만나면 무시하고 다시 for로 올라가라.
    print(i)
# print 결과
# 1
# 3
# 5

# 반복 횟수: 5 (range(1, 6))
# i 만큼 '*'

for i in range(1, 6):
    print('*' * 1)
# *
# **
# ***
# ****
# *****

# 반대 별찍기 과제
#     *
#    **
#   ***
#  ****
# *****