[제로베이스 데이터 분석 스쿨 2기] Python(feat. 함수, 인수와 매개변수, 전역 변수 & 지역 변수, global, 중첩 함수, lambda, 모듈)

박세우·2024년 1월 18일

함수

함수란, 특정 기능을 재사용하기 위해서 사용한다.

def add_cal ():
	n1 = int(input('n1: '))
	n2 = int(input('n2: '))
print(f'n1 + n2 = {n1+n2}')
add_cal()

def cal_fun():
	n1 = int(input('num1: '))
	n2 = int(input('num2: '))

print(f'n1 * n2 = {n1 * n2}')
print(f'n1 / n2 = {round(n1/n2)}')
cal_fun()

인수와 매개변수

def greet(customer): ---> 매개변수
	print(f'{customer})

greet('홍길동') ---> 인수

#매개변수 개수가 정해지지 않은 경우 '*'를 이용한다.
def print_number(*numbers):
	for number in numbers:
		print(number, end= '')
	print()

print_number()
print_number(1,2,3)
print_number(1,2,3,4,5,6)

실습

국어, 영어, 수학 점수를 입력받고, 입력받은 점수를 이용해서 총점과 평균을 출력하는 함수를 만들어 보자.

def print_score(kor, eng, math):
	sum = kor +eng + math
	avg = sum / 3

	print(f'총점: {sum}')
	print(f'평균: {avg}')
kor_score = int(input('korean score: '))
eng_score = int(input('english score: '))
math_score = int(input('math score: '))

print_score(kor_score, eng_score, math_score)

전역 변수 & 지역 변수

젼역 변수란, 함수 밖에서 정의한 변수. 함수 내부에서 수정할 수 없다.
지역 변수란, 함수 내에서 정의된 변수. 함수가 호출되는 그 순간에만 존재한다.

num_out = 10 #전역변수
def print_numbers():
	num_out = 20 #지역변수
	print(f'num_out: {num_out}')

print_numbers() #값은 20 지역변수 영향
print(f'num_out: {num_out}') #값은 10 전역변수 영향

실습

사용자가 가로, 세로 길이를 입력하면 삼각형과 사각형의 넓이를 출력하는 함수를 만들어보자.

width = int(input('가로 길이: '))
height = int(input('세로 길이: '))

def print_area():
	triangle = width * height/2
	square = width * height
	print(f'삼각형의 넓이는: {triangle}')
	print(f'사각형의 넓이는: {square}')
print_area()

global 키워드

global을 사용하면 함수 안에서도 전역 변수의 값을 수정할 수 있다.

num_out = 10
def print_numbers():
global num_out #전역변수 값 수정 가능
num_out = 20
print(f'num_out: {num_out}')

print_numbers() #값은 20 지역변수 영향
print(f'num_out: {num_out}') #값은 20 global 영향

실습

방문객 수를 카운트하는 함수를 만들어보자.
total_visit = 0

def total_visit_count():
	global total_visit

	total_visit = total_visit + 1
	print(f'누적 방문객 = {total_visit}')

total_visit_count()#누적 방문객 = 1
total_visit_count()#누적 방문객 = 2
total_visit_count()#누적 방문객 = 3
total_visit_count()#누적 방문객 = 4

중첩 함수

중첩 함수란, 함수안에 또 다른 함수가 있는 형태이다.
내부 함수를 함수 밖에서 호출할 수 없다.

def out_func():
	print('outfunc called')

def in_func():
	print('infunc called')
	in_func()

out_func()
in_func() --> error

실습

calculator()함수를 선언하고 이 함수안에 덧셈, 뺄셈, 곱셈, 나눗셈 함수를 선언하자.

def calculator(n1, n2, operator):

	def add_cal():
	print(f'덧셈 = {n1 + n2}')

	def sub_cal():
	print(f'뺄셈 = {n1 - n2}')

	def mul_cal():
	print(f'곱셈 = {n1 * n2}')

	def div_cal():
	print(f'나눗셈 = {n1 / n2}')

	if operator == 1:
		add_cal()
	elif operator == 2:
		sub_cal()
	elif operator == 3:
		mul_cal()
	elif operator == 4:
		div_cal()

while True:
	num1 = float(input('첫 번째 숫자 입력: '))
	num2 = float(input('두 번째 숫자 입력: '))
	operator = int(input('1. 덧셈, 2. 뺄셈, 3. 곱셈, 4. 나눗셈, 5. 종료'))

	if operator == 5:
		print('Thank you')
		break
calculator(num1, num2, operator)

lambda

lambda 키워드를 이용하면 함수 선언을 보다 간단하게 할 수 있다.

def calculator(n1,n2):
	return n1 + n2
	return_value = calculator(10,20)
	print(f'result = {return_value}')

#lambda를 사용하면

calculator = lambda n1,n2: n1 + n2
return_value = calculator(10,20)
print(f'result = {return_value}')

실습

삼각형, 사각형, 원의 넓이를 반환하는 lambda 함수를 만들어보자.

get_triangle_area = lambda n1,n2: n1 * n2 / 2
get_square_area = lambda n1,n2: n1 * n2
get_circle_area = lambda r: r * r * 3.14

weight = int(input('가로 길이: '))
height = int(input('세로 길이: '))
radius = int(input('반지름 길이: '))

triangle = get_triangle_area(weight, height)
square = get_square_area(weight, height)
circle = get_circle_area(radius)

print(f'triangle area = {triangle}')
print(f'square area = {square}')
print(f'circle area = {circle}')

모듈

모듈이란, 이미 만들어진 훌륭한 기능으로 사용자들이 쉽게 사용할 수 있다.

실습

1. random 모듈을 이용해서 1부터 10까지의 정수 중 난수 1개를 발생시켜 보자.
2. random 모듈을 이용해서 0부터 100사이의 난수 10개를 발생시켜 보자.

import random

r_number = random.randint(1,10) #random.randint(범위)
print(f'random number = {r_number}')

r_numbers = random.sample(range(1,101),10) #random.sample(범위, 갯수)
print(f'random numbers = {r_numbers}')

모듈 만들기

  1. 파이썬 파일을 만든다. (예시, calculator)
def add(n1, n2):
	print(f'덧셈의 결과 = {n1 + n2}')

def sub(n1, n2):
	print(f'뺄셈의 결과 = {n1 - n2}')

def mul(n1, n2):
	print(f'곱셈의 결과 = {n1 * n2}')

def div(n1, n2):
	print(f'나눗셈의 결과 = {n1 / n2}')
  1. 만든 파일의 이름을 import한 후 사용한다.
import calculator

calculator.add(10,20)
calculator.sub(10,20)
calculator.mul(10,20)
calculator.div(10,20)

모듈 사용(import, from, as)

import 키워드를 이용해서 모듈을 임포트 한다.

import키워드를 이용해서 모듈을 임포트 한다.
import calculator

calculator.add(10,20)
calculator.sub(10,20)
calculator.mul(10,20)
calculator.div(10,20)

as 키워드를 이용해서 모듈 이름을 단축 시킬 수 있다.

import calculator as cal

calculator.add(10,20)
calculator.sub(10,20)
calculator.mul(10,20)
calculator.div(10,20)

from~as 키워드를 이용해서 모듈의 특정 기능만 사용할 수 있다.

from calculator import add
add(10,20)

from calculator import add, sub
add(10,20)
sub(10,20)

from calculator import * -> 칼큘레이터에 있는 모든것을 가져오겠다.

실행(메인) 파일

실행 파일: 내가 모듈을 실행하는 파일

__name__ 전역 변수: 모듈 이름이 저장되거나, 실행 파일일 경우 '__main__'이 저장된다.

실습

실습
#1번 모듈 파일 (unitconversion)
def cm_to_mm(n):
	return round(n * 10,3)

def cm_to_inch(n):
	return round(n *0.393, 3)

def cm_to_m(n):
	return round(n * 0.01, 3)

def cm_to_ft(n):
	return round(n * 0.032, 3)

if __name__ == '__main__':
  print(f'10cm: {cm_to_mm(10)}mm')
  print(f'10cm: {cm_to_inch(10)}inch')
  print(f'10cm: {cm_to_ft(10)}ft')
  print(f'10cm: {cm_to_m(10)}m')

2번 실행 파일
import unitconversion as uc

if __name__ == '__main__':
	user_number = int(input('길이(cm) 입력: '))

result_mm = uc.cm_to_mm(user_number)
result_inch = uc.cm_to_inch(user_number)
result_m = uc.cm_to_m(user_number)
result_ft = uc.cm_to_ft(user_number)

print(f'해당 길이의 mm 변환은 {result_mm}mm입니다.')
print(f'해당 길이의 inch 변환은 {result_inch}inch입니다.')
print(f'해당 길이의 m 변환은 {result_m}m입니다.')
print(f'해당 길이의 ft 변환은 {result_ft}ft입니다.')

자주 사용하는 모듈 모음

math 모듈: 수학 관련 모듈

#합
list = [2, 4, 5, 3, 29]
print(sum(list))

#최댓값
print(max(list))

#최솟값
print(min(list))

#거듭제곱
print(pow(12,2)) #12의 2제곱

#반올림
print(round(3.13432,2))

import math

#절댓값
print(math.abs(-10))

#올림
print(math.ceil(5.81))

#내림
print(math.floor(5.22))

#버림
print(math.trunc(5.32))

#최대공약수
print(math.gcd(14,21))

#팩토리얼
print(math.factorial(10))

#제곱근
print(math.sqrt(4))

random 모듈: 난수 관련 모듈

#1~10까지 난수 1개
random.randint(1,10)

#1~50까지 난수 5개
random.sample(range(1,50),5)

time 모듈: 시간 관련 모듈

#년도
print(f'localtime year: {local_time.tm_year}')
#월
print(f'localtime month: {local_time.tm_mon}')
#일자
print(f'localtime day: {local_time.tm_mday}')
#시
print(f'localtime hour: {local_time.tm_hour}')
#분
print(f'localtime min: {local_time.tm_min}')
#초
print(f'localtime second: {local_time.tm_sec}')
#요일 (0부터 월요일)
print(f'localtime week of day: {local_time.tm_wday}')
profile
최고의 데이터 분석가를 목표로 하는 박세우입니다.

0개의 댓글