파이썬 & 사용자 정의 함수

Suhyeon Lee·2024년 10월 28일
0

Python

  • 객체지향 프로그래밍과 구조적 프로그래밍을 지원하는 플랫폼 독립적인 언어
  • 1991년 프로그래머인 Guido van Rossum에 의해 처음 배포됨
  • 파이썬의 이름은 영국 BBC에서 방영된 코미디물 "Monty Python's Flying Circus"에서 따온 것
  • 사용이 쉽고 플랫폼 독립적이라 인기가 많음

장점

  • 라이센스가 무료
  • 개발이 쉽고 빠름
    • 파이썬은 인터프리터 언어로 따로 컴파일 과정을 거치지 않기 때문에 개발 시간을 줄일 수 있음
    • 표준 라이브러리를 제공해 줘서 라이브러리를 사용함으로써 개발을 쉽고 빠르게 할 수 있음
    • 서드파티 라이브러리도 풍부함
  • 확장성
    • 표준 라이브러리 외에도 C 라이브러리 함수를 call할 수 있음
  • 가독성
    • 파이썬은 들여쓰기를 통해 블록을 구분하는 문법적 특징을 가짐(C언어는 괄호 이용)
    • C언어의 경우 개발자에 따라 같은 내용을 여러 형식으로 개발해 다른 사람이 수정할 때 어려울 수 있지만 파이썬은 문법이 엄격해 가독성이 높음
      ※ 파이썬 들여쓰기는 탭을 허용하지 않고 반드시 공백으로 들여쓰기를 해야 함(공백 4개 권장)
      하지만 에디터를 사용하면 탭 눌렀을 떄 알아서 들여쓰기 공백 4개 해 주니 걱정하지 말 것
  • 메모리 관리를 안 해도 됨
    • 파이썬은 알아서 메모리 관리를 해 주므로 코딩 시 신경을 안 써도 되므로 편함
      • C 언어를 써본 개발자라면 메모리 관리를 알아서 해 주는 것이 얼마나 편한지 이해할 것
    • 하지만 이것이 속도를 느리게 하므로 단점으로 작용하기도 함

→ C언어의 간단한 예제

/*Sample C program*/

#include <stdio.h>

int main() {
	int year = 2020;
    printf("Hello World!\n)"
    printf("올해는 %d 년도 입니다\n", year);
    return 0
}
  • new line이 자동으로 안 들어가므로 \n 넣어줘야 함
  • 블록 구분은 괄호로 구분
  • 들여쓰기는 안 해도 되지만 보통은 가독성을 높이기 위해 개발자들이 알아서 함

→ Python의 간단한 예제

# Sample Python program

year = 2020
print("Hello World!")
print("올해는 %d 년도 입니다"%(year))
  • 자료구조형을 선언 안 해도 파이썬이 알아서 숫자, 문자를 구분
    • '동적 타입'이라고 함

→ Python 들여쓰기

def fib(n):
    a, b = 0, 1
    while a < n:
        print(a, end = ' ')
        a, b = b, a+b
    print()
fib(500)

# 출력 결과:
# 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
  • 블록을 구분할 때는 들여쓰기로 구분 → 가독성 좋음
  • 단, Tab은 안 됩니다.

단점

  • 컴파일 언어보단 느림
    • 인터프리터 언어이므로 컴파일 언어인 C보단 느림

파이썬을 사용하는 이유

  • C보다 사용하기 쉬움 & 유연함
    • 개발 시간을 효울적으로 사용할 수 있음
  • 속도 측면에서 최적화가 필요할 경우 C 라이브러리를 쉽게 연결할 수 있음

🡆 이런 이유로 머신 러닝, AI 뿐만 아니라 과학계에서 파이썬 사용이 지속적으로 증가

함수는 무엇일까?

함수와 메서드

  • 함수(function): 특정 기능을 수행하는 코드 또는 코드의 모임
    • 사용자 정의 함수: 사용자가 필요에 의해서 만드는 함수
      cf. 내장 함수: 파이썬이 기본으로 제공하는 함수
# 함수: '특정 기능'을 수행. '매개변수'로 자료를 전달
my_list = [1, 2, 3]
len(my_list)
sum(my_list)
max(my_list)
  • 메서드(method): 특정 자료에 대해 특정 기능을 하는 코드
    • 리스트 자료형에 적용할 수 있는.append(), .sort() 등이 리스트의 메서드에 해당
# 메서드: '특정 자료형'에서 '특정 기능'을 수행. 자료명 뒤에 마침표(.)를 찍어서 사용
my_list = [1, 2, 3]
my_list.append(0)
my_list.sort()
my_list.pop()

예시: 파이썬 제공 내장 함수 len()

  • 문자열이나 리스트 등의 길이를 알려줌
    • len(인수)
      • 인수를 넣으면 계산을 해서 길이 값을 반환
>>> x = "1234567890"
>>> len(x)
10
  • len() 함수를 파이썬으로 구현하면 다음과 같음
x = "1234567890"
i = 0
for temp in x:
    i += 1
print(i)

→ 두 줄이면 될 코딩이 5줄이 되었음

  • 문자열이나 리스트 등의 길이를 구하는 일은 자주 코딩하게 되는데 함수가 없다면 이럴 때마다 5줄의 코딩을 반복해야 함
    • 또한 len()이라고 코딩하면 길이를 구하는 걸 단번에 알지만 위의 코딩으로 하면 5줄을 보면서 분석하는 단계를 거쳐야 함

🡆 함수는 가독성 뿐만 아니라 재사용 가능한 내용을 여러 번 반복하지 않고 한 번의 정의로 간단하게 사용할 수 있다는 장점이 있음!

🡆 프로그램 코딩 시 길게 코딩하면 흐름을 판단하기 어려워져 디버깅(오류가 발생하는 부분 찾기)이 어려움 → 함수를 사용해 프로그램을 좀 더 간결하게 적을 수 있고 흐름 파악도 쉬어짐

함수 정의

  • 함수는 def로 정의
    • 들여쓰기까지를 하나의 함수로 봄
def 함수명(매개변수):
    <실행할 문장>
    <실행할 문장>return 결과값
  • 함수를 사용하기 전에 함수가 정의되어야 함
  • 함수명은 변수명 규칙과 동일
  • 매개변수는 없어도 되고 여러 개일 수도 있음
    • 매개변수(parameter)
      • 함수에 전달되는 변수(variable)
      • 인자, 파라미터, 인수(argument)라고도 함

인수(argument)와 인자(parameter, 매개변수)의 차이

  • 인자 값(Parameter), 매개변수(Parameter)
    • 함수를 정의할 때 외부로부터 받아들이는 임의의 값
    • 인자 값 == 매개변수 == Parameter
function 함수(a, b)
    return a+b
# 여기에서 a, b가 파라미터
# 파라미터: 함소의 정의에서 사용되는 변수
  • 인수(Argument)
    • 함수를 호출할 때 사용되는 값
    • 위의 함수를 호출한다고 하면 함수(3, 4)에서 3, 4의 값이 인수(argument)에 해당
      • "파라미터의 값으로 아규먼트 3과 4를 대입"이라는 의미
  • return은 return 다음의 결과값은 반환해 주면서 함수를 끝냄
    • 결과값이 없으면 return은 없어도 됨

매개변수 만들기: 가변 및 디폴트값 설정

  • 함수는 매개변수가 없을 수도 있고 여러 개 있을 수도 있음

예시 1

# 출력 함수 정의
>>> def in_print(x):
        print(x)

# 자료형에 상관없이 매개변수에 전달되는 자료형을
# 파이썬이 알아서 자료형 인지하고 받아들임
>>> in_print(1)
1

# 문자열 인자 전달
>>> in_print("abcd")
abcd

# 자료형 인자 전달
>>> in_print([1, 2, 3, 4])
[1, 2, 3, 4]

# 튜플형 인자 전달
>>> in_print([('a', 1), ('b', 2)])
[('a', 1), ('b', 2)]

# 매개변수의 개수가 다를 때 오류 발생
>>> in_print(1, 2)

예시 2: 함수 매개변수 여러 개 정의

  • 입력 값이 여러 개일 때에는 콤마 구분자 사용
# 입력 받은 3개의 매개변수를 합하는 함수
>>> def user_sum(x, y, z):
        return x+y+z

# 인수는 순서대로 전달: 1 → x, 2 → y, 3 → z
>> print(user_sum(1, 2, 3))
6
>> print(user_sum(3, 4, 5))
12
# 파이썬이 매개변수를 받을 땐 자료형을 알아서 받아주지만
# return x+y+z에서 숫자와 문자를 더할 수 없어
# 오류 발생
>> print(user_sum(1, 'a', 4))

# 인수의 개수가 달라도 오류 발생
>> print(user_sum(1, 2))

예시 3: 함수 매개변수의 이름을 지정하여 호출

  • 함수 호출 시 순서가 틀려도 매개변수 이름을 지정해 호출 가능
    • 매개변수명이 지정이 되면 지정된 대로, 지정이 안 되면 순서대로 전달
# 함수 정의
>>> def subtraction(x, y):
        return x-y

# 5 → x, 3 → y에 전달되어 5-3의 결과가 나옴
>>> a = subtraction(5, 3)
>>> print(a)
2

# 5 → y, 3 → 3이므로 3-5의 결과가 나옴
>>> a = subtraction(y=5, x=3)
>>> print(a)
-2

예시 4: 함수 매개변수의 개수를 기반으로 하고 싶을 경우

  • 함수 정의 시 같은 기능을 하지만 함수 호출 시마다 인수의 개수가 달라질 경루 가변의 매개변수를 정의할 수 있음
    • 매개변수명 앞에 * 사용
# 가장 큰 값을 구하는 함수를 정의
>>>> def user_max(*args):
        ret = args[0]
        for x in args:
            if x>ret: ret=x
        return ret

>>> print(user_max(1, 4, 6, 3, 8))
8
>>> print(user_max(9, -10, -4, 3, 5, 0, 1))
9
>>> print(user_max(1))
1
>>> print(user_max(1, 6))
6
>>> print(user_max('c', 'a', 'b'))
'c'
  • 매개변수 전달 과정이 궁금하면 함수 한에 print를 코딩하여 단계별로 출력되게 만들면 됨
    • 확인해 보면 튜플 형식으로 전달되는 걸 알 수 있음
>>>> def user_max(*args):
        print(args)
        ret = args[0]
        for x in args:
            if x>ret: ret=x
        return ret

>>> print(user_max(1, 4, 6, 3, 8))
(1, 4, 6, 3, 8)
8
>>> print(user_max(9, -10, -4, 3, 5, 0, 1))
(9, -10, -4, 3, 5, 0, 1)
9
>>> print(user_max('c', 'a', 'b'))
('c', 'a', 'b')
'c'

예시 5: 함수의 매개변수 디폴트값(초기값) 설정 방법

  • 파이썬 내장 함수를 사용하다 보면 실제 정의되어 있는 매개변수는 있는데 인자로 전달하지 않아도 되는 값들이 있는 걸 알 수 있음
    • 기본 설정 값이 있어서 인자로 전달하지 않으면 기본 설정 값이 적용됨
# 마지막 매개변수 option이 
# True이거나 값이 없으면 곱하기
# False이면 나누기를 하는 함수
>>> def calculate(x, y, option=True):
        if option: ret = x*y
        else: ret = x/y
        return ret
>>> calculate(8, 4, True)
32

# 값이 없으면 초기값인 True → 곱하기
>>> calculate(8, 4)
32

# 나누기
>>> calculate(8, 4, False)
2.0

return

  • 함수 호출 후 결과값 반환해주는 것
  • 있을 수도 있고 없을 수도 있음
    • 리턴값이 없는 함수는 "None" 반환
>>> def test():
    print("Hello")
>>> priont(test())
Hello # test라는 함수를 실행해서 출력됨
None # print(test())의 test() 함수 결과값 출력
  • 리턴을 사용하지만 결과값을 지정 안 할 수도 있음
    • 함수를 끝낼 때 사용
  • 디버깅 시 중간에 함수를 끝내고 싶을 경우 return을 사용하기도 함
    • return을 단독으로 사용하는(=비워두는) 방식으로 함수를 즉시 빠져나갈 수 있음
>>> def test():
    print("Hello")
    return # 중간에 return되므로 World는 출력 X
    print("World")
>>> test()
Hello

>> print(test())
Hello
None

return 결과값에 들어갈 수 있는 것

  • 수식 뿐만 아니라 파이썬 실행 구문을 사용할 수 있음
  • 함수를 호출할 경우 결과값을 변수로 받을 수 있음
    • 보통은 변수를 받아서 처리
>>> def user_sum(x, y, z):
        return x+y+z
>>> a = user_sum(1, 2, 3)
>>> print(a)
6
  • 값은 2개 이상 리턴하는 함수는 결과값을 하나의 변수로 받아도 오류 발생 x
    • 단지 튜플 형식으로 반환할 뿐
      • 튜플로 묶인 이유: 함수는 언제나 하나의 값만 return할 수 있기 때문
>>> def calc(x, y, z):
        return x+y+z, x*y*z

>>> a = calc(2, 3, 4)
>>> print(a)
(9, 24)

# 리턴 값을 각각의 변수로 반환 받고 싶으면
# 콤마 구분자로 각각 받아도 되고
# 튜플 형식으로 받아도 됨
>>> a, b = calc(2, 3, 4)
>>> print(a)
9
>>> print(b)
24

>>> (a, b) = calc(2, 3, 4)
>>> print(a)
9
>>> print(b)
24

두 개 이상의 return

  • 하나의 return에 하나의 산식만 적어주고, return의 개수를 늘리는 경우 어떻게 출력될까?
>>> def calc(x, y, z):
        return x+y+z
        return x*y*z

>>> a = calc(2, 3, 4)
>>> print(a)
9

→ xyz의 값은 출력되지 않음!
함수는 return문을 만나는 순간 리턴값을 반환한 다음 함수를 빠져나가게 되어 있기 때문

함수 안에서 선언한 변수의 효력 범위

a = 3

def solution(a):
    a += 1

solution(a)
print(a)
  • 위와 같이 함수를 입력했을 때 결과값은 어떻게 될까?
    • 정답은 3
    • 함수 안에서 사용하는 매개변수는 함수 안에서만 효력을 미치기 때문
      - 함수 안에 print(a) 넣으면 4 나옴
def solution(a):
    a += 1

solution(4)
print(a)
  • 위와 같이 함수를 만들면 어떤 값이 출력될까?
    • 오류 메시지
      • 변수 a를 지정하지 않았다는 말
        a에 숫자 4가 들어가서 1이 더해진 숫자 5가 함수 내에서는 만들어지지만 함수 내에서 print(a)를 적어주지 않았기 때문에 출력되는 값은 없음
        또한 함수 바깥에서 print(a)를 하려고 해도 a라는 변수가 없기 때문에 오류 메시지가 뜸!

함수 안에서 함수 밖 변수 변경

  1. global 명령어

    • global 함수를 사용하게 되면 외부 변수에 종속되기 때문에 가급적 사용을 지양해야 함
  2. return 사용

a = 3

def example(a):
    a = a + 5
    return a

a = example(a)
print(a)

# 살행 결과: 8
  • example 함수에 return값을 넣어주고 함수 바깥에서 변수 a가 example을 가리키도록 한다면 숫자 8이 출력됨
  1. lambda 예약어 사용
  • 함수 이름 = lambda 매개변수1, 매개변수2, … : 매개변수를 이용한 표현식
    • 보통 함수를 한 줄로 간결하게 만들 때 사용
    • 함수를 사용해야 할 정도로 복잡하지 않거나 함수를 사용할 수 없는 곳에 사용
multiple = lambda a, b : a*b
result = multiple(5, 7)
print(result)

# 실행 결과: 35

if문

기본 구조

if 조건문:
    수행할_문장1
    수행할_문장2
    ...
else:
    수행할_문장A
    수행할_문장B
    ...
  • 조건문을 테스트해서 참이면 if 문 바로 다음 문장(if 블록)들을 수행하고 조건문이 거짓이면 else 문 다음 문장(else 블록)들을 수행
    • 따라서 else 문은 if 문 없이 독립적으로 사용할 수 없음

들여쓰기(indentation) 방법

  • 그렇다면 들여쓰기는 공백 문자([Spacebar])로 하는 것이 좋을까, 탭 문자([Tab])로 하는 것이 좋을까?
    • 공백 문자로 하자는 쪽과 탭 문자로 하자는 쪽 모두가 동의하는 내용은 2가지를 혼용해서 쓰지 말자는 것
      • 탭이나 공백은 프로그램 소스에서 눈으로 보이는 것이 아니기 때문에 혼용해서 쓰면 오류의 원인이 되므로 주의
    • 파이썬 커뮤니티에서는 들여쓰기를 할 때 공백 문자 4개를 사용하는 것을 권장
    • 또한 파이썬 에디터는 대부분 탭 문자로 들여쓰기를 하더라도 탭 문자를 공백 문자 4개로 자동 변환함

조건문 다음에 콜론(:) 잊지 말기

  • if 조건문 뒤에는 반드시 콜론(:)이 붙어야 함
    • 어떤 특별한 의미가 있는 건 아니고 파이썬의 문법 구조임
  • while이나 for, def, class도 역시 문장의 끝에 콜론(:)이 항상 들어가야 함!

파이썬이 다른 언어보다 보기 쉽고 소스 코드가 간결한 이유는 바로 콜론(:)을 사용하여 들여쓰기를 하도록 만들었기 때문이다. 하지만 이는 숙련된 프로그래머들이 파이썬을 처음 접할 때 제일 혼란스러워하는 부분이기도 하다. 다른 언어에서는 if 문에 속한 문장들을 {}로 감싸지만, 파이썬에서는 들여쓰기로 해결한다는 점을 기억하자.

조건문에서 아무 일도 하지 않게 설정

  • 조건문의 참, 거짓에 따라 실행할 행동을 정의할 때나 아무런 일도 하지 않도록 설정하고 싶을 때 pass를 적용해서 구현
    • "주머니에 돈이 있으면 가만히 있고, 주머니에 돈이 없으면 카드를 꺼내라.:
>>> pocket = ['paper', 'money', 'cellphone']
>>> if 'money' in pocket:
...     pass 
... else:
...     print("카드를 꺼내라")
...

→ pocket 리스트 안에 money 문자열이 있기 때문에 if 문 다음 문장인 pass가 수행되고 아무런 결괏값도 보여 주지 않음

elif

  • if와 else만으로 판단하기 어려운 다양한 조건을 해결하기 위해 다중 조건 판단을 가능하게 하는 elif 사용
  • 이전 조건문이 거짓일 때 수행
if 조건문:
    수행할_문장1 
    수행할_문장2
    ...
elif 조건문:
    수행할_문장1
    수행할_문장2
    ...
elif 조건문:
    수행할_문장1
    수행할_문장2
    ...
...
else:
   수행할_문장1
   수행할_문장2
   ... 

if문 한 줄 작성

  • 수행할 문장이 한 줄일 때 좀 더 간략하게 코드를 작성할 수 있음
    • if문 다음에 수행할 문장을 콜론(:) 바로 뒤에 적기
>>> pocket = ['paper', 'money', 'cellphone']
>>> if 'money' in pocket: pass
... else: print("카드를 꺼내라")

조건부 표현식(conditional expression)

  • 변수 = 조건문이_참인_경우의_값 if 조건문 else 조건문이_거짓인_경우의_값
    • 가독성에 유리하고 한 줄로 작성할 수 있어 활용성이 좋음
      e.g.
      message = "success" if score >= 60 else "failure"
profile
2 B R 0 2 B

0개의 댓글