오늘은 기존 강사님께서 아프신 관계로 1시간만 하시고 다른 강사님께서 강의해 주셨습니다.
이번주에 강의중에도 한번씩 기침하셨었는데 오늘은 강의하기 쉽지 않으셨어요.
쾌차 하시기 바랍니다.

다른 강사님께서 오시다보니 강의가 완전히 달라진 느낌이었습니다.
배운것도 모르는것 같다고 할까요..
배웠냐고 물어보시는데 순간 아는지 모르는지 자체를 모르는 느낌ㅋ

1시간 강의 하셨던 것중에 좋은 내용이 있었습니다.
저는 강의 내용만 이해하고, 코드 써보는 정도로 복습했는데
다른 수강생의 블로그 보면서 감탄했습니다.
chetGPT 활용해서 코드를 더 다양하게 보고, 정리를 잘 하셨더라고요.

저도 블로그 정리를 그저 강의중 나온 것만으로 쉽게 정리하지 말고,
chetGPT를 통해 코드 추천 받아서 분석하고 만들어 보려고 합니다.
잘 될지 모르겠네요^^


주의사항

# 회색 줄은 영문자 80자, 한글은 32자
# PEP8, PEP20 
# 줄이 너무 길면 가독성이 떨어집니다.
# 뭐든지 한 줄로 하려고 하는 분들 있는데 안 좋은 습관입니다.

print("hello worldhello worldhello worldhello worldhello worldhello worldhello worldhello world")

# 해결책 1: 역슬러시 넣는 방법(저는 권고하지 않습니다!, 이스케이 문자랑 혼동될 수 있습니다.)
print("hello worldhello worldhello worldhello worldhello worldhello worldhello \
worldhello world")

# 이유는 이거랑 헷갈림
print("hello world \n hello world")

# 해결책 2: 콤마를 찍지 않은 연결
print("hello world" "hello world")
print("hello world"
    "hello world")
# 질문 : 메서드 체인으로 길어지면 어떻게 하나요?
# 답 : 메서드 체인으로 80자 이상이면 이미 가독성에 문제가 있는 것
# 메서드 체이닝을 3개 이상을 하길 권하지 않습니다.(가독성이 약화됩니다.)
'hello world'.upper().split(' ').pop().lower()  # 이렇게 코딩하지 마세요

# 문제가 덜한 코드
대문자 = 'hello world'.upper()
잘린대문자 = 대문자.split(' ')

#'hello world'.upper()   .split(' ')   .pop()    .lower()  # 이렇게 코딩하지 마세요 하지만 실행됨


# 허용함 자바스크립트식
'hello world'.upper()\
    .split(' ')\
    .pop()\
    .lower()

# 허용함
'hello world'.upper()   .split(' ')   .pop()   .lower()

# 허용하지 않음(\n) 엔터를 허용하지 않음
# 'hello world'.upper()
#     .split(' ')
#     .pop()
#     .lower()

# 허용하지 않음(\n) 엔터를 허용하지 않음
# 'hello world'.upper()
# .split(' ')
# .pop()
# .lower()
dir('hello world')  # 메서드, 매직메서드, (클래스 변수, 인스턴스 변수)

# 문제 1 : find와 index 차이
# 실무에서 사용하는 코드

# 실무에서 자주 나오는 오류! 이렇게 코딩하시면 안됩니다. 못 찾았는데 찾았다고 봄 -1 리턴은 참으로 봄
if 'hello world'.find('hi'):    
        print('찾았다!')

# 문제2 isdigit의 정체 is시리즈는 많이 씀
# 문자열에서 숫자만 있는지 확인 
'123'.isdigit()        # 결과 : True
'12h3'.isdigit()    # 결과 : False

# 문제3 replace가 어디까지 변환하는지?
'hello world hello world'.replace('hello', 'hi')    # 모두 다 변환이 됩니다. 몇 개만 변환이 되는 것이 아닙니다.
# 알아두셔야 할 사항 : replace는 정규표현식이 안됩니다! 
# replace를 정규표현식을 사용하고 싶으면 re.sub를 사용해야 합니다.

# 문제4 strip(공백제거)

# 문제5 zfill(앞에 0으로 채워주는 것, 원하는 자릿수만큼, 시간이나 연도)

코딩하면서 주의해야 할 것들을 정리해주심.
배운대로만 하면 사실 신경 쓸 필요 없는 부분일수도 있는데 꼭 코딩하다보면
이런거 해보고 싶어지고, 궁금하다 생각이 듬.
그런 것들 정리해서 알려주심^^



리스트

# 중첩 리스트에서 특정 요소 탐색 및 수정
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 특정 요소 변경하기 (예: 2번째 행의 3번째 요소를 100으로 변경)
matrix[1][2] = 100

# 각 행의 합계를 구하여 새로운 리스트 생성
row_sums = [sum(row) for row in matrix]

# 결과 출력
print("수정된 행렬:", matrix)    # 수정된 행렬: [[1, 2, 3], [4, 5, 100], [7, 8, 9]]
print("각 행의 합:", row_sums)     # 각 행의 합: [6, 109, 24]

chetGPT 통해서 예제코드를 만들어 보았다.
코드가 어렵진 않았는데 안 배운것도 나왔다.
row 라는 건데 print 해보면 matrix 안에 각각 리스트를 리턴했다.
각 리스트의 합계를 구해서 새로운 리스트를 만들어냈다.


# 나이와 성별 정보가 담긴 리스트 생성
people = [
    ['John', 'male', 28],
    ['Jane', 'female', 32],
    ['Bob', 'male', 24],
    ['Alice', 'female', 29]
]

# 30세 이상의 여성을 찾는 함수 정의
def is_woman_over_30(person):
    name, gender, age = person
    return gender == 'female' and age >= 30

# 조건에 맞는 데이터 필터링
women_over_30 = []
for person in people:
    if is_woman_over_30(person):
        women_over_30.append(person)

# 결과 출력
print("30세 이상의 여성:", women_over_30)

두번째 만들어낸 예제코드는 30세 이상의 여성을 리스트에서 찾아내는 코드 이다.
30세 이상의 여성을 찾는 함수는 people 리스트에서 한 리스트(사람정보)씩 매개변수로
가지고 와서 다중할당으로 각 정보를 나눠서 변수에 넣은 다음 여성이고, 30세 이상인지를
판단하고 True, False 여부만 넘긴다.

데이터 필터링은 people 리스트의 정보를 for반복문을 통해 하나씩 is_woman_over_30 함수에서
30세 이상 여성 여부를 받고, True인 정보만 빈 리스트 woman_over_30 이라는 리스트에
저장한다.

역시 생성된 코드 분석을 하다보니 재밌음.



튜플

# 학생들의 이름과 시험 점수가 담긴 튜플
students = (
    ('Alice', [88, 76, 92]),
    ('Bob', [85, 90, 83]),
    ('Clara', [91, 84, 89])
)

# 특정 학생의 시험 점수 변경 시도 (튜플이므로 변경 불가)
try:
    students[0][1][0] = 95  # Alice의 첫 번째 시험 점수를 95로 변경
    students[0] = ('Alice', [95, 76, 92])  # 이 줄은 튜플 내부의 튜플을 변경하려 하므로 TypeError 발생
except TypeError as e:
    print("Error:", e)

# 결과 출력
print("학생 데이터:", students)

튜플의 예제는 아무래도 불변하는 부분을 강조하는 예제를 생성 받았다.
코드를 보면 튜플 자체로 성적데이터를 수정하려고 했을때는 수정이 안되고 에러가 발생하지만
튜플내 리스트에 접근하여 수정할 경우 데이터 수정이 가능하다.



딕셔너리

# 주간 요일별 스케줄 관리를 위한 딕셔너리
weekly_schedule = {
    '월요일': ['회의', '보고서 작성'],
    '화요일': ['프로젝트 계획'],
    '수요일': [],
    '목요일': ['워크샵'],
    '금요일': ['프로젝트 검토'],
}

# 수요일 스케줄 추가
weekly_schedule.setdefault('수요일', []).append('팀 미팅')

# 주말 스케줄 추가 (없으면 생성)
for day in ['토요일', '일요일']:
    weekly_schedule.setdefault(day, []).append('휴식')

# 스케줄 출력
for day, tasks in weekly_schedule.items():
    print(f"{day}: {', '.join(tasks) if tasks else '없음'}")

딕셔너리 관련 예제임.
주간 스케쥴 데이터가 딕셔너리로 있었는데 데이터 없는 수요일에 스케쥴 추가 하고,
주말 스케쥴이 없어서 자동으로 휴식을 추가해주는 코드.
key 와 value를 보기 쉽게 활용하는 코드임.
예제 코드들을 보면 확실히 반복문 활용이 유연하다는 느낌을 받음.
좀 더 데이터 중심으로 반복문을 쓸 수 있는 장점이 느껴짐.


# 사용자 프로필 정보
user_profiles = {
    'user1': {'이름': 'Alice', '나이': 30},
    'user2': {'이름': 'Bob', '나이': 25}
}

# 새로운 사용자 추가
new_profile = {'user3': {'이름': 'Clara', '나이': 28}}
user_profiles.update(new_profile)

# 사용자 나이 변경 시도 및 기본값 설정
for user_id, profile in user_profiles.items():
    # 나이를 1년 증가
    profile['나이'] += 1
    # '직업' 키가 없으면 '미정'으로 설정
    profile.setdefault('직업', '미정')

# 사용자 프로필 출력
for user_id, profile in user_profiles.items():
    print(f"{user_id}: 이름={profile.get('이름')}, 나이={profile.get('나이')}, 직업={profile.get('직업')}")

이 예제도 사용자 프로필 정보를 update, setdefault, get 메소드 활용하여 데이터 안전하게 관리하는
코드입니다.



SET

# 두 팀의 프로젝트 목록 (중복된 이름 포함)
team_a_projects = ['프로젝트 A', '프로젝트 B', '프로젝트 C', '프로젝트 D', '프로젝트 C']
team_b_projects = ['프로젝트 C', '프로젝트 D', '프로젝트 E', '프로젝트 F', '프로젝트 D']

# 중복된 프로젝트 이름 제거
unique_team_a_projects = set(team_a_projects)
unique_team_b_projects = set(team_b_projects)

# 두 팀이 공통으로 참여하는 프로젝트 (교집합)
common_projects = unique_team_a_projects & unique_team_b_projects

# 각 팀이 독립적으로 진행하는 프로젝트 (차집합)
unique_a_projects = unique_team_a_projects - unique_team_b_projects
unique_b_projects = unique_team_b_projects - unique_team_a_projects

# 결과 출력
print("Team A의 고유 프로젝트:", unique_team_a_projects)
print("Team B의 고유 프로젝트:", unique_team_b_projects)
print("두 팀의 공통 프로젝트:", common_projects)
print("Team A의 독특한 프로젝트:", unique_a_projects)
print("Team B의 독특한 프로젝트:", unique_b_projects)

각 팀별 프로젝트 리스트에서 중복제거 하고, 함께 작업하는 프로젝트와 각 팀만 작업하는
독립적인 프로젝트를 출력하는 프로그램입니다.



SUM

# 숫자와 문자가 혼합된 문자열
mixed_string = 'a1b2c3d4e5f6g7h8i9j1k2l3m4'

# 문자열에서 숫자만 추출
numbers = filter(str.isdigit, mixed_string)  # '1234567891234'

# 중복을 제거하고, 각 문자를 정수로 변환
unique_numbers = set(map(int, numbers))  # {1, 2, 3, 4, 5, 6, 7, 8, 9}

# 숫자들의 합 계산
sum_of_unique_numbers = sum(unique_numbers)  # 1+2+3+4+5+6+7+8+9

# 결과 출력
print("문자열 내 고유 숫자들의 합:", sum_of_unique_numbers)

간단하게 예제를 받아왔지만 코드 가독성은 쉽지 않음.
str.isdigit은 문자열의 한글자 씩 숫자인지 확인해서 True, False 반환함.
filter 통해서 True 인것만 뽑아서 numbers에 저장함.
그 다음은 문자열인 numbers를 int형으로 변환하면서 중복 제거함.
그리고 그 숫자들의 합이 결과



in

# 각 카테고리별 쇼핑 아이템 목록
shopping_categories = {
    '과일': ['사과', '바나나', '오렌지'],
    '야채': ['당근', '브로콜리', '양파'],
    '음료': ['물', '주스', '콜라']
}

# 특정 아이템이 쇼핑 목록에 있는지 확인하는 함수
def is_item_in_category(item, categories):
    for category, items in categories.items():
        if item in items:
            return True, category
    return False, None

# 아이템 존재 여부 확인
item_to_check = '브로콜리'
exists, category = is_item_in_category(item_to_check, shopping_categories)

# 결과 출력
if exists:
    print(f"'{item_to_check}'는(은) '{category}' 카테고리에 있습니다.")
else:
    print(f"'{item_to_check}'는(은) 쇼핑 목록에 없습니다.")

예제들을 많이 보면서 for문과 if문, 함수 활용에 대해 배울 수 있음.
리턴도 여러개가 됨^^ None활용도 볼 수 있음.



AND, OR, NOT 단락평가

import random

# 사용자 ID 목록과 랜덤 선택을 위한 None 추가
user_ids = ['user1', 'user2', 'user3', None]
is_admin = random.choice([True, False])  # 임의로 관리자 여부 설정

# 랜덤으로 하나의 사용자 ID 선택
selected_user_id = random.choice(user_ids)

# 로그인 상태 설정 (ID가 있으면 로그인 성공으로 가정)
logged_in = bool(selected_user_id)

# 로그인 상태와 관리자 여부 확인
if logged_in and is_admin:
    print(f"관리자로 로그인 성공! 사용자 ID: {selected_user_id}")
elif logged_in and not is_admin:
    print(f"일반 사용자로 로그인 성공! 사용자 ID: {selected_user_id}")
else:
    print("로그인 실패. 사용자 ID가 없거나 잘못된 접근입니다.")

# 사용자 ID가 없거나 관리자가 아닌 경우 추가 메시지 출력
if not selected_user_id:
    print("추가 조치가 필요합니다.")

AND, OR, NOT 활용을 위해서 예제코드를 요청했는데 이상해서 수정을 좀 했음.
무조건 로그인 성공이 뜨길래 랜덤으로 아이디와 관리자여부 설정하게 함.
AND 에서 앞이 False면 뒤는 확인을 안하는 점 참고!


chatGPT를 통해서 코드를 받으니 마음에 드는 코드 선택하고 분석을 같이 하다보니
생각보다 시간이 많이 흘렀습니다.
그래도 재밌는 과정이었습니다.
혼자 아무생각 없이 복습만 하는 것보다는 코드 추천 받고, 생각하지 못했던
구문 분석하는게 더 좋은 것 같습니다.
아직도 대략적인 감만 오고 잘 알겠다는 느낌은 없지만 반복하면서 실력을
더 향상시키고 싶네요.