SESAC LLM 개발자 강의/Python

[sesac LLM] day6-240109 조건문과 반복문

잇연 2024. 1. 9. 17:24

복습

딕셔너리 해시테이블

  • 딕셔너리는 해시테이블로 이루어져 있다.
  • 딕셔너리(또는 해시 맵)는 파이썬에서 해시 테이블로 구현되어 있는 데이터 구조.
  • 해시 테이블은 키와 값의 쌍을 저장하고, 키를 사용하여 값에 빠르게 접근할 수 있는 자료구조이다.

딕셔너리의 메소드

딕셔너리 메소드는 다섯개가잇는데 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

세트의 연산자들

  1. 교집합
  2. 차집합
  3. 합집합
  4. 대칭차집합
A = {1, 2, 3, 4, 5}
B = {3, 4, 5, 6, 7}
  1. 교집합 (& 또는 intersection() 메소드):
    • 두 세트의 공통된 원소를 찾아냅니다.
    • 예시: A & B 또는 A.intersection(B)는 {3, 4, 5}를 반환합니다.
  2. 차집합 (`` 또는 difference() 메소드):
    • A에서 B의 원소를 제거한 차집합을 얻습니다.
    • 예시: A - B 또는 A.difference(B)는 {1, 2}를 반환합니다.
  3. 합집합 (| 또는 union() 메소드):
    • 두 세트를 합쳐 하나의 큰 세트를 만듭니다.
    • 예시: A | B 또는 A.union(B)는 {1, 2, 3, 4, 5, 6, 7}를 반환합니다.
  4. 대칭차집합 (^ 또는 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. 조건문 중에서 조건 없이 쓸 수 있는 명령문은?
1. if
2. else
3. elif

정답 : 2

  1. 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은 프로그램의 효율성을 높이고, 필요 없는 연산을 방지하여 성능을 최적화하는 데 도움이 됩니다.

반복문

퀴즈

  1. 반복문은 이터러블(iterable) 객체 에만 사용 가능하다. (True, False)
  2. 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 내부_반복_범위:
		#내부 반복작업

언제 쓰는가?

  1. 다차원 데이터 구조를 다룰 때: 예를 들어, 행렬이나 2차원 lst를 처리할 때 중첩 반복문을 사용한다.
  2. 복잡한 데이터 처리: 여러 조건을 충족시키거나, 다양한 데이터 element 간의 관계를 탐색할 때 유용하다.
  3. 알고리즘 구현: 특정 알고리즘, 예를 들어 정렬이나 검색 알고리즘에서 중첩 반복문을 사용하는 경우가 많다.

사용 예시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 를 사용하여 반복문을 종료시킬 수 있습니다.

효율적인 코드 작성을 위한 팁

  1. 조건문의 간결성 유지: 복잡한 조건문은 코드의 가독성을 해칠 수 있으므로, 가능한 한 간결하게 유지하는 것이 좋습니다.
  2. 중첩의 최소화: 반복문이나 조건문의 중첩이 많아지면 코드를 이해하기 어려워질 수 있으므로, 중첩을 최소화하는 것이 좋습니다. (성능 면에서도)
  3. 반복문 내 조건문의 효율성: 반복문 내에서 조건문을 사용할 때는 가장 가능성이 높은 조건을 먼저 체크하는 것이 좋습니다. 이렇게 하면 불필요한 조건 검사를 줄일 수 있습니다.
  4. 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문. 언제끝날지 모를때 쓴다.

시간이 언제 종료될지 모를 때.