오후 수업

개요

  • 목적: 9월 25일자 수업을 이해하자
  • 범위: 파이썬 기본문법

🎯 목표 (Milestones)

  • M1: 파이썬 기본 문법을 복습하자.

아키텍처 & 구성

  • 구성: boolean~

작업 목록 (Tasks)

boolean

a = 3 > 1
print(a)
b = 1 < 3
print(b)

이걸 출력하면 값은 True가 나올것이다.

a = 10 == 10  
b = 10 != 5  
print(a)  
print(b)

여기서
==!=은 각각 같은지의 연산자 틀린지의 연산자로 이해하면 될듯하다.

즉 출력 결과는 둘다 True이다.

그럼 다음 코드를 봐보자

a = 'Python' == 'Python'  
b = 'Python' == 'python'  
c = 'Python' != 'Python'  
print(a)  
print(b)  
print(c)

대소문자 구별 및 연산자로 해석및 실행해보면

True
False
False
가 출력될것이다.

다음으로

a = True and True     # → True
b = True and False    # → False
c = False and True    # → False
d = False and False   # → False

이것과

a = True or True    # → True
b = True or False   # → True
c = False or True   # → True
d = False or False  # → False

이것인데 and는 양쪽이 모두 True일때만 True, 하나라도 False면 False다.
or은 둘중 하나라도 True면 결과가 True이다.

강사님이 문제 내셨는데 and내셨는데 or 페이지 보고 답 내놓아서 쪽 당했다.

리스트

arr = [273, 32, 103, "string", "문자열", True, False]

위에는 리스트다.

print(type(“string”)): ?
print(type(True)): ?
print(arr[0]): ?

출력값은 뭘까?

str
bool
273

이런식으로 출력될것이다.

list = [True, “AAA”, 333]  
list[0] => True 
list[1] => “AAA” 
list[2] => 333 
list[-1] => ???

마지막은 답이뭘까??

333이 출력된다.

왜그럴까?

이런식으로 처리되기 때문이다.

예외 처리

list_a = [True, "AAA", 333]  
  
try:  
    print(list_a[3])  
    print("CHK")  
except Exception as e:  
    print(e)  
      
print("AAAAAAAAAAAAA")
try:  
    print(list_a[3])  
    print("CHK")  
except Exception as e:  
    print(e)  

여기만 주석처리후 print(list_a[3])을 입력후 실행하면 에러가 나서 실행조차 안된다.

하지만 예외처리인 위 코드를 적어 놓는다면
오류가 나도 끝까지 실행이 된다.

![[스크린샷 2025-09-25 오후 3.20.04.png]]
이건 오늘 처음 본거라 신기하다!!

또하나 배워간다! 아주 좋다.
이따 추가로 더 작성해보아야겠다.

append, insert

둘다 추가하는 기능이다.

각각 예제코드를 보면

list_a = [1, 2, 3]
print(list_a)
list_a.append(4)
print(list_a)
list_a.append(1)
print(list_a)

출력결과는

[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 1]

이다!

insert 예제를 봐보자

list_a = [1, 2, 3]

print(list_a)

list_a.insert(0, 10)

print(list_a)

list_a.insert(3, 5)

print(list_a)

출력값은

[1, 2, 3] 
[10, 1, 2, 3] 
[10, 1, 2, 5, 3]

으로 출력될것이고 리스트도 합칠수도 있다.

지우는 기능?

list_1 = [0, 1, 2, 5, 9, 10]
del list_1[1]
print(list_1)
del list_1[3] 
print(list_1)

==인덱스의 저 번호의 것을 지운다.==

즉 출력결과를 보면

[0, 2, 5, 9, 10]
[0, 2, 5, 10]

이렇게 출력될것이고

remove에 대해 알아보자면 그 인덱스 번호가 아닌 그 특정한 값을 지운다.

list_c = [1, 2, 5, 5]
list_c.remove(1)
print(list_c)
list_c.remove(5)
print(list_c)

출력결과는 어떻게 될까? 5가 전부 지워질까?

[2, 5, 5]
[2, 5]

앞에서 부터 순차적으로 지워진것을 확인 가능하다.

value in/not in

list_e = [3, 5, 99, -1, 0]
status = 3 in list_e
print(status)
status = -3 in list_e
print(status)

저 값이 리스트 안에 있는지 확인하는 기능

출력결과

True
False

반대로 not in은

list_e = [3, 5, 99, -1, 0]
status = 3 not in list_e
print(status)
status = -3 not in list_e
print(status)

출력결과

False
True

이런식으로 나오겠다.

딕셔너리

student = ["kim", 98, 50, 60]

student_dict = {'name': "kim",'kor': 98, "math": 50, "eng": 60}

이렇게 사전?처럼 저장 가능하다.

student_dict['name'] = "lee"
student_dict['kor'] = 0
print(student_dict)

위코드를 넣어서 수정또한 가능하다.

딕셔너리 추가하기

dict = {"aaa": "bbb", "b": 3, "c":True}
print(dict)
dict["zx"] = -3
print(dict)

딕셔너리 삭제하기

dict = {"name": "test", "type": "none"}
print(dict)
del dict ["name" ]
print(dict)

위처럼 del을 이용해 name을 삭제도 가능하다.

dict.get()

dict = {"name": "test"}
value = dict.get("aa")
print(value)
if value == None:
	print("value None")

출력결과는

None
value None

이런식으로 출력되는데

존재하지 않는 키값을 지정해도 None이라 출력되는걸 볼수있다.

집합

s1 = set([1, 2, 3])
s2 = set("Hello")
print(s1)
print(s2)

특징으로는 중복허용x, 순서를 신경쓰지 않는다는 것이다.

{1, 2, 3}
{'o', 'e', 'l', 'H'}

그러므로 이런식으로 출력되는걸 확인 가능하다.

add

집합에 원소를 추가한다.

x = set(["aaa", "bbb", "ccc"])
print(x)
x.add("aaa")
print(x)

차피 출력값은

{'ccc', 'aaa', 'bbb'}

이걸로 동일할것이다. 같은 원소가 있기때문에

remove

x = set(["aaa", "bbb", "ccc"])
print(x)
x.remove("aaa")
print(x)

이 출력값을 봐보자

{'bbb', 'ccc', 'aaa'}
{'bbb', 'ccc'}

이렇게 'aaa'가 삭제된것을 볼수있다.

clear

x = set(["aaa", "bbb", "ccc"])
print(x)
x.clear()
print(x)

모든요소를 지우는 함수이다.

출력값은

{'aaa', 'ccc', 'bbb'}
set()

이렇게 비워진것을 확인가능하다.

튜플

==안에 저장된 요소를 변경, 추가, 삭제가 안되는 읽기 전용 자료형이다.==

변수에 값을 저장할 때 ()(괄호)로 묶어주거나 그대로 넣어주면 tuple이 된다.

a = (38, 21, 53, 62, 19)
print(a)

이런식의 예를 들수있다.

집합 예제?

![[Pasted image 20250925161429.png]]

이런 예제가 있는데 출력값은 뭘까?

정답은 x is not None이다.

clear 때문에 set()가 되는데 이건 None이 아닌 빈 set()이므로 False가 되어
X is not None이 출력된다.

합집합

s1 = {1, 2, 3, 4}
s2 = {4, 5, 6, 7} 
print(s1 | s2)
print(s1.union(s2)) #union이 합집합임

출력값은

{1, 2, 3, 4, 5, 6, 7}
{1, 2, 3, 4, 5, 6, 7}

이런식으로 출력이 되는걸 볼수있다.

차집합

s1 = {1, 2, 3, 4}
s2 = {4, 5, 6, 7}
print(s1 - s2)
print(s1.difference(s2)) #difference가 차집합

출력값은

{1, 2, 3}
{1, 2, 3}

출력값은
이렇게 4가 빠진채 나오게 된다.

교집합

s1 = {1, 2, 3, 4}
s2 = {4, 5, 6, 7}
print(s1&s2)
print(s1.intersection(s2)) #intersection이 교집합의미

출력값은

{4}
{4}

이렇게 출력된다!

튜플 리턴값 활용

def multiple_return():
	return 10, 20

tuple_data = multiple_return()
print(tuple_data[0])
print(tuple_data[1])

저렇게 함수를 정의하고 리턴값으로 받고 출력할수있다.

10
20

추가정보:
현재 이렇게 받으면 튜플로 받아지며
리스트로 받고싶으면
list_data = list(multiple_return())
이런식으로 list로 지정하여 받아주면 되겠다.

언패킹으로 또한 받을수 있는데

a, b = multiple_return() 이렇게 받으면 각각 a, b에 10, 20이 들어가겠다.

아니면 return에서 줄때 [10, 20]이렇게 주면 리턴값으로 주게된다.

연습문제

a 리스트에서 중복된 숫자들을 제거하기

a = [1, 1, 1, 5, 9, 9, 9, 3, 3]
a = [1, 1, 1, 5, 9, 9, 9, 3, 3]
print(list(set(a)))

이렇게 간단하게 형을 바꾸어서 출력하면된다.
a는 대괄호로 출력되기 때문에 set으로 먼저 바꿔주고 list로 바꿔주면 되는 그런느낌? 이다.

두번째 답안도 있는데

a = [1, 1, 1, 5, 9, 9, 9, 3, 3]

b = []
for value in a:
	if value not in b:
		b.append(value)
	else:
		print("이미 값이 있습니다.", value)
		
print(b)
		

이런식으로도 답안을 작성 가능하다.

문자열 총정리


# 1. count() - 특정 문자열이 몇 번 나타나는지 세기
print("=== 1. count() 메서드 ===")
text = "안녕하세요 안녕하세요 반가워요 안녕하세요"
print(f"원본 텍스트: '{text}'")
print(f"'안녕하세요' 개수: {text.count('안녕하세요')}")  # 3
print(f"'안녕' 개수: {text.count('안녕')}")  # 3
print(f"'하세요' 개수: {text.count('하세요')}")  # 3
print(f"'없는문자' 개수: {text.count('없는문자')}")  # 0

# 영어 예제
english = "Hello world! Hello Python! Hello everyone!"
print(f"\n영어 예제: '{english}'")
print(f"'Hello' 개수: {english.count('Hello')}")  # 3
print(f"'l' 개수: {english.count('l')}")  # 6
print(f"'!' 개수: {english.count('!')}")  # 3

print("\n" + "="*50 + "\n")

# 2. find() - 특정 문자열의 첫 번째 위치 찾기 (못 찾으면 -1)
print("=== 2. find() 메서드 ===")
sentence = "파이썬은 정말 재미있어요! 파이썬 최고!"
print(f"원본 문장: '{sentence}'")
print(f"'파이썬' 첫 번째 위치: {sentence.find('파이썬')}")  # 0
print(f"'재미' 위치: {sentence.find('재미')}")  # 6
print(f"'최고' 위치: {sentence.find('최고')}")  # 18
print(f"'없는단어' 위치: {sentence.find('없는단어')}")  # -1

# 시작 위치 지정해서 찾기
print(f"5번째 위치부터 '파이썬' 찾기: {sentence.find('파이썬', 5)}")  # 15

# 실용적인 예제 - 이메일에서 @ 위치 찾기
email = "user@example.com"
at_position = email.find('@')
print(f"\n이메일 '{email}'에서 '@' 위치: {at_position}")
if at_position != -1:
    username = email[:at_position]
    domain = email[at_position+1:]
    print(f"사용자명: {username}, 도메인: {domain}")

print("\n" + "="*50 + "\n")

# 3. index() - find()와 비슷하지만 못 찾으면 에러 발생
print("=== 3. index() 메서드 ===")
text = "Python Programming"
print(f"원본 텍스트: '{text}'")
print(f"'Python' 위치: {text.index('Python')}")  # 0
print(f"'Pro' 위치: {text.index('Pro')}")  # 7
print(f"'gram' 위치: {text.index('gram')}")  # 10

# find()와 index()의 차이점 보여주기
print("\n--- find() vs index() 비교 ---")
test_string = "Hello World"
print(f"find('World'): {test_string.find('World')}")  # 6
print(f"index('World'): {test_string.index('World')}")  # 6

print(f"find('없음'): {test_string.find('없음')}")  # -1

# index()로 없는 문자 찾으면 에러나는 예제
try:
    result = test_string.index('없음')
    print(f"index('없음'): {result}")
except ValueError as e:
    print(f"index('없음'): 에러 발생! - {e}")

print("\n" + "="*50 + "\n")

# 4. join() - 리스트나 튜플의 요소들을 문자열로 연결
print("=== 4. join() 메서드 ===")

# 기본 사용법
fruits = ['사과', '바나나', '오렌지', '포도']
print(f"과일 리스트: {fruits}")
print(f"쉼표로 연결: {', '.join(fruits)}")
print(f"- 로 연결: {' - '.join(fruits)}")
print(f"공백으로 연결: {' '.join(fruits)}")
print(f"구분자 없이 연결: {''.join(fruits)}")

# 숫자는 문자열로 변환해야 함
numbers = [1, 2, 3, 4, 5]
print(f"\n숫자 리스트: {numbers}")
# print(', '.join(numbers))  # 이렇게 하면 에러!
print(f"숫자를 문자열로 변환 후 연결: {', '.join(map(str, numbers))}")

# 실용적인 예제 - 파일 경로 만들기
path_parts = ['home', 'user', 'documents', 'project', 'main.py']
file_path = '/'.join(path_parts)
print(f"\n경로 부분들: {path_parts}")
print(f"완성된 경로: {file_path}")

print("\n" + "="*50 + "\n")

# 5. upper(), lower() - 대소문자 변환
print("=== 5. upper(), lower() 메서드 ===")
mixed_case = "Hello World! 안녕하세요! PyThOn ProGramming"
print(f"원본: '{mixed_case}'")
print(f"대문자 변환: '{mixed_case.upper()}'")
print(f"소문자 변환: '{mixed_case.lower()}'")

# 기타 대소문자 관련 메서드들
print(f"첫 글자만 대문자: '{mixed_case.lower().capitalize()}'")
print(f"각 단어 첫 글자 대문자: '{mixed_case.lower().title()}'")
print(f"대소문자 뒤바꾸기: '{mixed_case.swapcase()}'")

# 실용적인 예제 - 사용자 입력 처리
user_input = "  YES  "
print(f"\n사용자 입력: '{user_input}'")
cleaned_input = user_input.strip().lower()
print(f"정리된 입력: '{cleaned_input}'")
if cleaned_input in ['yes', 'y', '네', 'ok']:
    print("긍정적인 응답입니다!")

print("\n" + "="*50 + "\n")

# 6. lstrip(), rstrip(), strip() - 공백 제거
print("=== 6. lstrip(), rstrip(), strip() 메서드 ===")
messy_text = "   안녕하세요! 파이썬 공부중입니다!   "
print(f"원본 (따옴표로 경계 표시): '{messy_text}'")
print(f"왼쪽 공백 제거 lstrip(): '{messy_text.lstrip()}'")
print(f"오른쪽 공백 제거 rstrip(): '{messy_text.rstrip()}'")
print(f"양쪽 공백 제거 strip(): '{messy_text.strip()}'")

# 특정 문자 제거하기
special_text = "...!!!안녕하세요!!!..."
print(f"\n특수문자 포함 텍스트: '{special_text}'")
print(f"양쪽 '.'과 '!' 제거: '{special_text.strip('.!')}'")

# 실용적인 예제 - CSV 데이터 처리
csv_line = " 김철수 , 25 , 서울 , 개발자 "
print(f"\nCSV 라인: '{csv_line}'")
clean_data = [item.strip() for item in csv_line.split(',')]
print(f"정리된 데이터: {clean_data}")

print("\n" + "="*50 + "\n")

# 7. replace() - 문자열 치환
print("=== 7. replace() 메서드 ===")
original = "안녕하세요! 저는 파이썬을 공부하고 있습니다. 파이썬은 정말 재미있어요!"
print(f"원본: '{original}'")
print(f"'파이썬' -> 'Python': '{original.replace('파이썬', 'Python')}'")
print(f"'!' -> '?': '{original.replace('!', '?')}'")

# 개수 제한하여 치환
print(f"첫 번째 '파이썬'만 치환: '{original.replace('파이썬', 'Python', 1)}'")

# 체인으로 여러 번 치환
messy_text = "Hello___World!!!___Python___Programming"
clean_text = messy_text.replace('___', ' ').replace('!!!', '!')
print(f"\n지저분한 텍스트: '{messy_text}'")
print(f"정리된 텍스트: '{clean_text}'")

# 실용적인 예제 - 전화번호 포맷 변경
phone = "010-1234-5678"
phone_numbers = phone.replace('-', '')
print(f"\n전화번호 원본: {phone}")
print(f"하이픈 제거: {phone_numbers}")

print("\n" + "="*50 + "\n")

# 8. split() - 문자열 나누기
print("=== 8. split() 메서드 ===")
sentence = "사과,바나나,오렌지,포도,딸기"
print(f"원본 문장: '{sentence}'")
fruits_list = sentence.split(',')
print(f"쉼표로 분리: {fruits_list}")
print(f"분리된 개수: {len(fruits_list)}")

# 공백으로 분리 (기본값)
text_with_spaces = "파이썬 프로그래밍은 정말 재미있습니다"
words = text_with_spaces.split()
print(f"\n공백 문장: '{text_with_spaces}'")
print(f"단어별 분리: {words}")

# 분리 개수 제한
limited_split = "a-b-c-d-e-f".split('-', 2)
print(f"\n분리 개수 제한 예제: 'a-b-c-d-e-f'")
print(f"최대 2번만 분리: {limited_split}")

# 실용적인 예제 - 로그 분석
log_entry = "2023-12-25 14:30:15 INFO 사용자 로그인 성공"
log_parts = log_entry.split(' ', 3)
print(f"\n로그 엔트리: '{log_entry}'")
print(f"분석된 부분: {log_parts}")
if len(log_parts) >= 4:
    date, time, level, message = log_parts
    print(f"날짜: {date}, 시간: {time}, 레벨: {level}, 메시지: {message}")

# 실용적인 예제 - 파일 확장자 분리
filename = "document.backup.pdf"
name_parts = filename.split('.')
print(f"\n파일명: '{filename}'")
print(f"분리된 부분: {name_parts}")
if len(name_parts) > 1:
    extension = name_parts[-1]
    name_without_ext = '.'.join(name_parts[:-1])
    print(f"확장자: {extension}, 이름: {name_without_ext}")

문자열 총정리는 Claude코드를 사용해서 예제생성및 통합해서 생성해달라하였다!
클로드를 이용하여 정리하니 훨씬 편한것같다!
복습 개념들은 AI를 이용해 정리하여 다시한번 보는것도 괜찮은것같다.

관련 리소스

  • 강사님 자료
  • Claude 코드 예제 생성

느낀점& 배운점&나아가야할점

  • 느낀점: 바로 나와야할 정보들이 머뭇거린것들이 있었다. 복습하길 잘한것 같다 ㅎ
  • 배운점: 예외 처리 라는걸 이번에 처음알았다! 추가로 정리해볼까 한다.
  • 나아가야할점: 앞으로 강사님이 하는 파이썬 복습을 더 많이하면서 풀스택 공부를 해봐야겠다.
profile
nyo님 좋아합니다!

0개의 댓글