[sesac LLM] day6-240109 조건문과 반복문
복습
딕셔너리 해시테이블
- 딕셔너리는 해시테이블로 이루어져 있다.
- 딕셔너리(또는 해시 맵)는 파이썬에서 해시 테이블로 구현되어 있는 데이터 구조.
- 해시 테이블은 키와 값의 쌍을 저장하고, 키를 사용하여 값에 빠르게 접근할 수 있는 자료구조이다.
딕셔너리의 메소드
딕셔너리 메소드는 다섯개가잇는데 add(), update(), items() , values(), keys()를 많이 쓰고
이러한 딕셔너리의 주요 메소드 중에서 items(), values(), keys() 세 가지 메소드는 딕셔너리에서 데이터를 끄집어내는 데 사용된다.
1. items(): 이 메소드는 딕셔너리 내의 모든 키-값 쌍을 반환한다. 각 키-값 쌍은 튜플로 묶여 있으며, 모든 키-값 쌍을 리스트로 묶어서 반환한다.
my_dict = {'a': 1, 'b': 2, 'c': 3}
items = my_dict.items()
print(items) # [('a', 1), ('b', 2), ('c', 3)]
2. values(): 이 메소드는 딕셔너리 내의 모든 값(키에 해당하는 value)들을 리스트로 반환한다.
my_dict = {'a': 1, 'b': 2, 'c': 3}
values = my_dict.values()
print(values) # [1, 2, 3]
3.keys(): 이 메소드는 딕셔너리 내의 모든 키들을 리스트로 반환한다.
my_dict = {'a': 1, 'b': 2, 'c': 3}
keys = my_dict.keys()
print(keys) # ['a', 'b', 'c']
이러한 메소드들은 딕셔너리의 내용을 조회하고 사용할 때 유용하게 활용된다. 딕셔너리 내의 데이터를 반복하거나 특정 키나 값에 접근하는 데에도 사용할 수 있다.
+get()
# 딕셔너리 생성
my_dict = {'apple': 3, 'banana': 2, 'cherry': 5}
# get() 함수를 사용하여 값 가져오기
apple_count = my_dict.get('apple') # 'apple' 키의 값은 3
orange_count = my_dict.get('orange') # 'orange' 키는 딕셔너리에 없으므로 None 반환
banana_count = my_dict.get('banana', 0) # 'banana' 키의 값은 2, 두 번째 인자는 기본값으로 0 지정
# 결과 출력
print(apple_count) # 출력: 3
print(orange_count) # 출력: None
print(banana_count) # 출력: 2
세트의 연산자들
- 교집합
- 차집합
- 합집합
- 대칭차집합
A = {1, 2, 3, 4, 5}
B = {3, 4, 5, 6, 7}
- 교집합 (& 또는 intersection() 메소드):
- 두 세트의 공통된 원소를 찾아냅니다.
- 예시: A & B 또는 A.intersection(B)는 {3, 4, 5}를 반환합니다.
- 차집합 (`` 또는 difference() 메소드):
- A에서 B의 원소를 제거한 차집합을 얻습니다.
- 예시: A - B 또는 A.difference(B)는 {1, 2}를 반환합니다.
- 합집합 (| 또는 union() 메소드):
- 두 세트를 합쳐 하나의 큰 세트를 만듭니다.
- 예시: A | B 또는 A.union(B)는 {1, 2, 3, 4, 5, 6, 7}를 반환합니다.
- 대칭차집합 (^ 또는 symmetric_difference() 메소드):
- 두 세트 중 하나에만 있는 원소로 이루어진 세트를 생성합니다.
- 예시: A ^ B 또는 A.symmetric_difference(B)는 {1, 2, 6, 7}를 반환합니다.
set 연습문제 풀어보기
문제 1.
쇼핑몰에서 장바구니에 담긴 상품들 중에서 중복 상품을 찾아내는 프로그램을 작성해야 합니다. 사용자가 장바구니에 담은 상품 목록이 주어졌을 때, 중복되는 상품을 찾아내세요.
함수 find_duplicate_items를 작성하세요.
- 함수는 하나의 리스트를 매개변수로 받습니다: shopping_cart (문자열로 상품 이름을 저장하는 리스트).
- 함수는 주어진 리스트에서 중복되는 모든 상품을 set으로 반환합니다.
예를 들어:
- shopping_cart = ["Apple", "Banana", "Apple", "Grapes"]의 경우 출력은 {"Apple"}이어야 합니다.
def find_duplicate_items(shopping_cart: list) -> set:
sc_set = set(shopping_cart)
duplicated=[]
for sc_item in sc_set:
if shopping_cart.count(sc_item)>1:
duplicated.append(sc_item)
return set(duplicated)
#VS CODE에서 확인해보기
print(find_duplicate)
조건문
퀴즈
- 조건문 중에서 조건 없이 쓸 수 있는 명령문은?
1. if
2. else
3. elif
정답 : 2
- elif 문 안에서 코드를 모두 실행하면 어디로 이동합니까?
1. return
2. else
3. if 문 외부
정답 : 3
조건문이란?
- if 다음에 오는 조건의 진리값에 따라 코드의 실행 여부를 결정한다.
- 명령문의 분기를 정하는데, 이는 프로그래밍의 핵심적인 요소이다.
조건문 형식
if 조건 :
코드
조건문 예시
age = 20
if age >= 19:
print("성인입니다.")
부울 자료형 True , False
- True: 논리값이 참인 경우
- False: 논리값이 거짓인 경우
==
- ==는 Python에서 사용되는 비교 연산자 중 하나로, 두 값이 서로 동등한지 여부를 확인하는 데 사용된다. == 연산자는 두 값이 같으면 True를 반환하고, 다르면 False를 반환한다.
논리 연산자: not , and , or
- 조건들을 결합하거나 반전시켜 더 복잡한 조건을 만들 수 있음
- not : 논리값을 반전시킴 (True -> False, False -> True)
- and : 모든 조건이 참일 때 True를 반환
- or : 조건 중 하나라도 참이면 True를 반환
not, and, or 예시
if 조건1 and 조건2:
# 조건1과 조건2가 모두 참일 때 실행될 코드
elif 조건1 or 조건2:
# 조건1 또는 조건2 중 하나라도 참일 때 실행될 코드
elif not 조건1:
# 조건1이 거짓일 때 실행될 코드
else, elif
else 문
- if 문의 조건이 거짓(False)일 때 실행되는 코드 블록
- if 문과 함께 사용되며, 단독으로는 사용할 수 없음
- 예제:
- else: 코드
elif 문
- 여러 조건 중 하나를 검사하여 해당 조건이 참일 때 실행되는 코드 블록
- if 다음에 사용되며, 여러 번 사용할 수 있음
- 예제:
- elif 조건: 코드
day = "월요일"
holiday = True
if day in ["토요일", "일요일"]:
print("더 자라")
elif holiday:
print("더 자라")
else:
print("빠빠빠빠빠빠 굿모닝 ~")
elif와 if문 사용시 주의사항
if중첩시키지않기
(심화) Truthy, Falsy
- Python에서는 모든 객체가 참(True) 또는 거짓(False)으로 평가될 수 있음
- 일반적으로 비어 있거나 0인 값들은 Falsy, 그렇지 않은 값들은 Truthy로 간주
if "문자열": # 비어 있지 않은 문자열은 Truthy
코드 실행
if 0: # 0은 Falsy
코드 실행되지 않음
- 조건문에서 객체의 값 자체를 조건으로 사용할 수 있음
- 이를 통해 더 간결하고 명확한 코드 작성 가능
(심화) Short Circuit Evaluation
- Python은 and와 or 연산자를 단축 평가(short circuit)
- and 의 경우, 첫 번째 값이 False이면 두 번째 값은 평가하지 않음
- or 의 경우, 첫 번째 값이 True이면 두 번째 값은 평가하지 않음
- and 와 or 앞, 뒤로 조건문이 있는 것이 아니라 코드가 있다는 것을 유의하자.
False and print("이 코드는 실행되지 않습니다.")
True or print("이 코드도 실행되지 않습니다.")
이걸 보면 알 수 있듯이
Short Circuit Evaluation 활용 예제
1. 기본값 설정하기
- 빈 리스트나 None인 경우 대체값을 제공
my_list = None
print(my_list or "리스트가 비어있거나 None입니다.")
2. 조건부 함수 호출
- 특정 조건이 참일 때만 함수를 호출하고자 할 때
condition = True
condition and my_function() # condition이 True일 때만 my_function() 호출
3.여러 조건 중 하나만 충족해도 되는 경우
- 여러 조건 중 하나라도 참이면 특정 동작을 수행
user = None
logged_in = False
user or logged_in or print("유저가 로그인하지 않았습니다.")
4. 리소스 소모가 큰 연산을 마지막에 배치
- 비용이 많이 드는 연산을 최후의 조건으로 두어 필요할 때만 실행
import time
is_admin = False
def expensive_operation(): # 비용이 많이 드는 연산
time.sleep(10000000)
is_admin and expensive_operation() # is_admin이 False면 비용이 많이 드는 연산 수행하지 않음
-
- 이러한 방식으로 short circuit evaluation은 프로그램의 효율성을 높이고, 필요 없는 연산을 방지하여 성능을 최적화하는 데 도움이 됩니다.
반복문
퀴즈
- 반복문은 이터러블(iterable) 객체 에만 사용 가능하다. (True, False)
- continue문이 실행되면 반복문을 빠져 나온다. (True, False)
for문 기본 구조 및 사용법
for 반복자 in 이터러블:
코드
반복문의 역할과 중요성
- 자동화: 반복문을 사용하여 동일하거나 유사한 작업을 여러 번 자동으로 수행할 수 있다.
- 코드 효율성: 복잡한 작업을 간결하게 처리하여 코드의 양을 줄이고 가독성을 향상시킨다.
- 이터러블데이터 처리: lst, 튜플, 문자열 등 다양한 데이터 컬렉션을 효율적으로 처리할 수 있다.
- 유연한 사용: for 와 while 은 각각 다른 상황에 적합하며, 문제에 따라 적절한 반복문을 선택하 여 사용할 수 있다.
- 반복문 예시1
import random #ranodom모듈은 파이썬의 내장함수
dormitories = ['그리핀도르', '후플푸프', '레번클로', '슬리데린']
for domitory in dormitories:
selected = random.choice(dormitories) #이텉러블 list에서 하나를 뽑아주는것
print(f'{selected}'!')
break
⇒ 랜덤으로 값을 출력해줄 수 있다.
- 반복문 예시2
for char in 'abcdefghijklmnopqrstuvwxyz':
print(char)
이렇게 엔터(다음줄로 넝어가게) 처리 되는데, 엔터가 자동으로 되는 것이 싫다하면
for char in 'abcdefghijklmnopqrstuvwxyz':
print(char, end=" ")
이렇게 해줘서 한 줄로 출력할 수 있다.
- 예시3
evens=[]
odds=[]
for number in range(1,11):
if num % 2== 0:
evens.append(num)
else:
odds.append(num)
for number in range(3,30,3):
print("삼육구게임:", number)
중첩 반복문 (Nested For Loop) 기본 구조 및 사용법
기본 구조
- 중첩된 for 반복문은 하나의 for 반복문 안에 다른 for 반복문이 포함되어 있는 구조
- 중첩 반복문의 기본 구조는 다음과 같습니다.
for 외부_반복자 in 외부_반복_범위:
#외부 반복 작업
for 내부_반복자 in 내부_반복_범위:
#내부 반복작업
언제 쓰는가?
- 다차원 데이터 구조를 다룰 때: 예를 들어, 행렬이나 2차원 lst를 처리할 때 중첩 반복문을 사용한다.
- 복잡한 데이터 처리: 여러 조건을 충족시키거나, 다양한 데이터 element 간의 관계를 탐색할 때 유용하다.
- 알고리즘 구현: 특정 알고리즘, 예를 들어 정렬이나 검색 알고리즘에서 중첩 반복문을 사용하는 경우가 많다.
사용 예시1 : 구구단
for i in range(1, 10):
for j in range(1, 10):
print(f"{i} x {j} = {i*j}")
사용 예시(2): 중복 찾기
lst = [1, 2, 3, 2, 1, 5, 6, 5, 5, 7]
duplicated = set()
for i in range(len(lst)): # 인덱스의 모든 원소에 접근하겠다는 뜻
# i는 현재 지금 내가 놓여있는 리스트의 위치
# i+1은 i 다음
for j in range(i + 1, len(lst)): # 현재 i 다음 모든 리스트의 요소에 접근하겠다는 뜻
if lst[i] == lst[j]:
duplicated.add(lst[i])
print(duplicated)
for문 돌릴 때 반복자는 i를 많이쓴다. 가장 바깥쪽 루프는 i를 사용하고, 그 다음 내부 루프는 j를 사용하며, 필요한 경우 계속해서 k, l 등을 사용한다.
while 반복문 기본 구조 및 사용법
기본구조
- while 반복문은 주어진 조건이 참(True)인 동안 코드 블록을 반복해서 실행
- while 반복문의 기본 구조는 다음과 같다.
while 조건:
#반복 실행할 코드
사용 예시: 사용자가 '종료'를 입력할 때까지 계속 입력 받기
while True:
사용자_입력 = input("메시지를 입력하세요 (종료하려면 '종료' 입력): ")
print(f"입력된 메시지: {사용자_입력}")
if 사용자_입력 == "종료":
break
유의사항
- 무한 루프에 빠지지 말자
- while 반복문은 조건이 항상 참이 되는 경우, 무한 루프에 빠질 위험이 있다.
- 실습 예제: 무한루프 빠져 나오기
- 사용자가 시작 숫자를 입력하면 해당 숫자부터 시작하여 0에 도달할 때까지 간단한 카운트다운을 실행하는 무한 루프 프로그램을 만들어보자.
import time
시작_숫자 = int(input("카운트다운을 시작할 숫자를 입력하세요: "))
while 시작_숫자 >= 0:
time.sleep(1)
print(시작_숫자)
시작_숫자 -= 1 # 숫자 감소
print("카운트다운 종료!")
- 만일, 무한 반복에 빠졌다면?
- 조건문을 확인해 보세요.
- 무한루프에 빠지면, 강제로 종료 해야 합니다. Ctrl + C 또는 Ctrl + Z 를 눌러보세요.
break와 continue
break의 기초 문법
- break 문은 반복문 내에서 사용되며, 실행되는 순간 해당 반복문을 즉시 종료시킨다.
- break 는 주로 조건문과 함께 사용되어 특정 조건이 충족될 때 반복문을 탈출하는 데 사용된다.
break의 사용 예제
while 조건:
# 반복 실행할 코드
if 탈출_조건:
break # 탈출 조건이 충족되면 반복문 종료
break 의 사용 예제
# 사용자가 '종료'라고 입력할 때까지 메시지를 출력하는 예제
while True:
message = input("message를 입력하세요 (종료하려면 '종료' 입력): ")
if message == "종료":
break
print(f"입력된 message: {message}")
continue 기초 문법
- continue 문은 반복문 내에서 사용되며, 실행되는 순간 해당 반복의 나머지 부분을 건너뛰고 다음 반복으로 넘어간다.
- continue 는 반복문의 일부 조건을 건너뛰고 싶을 때 유용하다.
while 조건:
반복 실행할 코드
if 건너뛸_조건:
continue # 해당 조건이 충족되면 이번 반복의 나머지 부분을 건너뜀
#다른 실행 코드
예제2
# 1부터 10까지 숫자 중에서 홀수만 출력하는 예제
for 숫자 in range(1, 11):
if 숫자 % 2 == 0: # 짝수인 경우
continue # 다음 반복으로 넘어감
print(숫자) # 홀수만 출력
range()함수
range()함수의 기초문법
- range() 함수는 지정된 시작점부터 종료점까지의 일련의 숫자를 생성하는 데 사용된다. 기본적으로,
- range() 는 0부터 시작하지만, 사용자가 시작점과 종료점을 지정할 수도 있다. 선택적으로, 증가치(step)도 설정할 수 있다.
range()함수의 기본구조
range(end) # 0부터 종료-1까지의 숫자
range(start, end) # 시작부터 종료-1까지의 숫자
range(start, end, step) # 시작부터 종료-1까지 증가치만큼 증가하는 숫자
실습예제
# 1부터 10까지의 숫자 출력
for i in range(1, 11):
print(i)
# 5부터 50까지 5씩 증가하는 숫자 출력
for i in range(5, 51, 5):
print(i)
emurate()
언제 사용할까?
- range() 함수는 주로 반복문과 함께 사용되어 특정 횟수만큼 반복 실행하거나, 특정 범위의 숫자를 순회할 때 사용된다.
- 예를 들어, lst의 인덱스를 순회하거나, 정해진 횟수만큼 어떤 작업을 반복할 때 유용하게 사용할 수 있다.
emurate() 기초문법
- enumerate() 함수는 반복 가능한(iterable) 객체(예: lst, 튜플)를 인덱스와 함께 순회할 때 사용된다. 이 함수는 각 element에 대한 인덱스와 그 element의 값을 튜플 형태로 반환한다.
emurate() 기본 구조:
enumerate(이터러블, 시작인덱스=0)
실습예제
# lst의 element와 그 인덱스를 출력
fruits = ['사과', '바나나', '체리']
for index, fruit in enumerate(fruits):
print(f"index {index}: {fruit}")
# 시작 인덱스를 1로 설정하여 순회
for index, fruit in enumerate(fruits, 1):
print(f"index {index}: {fruit}")
언제 사용할까?
- enumerate() 함수는 lst, 튜플 등의 반복 가능한 객체를 순회하면서, 해당 element의 인덱스 가 필요한 경우에 주로 사용됩니다.
- 예를 들어, lst의 element와 그 위치를 함께 출력하거나, 특정 조건에 따라 lst의 element를 처 리해야 할 때 유용합니다.
반복문과 조건문의 조합
조건문을 통한 반복 제어
- 특정 조건에 따라 반복문의 동작을 변경하거나, 특정 조건이 만족될 때까지 반복문을 실행하게 할 수 있습니다.
- 예를 들어, while 반복문 내에서 if 조건문을 사용하여 특정 조건이 충족될 때 break 를 사용하여 반복문을 종료시킬 수 있습니다.
효율적인 코드 작성을 위한 팁
- 조건문의 간결성 유지: 복잡한 조건문은 코드의 가독성을 해칠 수 있으므로, 가능한 한 간결하게 유지하는 것이 좋습니다.
- 중첩의 최소화: 반복문이나 조건문의 중첩이 많아지면 코드를 이해하기 어려워질 수 있으므로, 중첩을 최소화하는 것이 좋습니다. (성능 면에서도)
- 반복문 내 조건문의 효율성: 반복문 내에서 조건문을 사용할 때는 가장 가능성이 높은 조건을 먼저 체크하는 것이 좋습니다. 이렇게 하면 불필요한 조건 검사를 줄일 수 있습니다.
- continue 와 break 의 적절한 사용: continue 와 break 를 사용하여 불필요한 반복을 줄이고, 코드의 실행 흐름을 명확하게 만들 수 있습니다.
실습: 파일에서 한줄씩 값 불러오기
- example.txt 파일 만들기
- 민지 하니 다니엘 해린 혜인
- for 문을 통해서 file읽기
- with open("example.txt", "r",encoding="utf-8") as file: for line in file: # 각 줄에 대한 처리 print(line.strip())
코드 최적화와 가독성 향상
- 반복해서 실행하는 실행문은 되도록이면 함수로 만들어 보세요. 코드의 가독성이 좋아집니다.
def process_function(element):
# element 처리
return result
lst = [1, 2, 3, 4, 5]
for element in lst:
result = process_function(element)
print(result)
element 처리
return result lst = [1, 2, 3, 4, 5] for element in lst: result = process_function(element) print(result) 25
반복 실행할 코드
if 탈출_조건: break # 탈출 조건이 충족되면 반복문 종료 12
for문과 while문쓰는 경우
for문은 이터러블 . 길이가 정해져있음
while문. 언제끝날지 모를때 쓴다.
시간이 언제 종료될지 모를 때.