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

mini_bang·2025년 1월 9일

함수(2)

나눗셈 결과 반환 함수

  • 두 개의 숫자를 입력받아 몫과 나머지를 튜플로 반환하는 함수
  • 작은 수로 큰 수를 나눈 몫과 나머지를 반환하며, 작은 수가 0일 경우 예외 처리
// 실습 코드
# 두 개의 숫자를 input으로 받으면 앞의 숫자를 뒤의 숫자로 나누는 함수이다.
# 나눗셈을 한 후에는 몫과 나머지 순으로 된 튜플값을 반환한다.
def div(a,b):
  return (a//b, a%b)

div(3, 5)
// 실습 코드
# 두 개의 숫자를 input으로 받으면 작은 수로 큰 수를 나눈 몫과 나머지를 반환하는 함수이다.
# 반환 값은 튜플로 되어 있으며 몫, 나머지 순으로 되어있다.
# 단, 0으로 나누는 것은 불가하기 때문에 두 수 중에 작은 수가 0이라면 화면에 '0은 사용할 수 없습니다.'를 출력하고 종료되어야 한다.
def div3(a, b):
  if a < b:
    big = b
    small = a
  elif b <= a:
    big = a
    small = b
  else:
    print("정수가 아닙니다.")
  if small == 0:
    print("0을 사용할 수 없습니다.")
  # elif abs(big) < 0 or abs(small) < 0:
  #   print("정수를 입력해주세요.")
  else:
    q = big // small
    r = big % small
    return (q, r)

매개변수 기본값 설정

  • 매개변수의 초기값을 미리 설정해 사용하는 함수
// 실습 코드
def function(a, n=2):
  print("%d의 제곱은 %d 입니다." %(a, a**n))

function(4)
  • 매개변수 개수가 정해지지 않은 경우 *args를 사용하여 입력을 튜플로 묶는 함수
// 실습 코드
# 매개변수가 몇 개가 필요할지 모를 때 매개변수에 *args를 붙이면 함수가 받은 input을 모두 튜플로 묶어줌 !
def test(*args):   # *args는 튜플만 받는 특징이 있음
  print(args)

test(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
test([1, 2, 3, 4, 5])
test[1, 2, 3, 4, 4]

# TypeError                                 Traceback (most recent call last)
# <ipython-input-7-45e69da7f7f8> in <cell line: 7>()
#       5 test(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
#       6 test([1, 2, 3, 4, 5])
# ----> 7 test[1, 2, 3, 4, 4]
# TypeError: 'function' object is not subscriptable
  • **kwargs를 사용해 입력된 데이터를 딕셔너리로 처리하는 함수
// 실습 코드
# 매개변수가 몇 개가 필요할지 모를 때 매개변수에 **kwargs를 붙이면 함수가 받은 input을 모두 dict로 묶어줌 !
def test(**kwargs):  # keyword argument, **kwargs는 dict만 받는 특징이 있음
  print(kwargs)

test(a=1, b=2, c=3)

문자열을 일정 단위로 나누어 출력하는 함수

  • 문자열을 입력받아 기본 단위로 나누거나 지정된 단위로 나누어 출력
// 실습 코드
# 어떠한 string을 받으면 일정한 단위로 끊어서 화면에 출력하는 함수를 짜보자.
# 끊는 단위는 따로 정하지 않으면 2로 설정해보자.
# Hint: input을 string과 unit = 2로 받고, while을 사용하고, 길이는 len함수를 사용하도록 하자.
def func(string, unit = 2):
  i = 0
  while i < len(string):
    print(string[i:i+unit])
    i += unit

func('테스트를 위한 문장입니다.')
func('테스트를 위한 문장입니다.', 4)

여러 숫자의 합 계산 함수 (add_all)

  • 다양한 형식의 입력값(튜플, 리스트, 튜플과 리스트 혼합)을 받아 합을 계산하는 함수
// 실습 코드
# add_all 함수를 짜봅시다.(매개변수 튜플)
def add_all(*inputs):
  sum = 0
  for i in range(len(inputs)):
    sum += inputs[i]
  print(inputs)
  print(sum)

add_all(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// 실습 코드
# add_all 함수를 짜봅시다.(매개변수 리스트)
def add_all(*args):
  sum = 0
  for i in args:
    for j in i:
      sum += j
    print(args)
  return sum

add_all([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
// 실습 코드
# add_all 함수를 짜봅시다.(매개변수에 튜플, 리스트 동시에 받을 수 있도록)
def add_all(*args):
  temp = 0
  for i in range(len(args)):
    if type(args[i]) == list:
      for j in args[i]:
        temp += j
    else:
      temp += args[i]
  return temp

print(add_all(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
print(add_all([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))

함수의 지역변수와 전역변수

  • 함수 내부 변수(지역변수)와 외부 변수(전역변수)의 동작 방식
  • global 키워드를 사용하여 전역변수를 수정하는 예시
// 실습 코드
# 함수 안에 선언한 변수를 함수 밖에서도 사용할 수 있는가? => NO!
def myfunction():
  in_val = '함수 안의 변수' # 지역변수

print(myfunction())
# print(in_val)


a = 1
def myfunction2(a):
  a += 1 # 지역변수
  print(a) # 지역변수

myfunction2(a)  # 여기서 a는 지역변수
print(a)  # 전역변수


def myfunction3():
  global a    # 글로벌변수: 전역변수로도 사용가능. 권장하지는 않음
  a += 1
  print(a)
myfunction3()
print(a)
// 실습 코드
a = 1
print('처음에 있는 전역변수', a)
def myfunction4():
  global a
  a += 1
  print('안에 있는 a', a)
myfunction4()
print('밖에 있는 a', a)
// 실습 코드
def myfunction3(a):
  a += 1
  print(a)
  return a

def myfunction4():
  global a
  a += 1
  print(a)
// 실습 코드
for _ in range(5):
  c = myfunction3(a)
  print('함수의 결과 : %d' %c)
  print('a의 값 : %d' %a)
// 실습 코드
for _ in range(5):
  myfunction4()
  print('a의 값 : %d' %a)
  • 함수 외부에서 데이터가 변경되는 예시(딕셔너리)
// 실습 코드
data = {"a": 1}

def myfunction3(data):
  data["a"] += 1
  print(data["a"])

myfunction3(data)		# 2
print("함수 밖의 a: ", data["a"])	# 함수 밖의 a:  2

팩토리얼 계산 함수

  • 반복문을 사용한 팩토리얼 계산
// 실습 코드
# 재귀적으로 하지 않은 것.
def fact(num):
  f = 1 # 곱을 계산할 변수의 초깃값
  for i in range(1, num+1): # 1부터 num까지 반복
    f = f*i
  return f

fact(5)
  • 재귀를 사용한 팩토리얼 계산
// 실습 코드
# 재귀적으로 하는 것
def fact(num):
  if num <= 1:  # num이 1이하이면 종료조건.
    return 1
  return num * fact(num-1)

fact(5)

파이썬 심화(1)

  • 리스트로 받은 사람들에게 대기번호를 부여하고 출력하며, 대기번호와 이름의 튜플 리스트를 반환하는 함수
// 실습 코드
# 여기는 동네 유명한 빵집이다. 사람들에게 먼저 온 순서대로 번호표를 나누어 주려고 한다.
# 번호 표를 나누어주는 함수를 작성해보자.
# 함수는 사람이름으로 되어 있는 리스트를 받아서 "대기번호 x번 : 사람 이름"을 화면에 출력하고
# (번호표, 사람이름)을 원소로 이루어진 리스트를 반환한다.
people = ['펭수', '뽀로로', '뚝딱이', '텔레토비']

def func1(line):
  new_lines = []
  i = 1 # 대기 번호를 트래킹하는 변수 i
  for x in line:
    print("대기번호 : %d 번 : %s" %(i, x))
    new_lines.append((i, x))
    i += 1 # 별도로 업데이트를 해주어야 함.
  return new_lines

func1(people)

enumerate 사용 예제

  • 반복 가능한 객체의 인덱스와 원소를 동시에 접근하는 방법
  • 리스트, 문자열, 집합, 딕셔너리를 사용한 예제
// 실습 코드
# enumerate: 반복가능한 객체의 인덱스와 원소에 함께 접근할 수 있는 함수
# list
lst = ['a', 'b', 'c']
for x in enumerate(lst):
  print(x)
print("===")

# string
st = 'abcd'
for x in enumerate(st):
  print(x)
print("===")

# set
se = {'a', 'b', 'c'}  # 집합은 순서가 없다.
for x in enumerate(se):
  print(x)
print("===")

# dict
dic = {0 : 'p', 1 : 'b', 2 : 'd'}
for x in enumerate(dic):
  print(x)
print("===")
  • enumerate를 활용한 대기번호 부여 함수
// 실습 코드
# 위에 빵집 문제를 enumerate로 풀이
people = ['펭수', '뽀로로', '뚝딱이', '텔레토비']

def func1_with_enu(line):
  new_lines = []
  for idx, val in enumerate(line):
    print("대기번호 %d번 : %s" %(idx+1, val))
    new_lines.append((idx+1, val))
  return new_lines

lines = func1_with_enu(people)

zip 사용 예제

  • 여러 반복 가능한 객체를 병렬로 묶어주는 함수
  • 리스트와 문자열 등 다양한 조합을 사용하는 예제
// 실습 코드
# zip: 2개 이상의 반복가능한 객체들을 병렬적으로 묶어주는 함수, 각 원소들을 튜플의 형식으로 묶어줌
str_list = ['one', 'two', 'three', 'four']
num_list = [1, 2, 3, 4]

for i in zip(num_list, str_list):
  print(i)

s1 = '123'
s2 = 'abc'
s3 = 'ㄱㄴㄷ'
list(zip(s1, s2, s3))

lambda 함수 예제

  • 익명 함수와 이를 활용한 다양한 계산 및 함수 정의 예제
// 실습 코드
# lambda: 익명의 함수(함수를 간편하게 작성할 수 있음), 한 줄을 실행한 결과 값이 바로 반환값이 됨.
# 함수를 직접 만들 경우
def plus_two(num):
  return num+2
a = 2
b = plus_two(a)
print(b)

# lambda함수를 이용해서 함수를 작성하는 경우
lambda x : x + 2
func2 = lambda x : x + 2
c = func2(2)
print(c)

map 함수와 lambda를 사용한 리스트 변환

  • 리스트 항목의 제곱값 계산
// 실습 코드
items = [1, 2, 3, 4, 5]
squared = []
for i in items:
  squared.append(i * i)
print(squared)

squared_map = list(map(lambda x:x**2, items))
print(squared_map)

squared_map = map(lambda x:x**2, items) # cpu 주소
print(squared_map)
  • 리스트 항목을 문자열로 변환
// 실습 코드
# 함수를 정의하여 items의 요소들을 string(문자)로 바꾸는 것
items = [1, 24, 3, 6, 7]
def str_1(items):
  for i in range(len(items)):
    items[i] = str(items[i])
  return items
print(str_1(items))

# lambda와 map을 이용하여 itmes의 요소들을 string(문자)로 바꾸는 것
items = [1, 24, 3, 6, 7]
str_items = list(map(lambda x:str(x), items))
print(str_items)

리스트 컴프리헨션

  • 특정 조건에 맞는 리스트 생성
  • 리스트 요소를 처리하는 빠르고 간결한 방법
// 실습 코드
# 1~10까지의 정수를 항목으로 갖는 리스트 객체에서 map 함수와 lambda식을 이용해
# 항목의 제곱 값을 갖는 리스트를 반환하는 프로그램을 작성하십시오.
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = list(map(lambda x:x**2, a))
print(result)

result = list(map(lambda x:pow(x,2), a))
print(result)
// 실습 코드
list_2 = []
for x in range(10):
  list_2.append(x)
print(list_2)

list_3 = [x for x in range(10)]   # for문보다 처리속도 빠름
print(list_3)
  • 주어진 문장을 띄어쓰기 기준으로 나누고, 각 요소의 길이를 리스트로 저장
// 실습 코드
# 다음의 문장을 분석해보자.
# "코로나 바이러스를 예방하기 위해 사회적 거리두기를 실천합니다. 마스크를 끼고 손씻기를 생활화 합시다."
# 라는 문장을 듸어쓰기 별로 분석하려고 한다. 띄어쓰기별로 문장을 나눈 후 각 요소의 길이를 리스트에 저장하라
# HINT: 띄어쓰기는 split함수를 사용하라.

s = "코로나 바이러스를 예방하기 위해 사회적 거리두기를 실천합니다. 마스크를 끼고 손씻기를 생활화 합시다."
lis = []
for s in s.split():
  lis.append(len(s))
print(lis)

s = "코로나 바이러스를 예방하기 위해 사회적 거리두기를 실천합니다. 마스크를 끼고 손씻기를 생활화 합시다."
func = [len(s) for s in s.split()]
print(func)
  • 조건에 맞는 요소만 리스트에 저장하는 예제
// 실습 코드
lc_2 = [x for x in range(10, 21) if x % 2 == 0]
print(lc_2)
  • 1~10의 제곱수 중 50 이하의 수만 저장
// 실습 코드
# for문 + if문
# 1부터 10의 제곱수 중 50이하인 수만 리스트에 저장하라.

lc_3 = [x**2 for x in range(1, 11) if x**2 <= 50]
print(lc_3)
  • 요소 길이가 5 미만인 문장 요소만 저장
// 실습 코드
# 다음의 문장을 분석해보자.
# "코로나 바이러스를 예방하기 위해 사회적 거리두기를 실천합니다. 마스크를 끼고 손씻기를 생활화 합시다."
# 라는 문장을 띄어쓰기별로 분석하려고 한다. 띄어쓰기별로 문장을 나눈 후 각 요소의 길이가 5미만인 것들만 리스트에 저장하라.
s = "코로나 바이러스를 예방하기 위해 사회적 거리두기를 실천합니다. 마스크를 끼고 손씻기를 생활화 합시다."
lis = []
for s in s.split():
  if len(s) < 5:
    lis.append(len(s))
print(lis)

s = "코로나 바이러스를 예방하기 위해 사회적 거리두기를 실천합니다. 마스크를 끼고 손씻기를 생활화 합시다."
len_condition = [s for s in s.split() if len(s) < 5]
print(len_condition)

리스트 컴프리헨션에서 if-else 활용

  • 짝수는 제곱, 홀수는 세제곱으로 처리
// 실습 코드
list_4 = []
for x in range(1, 11):
  if x % 2 == 0:
    list_4.append(x**2)
  else:
    list_4.append(x**3)
print(list_4)

list_5 = [x**2 if x % 2 == 0 else x**3 for x in range(1, 11)]
print(list_5)
  • 40 이하의 숫자는 5를 더하고, 초과는 41로 저장
// 실습 코드
# for문 + if문
# 40이하의 숫자는 5를 더하고, 40초과의 숫자는 41로 바꾸어 리스트로 저장하고, 리스트를 출력하라.
list_6 = [12, 67, 32, 48, 19, 57, 29, 49]
list_7 = [x + 5 if x <= 40 else 41 for x in list_6]
print(list_7)
  • 주어진 학생 점수 데이터로 컷트라인 기준 통과 여부를 판단하여 결과를 튜플로 구성하여 리스트에 저장
// 실습 코드
# 컷트라인이 60점일때, 사람이름과 통과여부를 리스트로 담아서 출력하라. 이름과 통과여부는 튜플로 묶어있는 자료이다.
students = {"보라돌이" : 61, "뚜비" : 35, "나나" : 78, "뽀" : 88}
result = [(name, True) if score >= 60 else (name, False) for name, score in students.items()]
print(result)

0개의 댓글