[LG헬로비전 DX DATA SCHOOL 4기] Python(3) (250108)

mini_bang·2025년 1월 8일

반복문

while문

  • 10 이하의 짝수 출력하기
// 실습 코드
# 10이하의 짝수 출력하기
i = 1

while i <= 10:
  if i % 2 == 0:
    print(i)
  i += 1
  • 특정 조건에서 반복 종료 및 계속
i = 90

while i:
  if i == 100:
    print("축하합니다. %d번째 방문자입니다." %i)
    break
  i += 1
print("감사합니다. 이벤트가 종료되었습니다.")
  • 특정 조건 건너뛰기
i = 0

while i < 11:
  i += 1
  if i == 6:
    continue
  if i % 2 == 0:
    print(i)
  • pass와 반복 종료
i = 0

while i < 11:
  i += 1
  if i == 6:
    pass
  if i % 2 == 0:
    print(i)
  • break로 반복 종료
i = 0

while i < 11:
  i += 1
  if i == 6:
    break
  if i % 2 == 0:
    print(i)

for문

  • 숫자형 범위 설정
for x in range(0, 5):
  print(x)
for x in range(5, -1, -1):
  print(x)
  • 자료형 범위 설정
word = 'hello!'

for w in word:
  print(w)
for a, b in [(2, 1), (2, 2), (2, 3), (2, 4)]:
  print(a * b)

이중 반복문

  • 구구단 출력하기
# 구구단 2단과 3단 출력하기

for i in range(2, 4):
  print("===", i, "단===")
  for j in range(1, 10):
    print(i * j)
  • 1부터 10까지 합 계산
# 1부터 10까지 합을 구하시오. (range 함수를 이용하시오.)
sum = 0

for i in range(1, 11):
  sum += i
print(sum)

연습 문제

  • 사용자 입력 처리
# 사용자로부터 정수를 입력받아, 해당 정수만큼 "안녕"을 출력하세요.
num = int(input("정수를 입력하세요: "))

for i in range(num):
  print("안녕")
  • 별 찍기
# 사용자로부터 정수를 입력받아, 입력된 정수만큼 별(*)찍기
# 왼쪽 아래가 직각인 n만큼의 높이를 가지는 직각삼각형
num = int(input("정수를 입력하세요: "))

for i in range(num):
  print("*" * (i+1))

for i in range(num):
  print("*" * (i+1), end = ' ')
# (1) 계단형, n을 입력받아, n만큼 줄을 만들고 계단 형태로 별찍기
num = int(input("정수를 입력하세요: "))

for i in range(num):
  print(" "* i + "*" * num)
# (2) 오른쪽 아래가 직각인 n만큼의 높이를 가지는 직각삼각형
num = int(input("정수를 입력하세요: "))

for i in range(num):
  print(" " * (num-i) + "*" * (i+1))
# (3) 왼쪽 위가 직각인 n만큼의 높이를 가지는 직각삼각형(역삼각형)
num = int(input("정수를 입력하세요: "))

for i in range(num):
  print("*" * (num-i) + " " * i)
# (4) 오른쪽 위가 직각인 n만큼의 높이를 가지는 직각삼각형
num = int(input("정수를 입력하세요: "))

for i in range(num):
  print(" " * i + "*" * (num-i))
# (5) n만큼 높이를 가지는 홀수개의 별 피라미드
num = int(input("정수를 입력하세요: "))

for i in range(1, num+1):
  print(" " * (num-i) + "*" * (2 * i -1))
  • 리스트와 딕셔너리에 특정값 연산
# (1)  x = [3, 6, 9, 20, -7, 5] 의 값의 모든 요소에 10을 곱한뒤 출력하세요
x = [3, 6, 9, 20, -7, 5]

for i in x:
  print(i*10)

# 심화 : 출력과 리스트 x 의 값에도 모두 10을 곱해주세요
x = [3, 6, 9, 20, -7, 5]
for i in range(0, len(x)):
  x[i] = x[i]*10
print(x)
# (2) y = {"math": 70, "science": 80, "english": 20} 의 값의 모든 요소에 10을 더한뒤 출력하세요
y = {"math": 70, "science": 80, "english": 20}

for i in y.values():
  print(i+10)

# 심화 : 출력과 딕셔너리 y 의 값에도 모두 10을 더해주세요
y = {"math": 70, "science": 80, "english": 20}

for key in y:
  val = y[key]
  y[key] = y[key] + 10
  print("%s : %d" %(key, val + 10))
print(y)
# (3) 숫자를 입력받고 입력받은 정수의 구구단을 출력하세요
num = int(input("정수를 입력하세요: "))

for i in range(1, 10):
  print(f"{num} * {i} = {num * i}")
  • 구구단 구현
# 구구단을 1단부터 9단까지 출력하세요

for i in range(1, 10):
  print("%d %s" %(i, "단"))
  for j in range(1, 10):
    print("%d * %d = %d" %(i, j, i*j))
  print("\n")
  • 특정 조건 필터링
# # 1~100 임의의 숫자를 맞추시오
import random

true_value = random.randint(1, 100)
input_value = 99999 # 임의의 값 할당

print('숫자를 맞춰보세요(1~100)')

while true_value != input_value:
  input_value = int(input())
  if input_value > true_value: # 사용자의 입력값이 true_value보다 클 때
    print("숫자가 너무 큽니다.")
  elif input_value == true_value:
    print(f"정답입니다. 입력한 숫자는 {true_value}입니다.")
  else:
    print("숫자가 너무 작습니다.")  # 사용자의 입력값이 true_value보다 작을 때
# word = ["school", "game", "piano", "science", "hotel", "mountain"] 중 글자수가 6글자 이상인 문자를 모아 새로운 리스트를 생성하세요
word = ["school", "game", "piano", "science", "hotel", "mountain"]
a = []

for i in range(len(word)):
  if len(word[i]) >= 6:
    a.append(word[i])
print(a)
# 1-100까지 숫자중 3과 5의 공배수일경우 "3과 5의 공배수"
# 나머지 숫자중 3의 배수일경우 "3의 배수"
# 나머지 숫자중 5의 배수일경우 "5의 배수"
# 모두 해당되지 않을 경우 그냥 숫자를 출력하세요.

for i in range(1, 101):
  if i % 3 == 0:
    if i % 5 == 0:
      print(f"{i} : 3과 5의 공배수")
    else:
      print(f"{i} : 3의 배수")
  elif i % 5 == 0:
    print(f"{i} : 5의 배수")
  else:
    print("%d" %i)
    
# 심화: 1-입력한숫자까지의 숫자중
num = int(input("1~100 사이의 숫자를 입력하세요: "))

for i in range(1, num+1):
  if i % 3 == 0:
    if i % 5 == 0:
      print(f"{i} : 3과 5의 공배수")
    else:
      print(f"{i} : 3의 배수")
  elif i % 5 == 0:
    print(f"{i} : 5의 배수")
  else:
    print("%d" %i)
# 사용자로부터 숫자를 계속 입력받다가 s or S를 입력하면 합계출력(단, 다른 문자는 받을 수 없다.)

sum = 0

while True:
  num = input()
  if (num == 's' or num == 'S'):
    break
  else:
    sum += int(num)
print(sum)

# 변수를 활용하여 루프를 탈출하는 방법
c = 0
d = 1
while (d==1):
  a = input()
  if (a=='s' or a =='S'):
    d=0
  else:
    a = int(a)
    c += a
print(c)
# 사람별 평균을 구하라.
# kor_score = [39, 69, 20, 100, 80]
# math_score = [32, 59, 85, 30, 90]
# eng_score = [49, 70, 48, 60, 100]
# midterm_score = [kor_score, math_score, eng_score]

kor_score = [39, 69, 20, 100, 80]
math_score = [32, 59, 85, 30, 90]
eng_score = [49, 70, 48, 60, 100]
midterm_score = [kor_score, math_score, eng_score]

# 학생별 총점 계산을 위한 리스트 초기화
student_score = [0] * len(kor_score)

# 각 과목의 점수를 학생별로 합산
for subject in midterm_score:
  for i in range(len(student_score)):
    student_score[i] += subject[i]

# 학생별 평균 계산
student_average = []
for score in student_score:
  average = score / len(midterm_score)
  student_average.append(average)

print(student_average)

함수(1)

  • 함수 내에 return값이 있는 경우와 없는 경우
# return이 있는 경우
def add(a, b):
  result = a + b
  return result

c = add(3, 5)
print(c)

# return이 없는 경우
def sub(a, b):
  print("뺄셈의 결과는 %d입니다." %(a - b))
  return

d = sub(1, 2)
print(d) # None
def f(x):
  print(x + 10)

f(10)
c = f(10)
print(c) # None
  • 구구단 예제에서 함수를 사용할 때와 사용하지 않을 때
# 함수를 사용하지 않을 때
for i in range(1, 10):
  print(f'====={i}단=====')
  for j in range(1, 10):
    print(i * j)

# 함수를 사용할 때
def gugu(num):
  print(f'====={num}단=====')
  for i in range(1, 10):
    print(f'{num} x {i} = {num * i}')

gugu(2)
def Sandwich(eggs):
  eggs.append(1) # 기존 객체의 주소값에 [1] 추가
  eggs = [2, 3]

ham = [0]
Sandwich(ham)
print(ham)
print(eggs) # eggs는 지역변수라 접근이 불가능함
# name 'eggs' is not defined

함수의 3가지 전달 방식

  • 값에 의한 호출(call by value)
  • 참조에 의한 호출(call by reference)
  • 객체 참조에 의한 호출(call by object reference)

1. swap_value(x, y) (값에 의한 호출)

def swap_value(x, y):
  temp = x
  x = y
  y = temp
  • 동작 방식: 이 함수는 값을 복사해서 사용합니다.

    • a[1]a[2]의 값을 함수로 전달하면, 새로운 변수 xy가 그 값을 복사받습니다.
    • 함수 내부에서 xy를 바꿔도 원본 리스트 a에는 아무 영향을 주지 않습니다.
  • 메모리:

    • 함수 호출 시 새로운 메모리 공간에 xy를 생성하여, a[1]a[2]의 값을 복사합니다.
    • 함수 종료 후 xy는 메모리에서 사라집니다.
  • 결과: 리스트 a는 변경되지 않습니다.
    => 즉, 함수에 인자를 넘길 때 값만 넘기고 함수 내에 인자 값 변경시에 호출자에게 영향을 주지 않는다.


2. swap_offset(offset_x, offset_y) (참조에 대한 호출)

def swap_offset(offset_x, offset_y):
  temp = a[offset_x]
  a[offset_x] = a[offset_y]
  a[offset_y] = temp
  • 동작 방식: 이 함수는 리스트 a인덱스(참조 위치)를 전달받아 해당 위치의 값을 직접 바꿉니다.

    • a[offset_x]a[offset_y]의 값을 교환합니다.
    • 리스트 a 자체가 수정됩니다.
  • 메모리:

    • 함수 호출 시 offset_xoffset_y는 값으로 전달되지만, 이 값은 리스트 a 내부의 요소를 참조합니다.
    • 리스트 a의 데이터는 기존 메모리를 그대로 사용하며, 직접 수정됩니다.
  • 결과: 리스트 a의 내용이 변경됩니다.
    => 즉, 함수에 인자를 넘길 때 메모리 주소를 넘기고 함수 내에 인자 값이 변경이 되면 호출자의 값도 변경된다.


3. swap_reference(list, offset_x, offset_y) (객체 참조에 대한 호출)

def swap_reference(list, offset_x, offset_y):
  temp = list[offset_x]
  list[offset_x] = list[offset_y]
  list[offset_y] = temp
  • 동작 방식: 리스트 a객체 참조를 전달받아 해당 객체의 내용을 수정합니다.

    • 함수 호출 시 list는 리스트 a를 참조합니다.
    • 따라서 list[offset_x]list[offset_y]의 값을 바꾸면 리스트 a의 내용도 바뀝니다.
  • 메모리:

    • 함수 호출 시 list는 리스트 a를 참조합니다. 리스트의 내용은 새로운 메모리에 복사되지 않고, 기존 리스트의 메모리를 그대로 사용합니다.
    • 함수 내부에서 list[offset_x]list[offset_y]를 수정하면 원본 리스트 a도 변경됩니다.
  • 결과: 리스트 a의 내용이 변경됩니다.
    => 즉, 객체의 주소가 함수로 전달되고 전달된 객체를 참조하여 변경 시 호출자에게 영향을 주나, 새로운 객체를 만들 경우 호출자에게 영향을 주지 않는다.


요약

  1. swap_value: 새로운 변수에 값을 복사하여 사용 (원본 변경 X)
  2. swap_offset: 리스트 a의 특정 요소를 직접 참조하여 값 교환 (원본 변경 O)
  3. swap_reference: 리스트 객체 자체를 참조하여 수정 (원본 변경 O)

실행 결과

a = [1, 2, 3, 4, 5]

swap_value(a[1], a[2])  # 값 복사, 원본 변경 없음
print(a)  # [1, 2, 3, 4, 5]

swap_offset(1, 2)       # 참조된 리스트 요소 직접 변경
print(a)  # [1, 3, 2, 4, 5]

swap_reference(a, 1, 2) # 리스트 객체 참조를 통한 변경
print(a)  # [1, 2, 3, 4, 5]

0개의 댓글