[python] 함수, 람다

김재현·2023년 2월 26일
0

Python Grammar

목록 보기
11/12

1. 함수

1.1. 함수란?

  • 함수란 특정한 작업을 하나의 단위로 묶어놓은 것입니다.
  • 함수를 사용하면 불필요한 소스코드의 반복을 줄일 수 있습니다.
  • 함수의 시야(Scope) : 함수 안에 있는 문장의 내용은 함수 안에서만 존재합니다.

1.2 내장 함수 : 파이썬이 기본적으로 제공하는 함수

1.2.1 출력: print()

  • 괄호 안에 있는 메시지를 출력합니다.
  • 괄호 안에 아무것도 입력이 되어있지 않으면 빈줄이 출력되어 줄바꿈이 됩니다.
  • 콤마(,)를 붙여 여러 개를 출력할 수 있습니다.
  • 괄호 안에 콤마(,)와 함께 end=""를 입력하면 가로로 출력할 수 있다

1.2.2 사용자 입력: input()

  • 괄호 안에 입력한 프롬프트 문자열이 사용자로부터 입력을 요구합니다.
  • 사용자가 입력하기 전까지 프로그램이 잠시 멈춥니다. 이를 블록이라 합니다.
  • input 함수의 결과는 무조건 문자형 자료형입니다.

1.3 사용자 정의 함수 : 개발자가 직접 정의하여 사용할 수 있는 함수

def 함수이름 ():
  실행할 코드
  • 전역변수, 지역변수
    - 함수 밖에서 선언된 변수로, 함수 밖에서나 안에서나 모두 사용 가능합니다.
    - 지역변수 : 함수 안에서 선언된 변수로 함수 안에서만 사용 가능합니다.
# 함수 안의 num은, 함수 밖의 num과는 다른 새로운 지역변수
num = 10
def printNum():
  num = 20
  print(num)
  
printNum()
print(num)

20
10

  • global키워드
    함수 밖에 선언된 변수(전역변수)는 어디에서나 사용은 가능하지만 함수 안에서 수정은 할 수 없습니다.
    만약 함수 안에서 전역변수의 수정을 원할 경우에는 global 키워드를 사용합니다.
a = 0

def func():
  global a
  a += 1
  
for i in range(10)
  func()

print(a)

10


1.4 매개변수(parameter)

1.4.1 가변 매개변수

  • 가변 매개변수는 매개변수를 원하는 만큼 받을 수 있습니다.
  • 가변 매개변수 뒤에는 일반 매개변수가 올 수 없습니다.
  • 가변 매개변수는 하나만 사용할 수 있습니다.
def 함수이름(매개변수1, 매개변수2, *가변 매개변수):
  print(매개변수1)
  print(매개변수2)
  print(가변매개변수)

함수이름(0,1,2,3,4,5,6,7,8,9)

0
1
(2, 3, 4, 5, 6, 7, 8, 9)

1.4.2 기본 매개변수

  • 기본 매개변수는 매개변수에 아무것도 넣지 않아도 들어가는 값입니다.
  • 매개변수 이름을 지정하여 키워드 매개변수라고도 합니다.
  • '매개변수=값'의 형태로 되어있습니다.
  • 기본 매개변수 뒤에는 일반 매개변수가 올 수 없습니다.
def print_n_times(value, n=5):
  for i in range(n)
    print(value)

print_n_times("안녕하세요")

안녕하세요
안녕하세요
안녕하세요
안녕하세요
안녕하세요

1.4.3 매개변수의 순서

일반 매개변수 - 가변 매개변수 - 기본 매개변수 순서로 매개변수를 선언합니다.

def function(일반매개변수A, 일반매개변수B, *가변매개변수, 기본매개변수A=10, 기본매개변수B=20):
  print(일반매개변수A, 일반매개변수B)
  print(가변매개변수)
  print(기본매개변수A, 기본매개변수B)

function(0,1,2,3,4,5,6,7,8,9,10, 기본매개변수B=12)

0 1
(2,3,4,5,6,7,8,9,10)
10 12


1.5 반환값(return)

1.5.1 리턴

  • 함수안의 print()함수의 결과값은 휘발됩니다.
def add(a,b):
    result = a+b
    print(result)
    
x = add(3,2)
print(x)

none

  • 반면, return으로 반환된 결과값은 함수실행 이후에도 활용 가능합니다.
def add(a,b):
    result = a+b
    return result
    
x = add(3,2)

print(x)

5

  • 일반적으로 덧셈에서는 초깃값을 0으로, 곱셈에서는 초깃값을 1으로 설정합니다.
def 함수(매개변수):
  변수 = 초깃값
  # 여러 가지 처리
  # 여러 가지 처리
  # 여러 가지 처리
  return 변수
  • 파이썬에서 함수는 여러 개의 반환 값을 가질 수 있습니다.
def operator(a,b):
  add_var = a+b
  subtract_var = a-b
  multiply_var = a*b
  divide_var = a/b
  return add_var, subtract_var, multiply_var, divide_var

# 반환값이 여러 개인 경우 튜플의 형태로 반환됩니다.
print(operator(7,3))

# 튜플의 기능을 활용하여 변수에 값을 할당할 수 있습니다.
a, b, c, d = operator(7,3)
print(a, b, c, d)

(10, 4, 21, 2.3333333333333335)
10 4 21 2.3333333333333335

1.5.2 조기리턴

  • return이 되면 함수가 종료됩니다.
# 소수를 찾는 프로그램을 만드는 예시입니다.

def isPrime(x):
  for i in range(2,x):
    if x%i==0:
      return False
  return True
  
a = [12, 13, 7, 9, 19]
for i in a:
  if isPrime(i):
    print(i, sep=',', end=' ')

13 7 19

  • 자세한 내용은 하단 2.3 조기리턴 참고

2. 함수의 활용

2.1 재귀함수

재귀함수는 자기자신을 호출하는 함수로, 함수 내부에서 함수를 호출하는 함수입니다.

2.1.1 팩토리얼
  • case 1. 반복문 사용
# n! = 1*2*3*(n-2)*(n-1)*n

def factorial_1(n):
  변수 = 1
  for i in range(1, n+1)
    변수 *= i
  return 변수
  
print("1!:", factorial_1(1))
print("2!:", factorial_1(2))
print("3!:", factorial_1(3))
print("4!:", factorial_1(4))
print("5!:", factorial_1(5))

1!: 1
2!: 2
3!: 6
4!: 24
5!: 120

  • case 2. 재귀함수
# 0! = 1
# n! = n*(n-1)!

def facorial_2(n):
  if n == 0 :
    return 1
  else:
    return n * factorial(n-1)
    
print("1!:", factorial_1(1))
print("2!:", factorial_1(2))
print("3!:", factorial_1(3))
print("4!:", factorial_1(4))
print("5!:", factorial_1(5))

1!: 1
2!: 2
3!: 6
4!: 24
5!: 120


2.2 메모화

2.2.1 피보나치 수열
  • 재귀함수로 구현했을 경우
# f(1) = 1
# f(2) = 1
# f(n) = f(n-1) + f(n-2)

counter = 0

def f(n)
  global counter =+ 1
  if n==1 or n==2:
    return 1
  else:
    return f(n-1) + f(n-2)

print(f(35))
print(counter)

9227465
18454929

메모화
이미 구했던 값을 여러번 반복해서 구하는 문제가 생겨 연산의 시간이 길어집니다.

  • 메모화를 사용했을 경우
메모 = {1:1, 2:1}

def f(n):
  if n in 메모 :
    return 메모[n]
  else:
    output = f(n-1) + f(n-2)
    메모[n] = output
    return output
    
print(f(150))

9969216677189303386214405760200
이전과 달리 빠른 속도로 연산이 됩니다.


2.3 조기리턴

메모 = {1:1, 2:1}

def f(n):
  if n in 메모 :
    return 메모[n]
  output = f(n-1) + f(n-2)
  메모[n] = output
  return output
    
print(f(150))

들여쓰기 단계가 줄어 코드를 더 쉽게 읽을 수 있습니다. 이렇게 흐름 중간에 return 키워드를 사용하는 것을 조기리턴이라고 합니다.


3. 람다

한 줄의 리턴 코드를 가진 함수를 간단히 표현하기 위해 람다를 사용한다.

3.1 람다의 개념

3.1.1 예제 1

  • 기본 형태
# 함수로 표현시
def power(숫자):
    return 숫자 ** 2
    
# 람다로 표현시 : 
power = lamda 숫자 : 숫자 ** 2
pritn(power(10))

100

  • 람다를 사용했을 때 좋은점
# 한 줄안에 코드를 넣는 인라인 코드를 짤 때 유용하다.
A = [1,2,3,4,5]
result = map(lambda 숫자: 숫자 ** 2, A)
print(list(result))

[1,4,9,16,25]

3.1.2 예제 2

  • 함수를 사용했을때
def plus_one(x):
        return x+1
print(plus_one(1))

2

  • 람다를 사용했을 때
plus_one=lambda x:x+1
print(plus_one(1))

2

3.1.3 예제 3

  • 함수를 사용했을때
def plus_one(x):
        return x+1

a=[1,2,3]
print(list(map(plus_one,a)))

[2, 3, 4]

  • 람다를 사용했을 때
a=[1,2,3]
print(list(map(lambda x:x+1,b)))

[2, 3, 4]


3.2 중첩함수(cf. 콜백함수)

  • 중첩함수 : 함수 안에 또 다른 함수가 있는 형태
def out_function():
  print('out_function 입니다')
  
  def in_function():
    print('in_function 입니다')
    
  in_function()

out_function()

out_function 입니다
in_function 입니다

  • 중첩함수의 내부 함수는 함수 밖에서 호출할 수 없다.
def out_function():
  print('out_function 입니다')
  
  def in_function():
    print('in_function 입니다')
    
  in_function()

in_function()

NameError: name 'in_function' is not defined


3.3 표준 함수 (= 내장함수)

  • 함수를 매개변수로 전달하는 대표적인 표준함수로 map()과, filter()가 있습니다.

3.3.1 fileter(fun, *iterables)

리스트의 요소를 함수에 넣고, 리턴된 값이 True인 것으로 새로운 리스트를 구성해주는 함수입니다.

  • filter() 함수
def 짝수만(number):
  return number % 2 == 0

a = list(range(10))
b = filter(짝수만, a)

print(list(b))
for i in b:
  print(i)

[0, 2, 4, 6, 8}
0
2
4
6
8

  • filter() 함수 with 람다
a = list(range(10))
b = filter(lambda number: number % 2 == 0, a)

print(list(b))
for i in b:
  print(i)

[0, 2, 4, 6, 8}
0
2
4
6
8

3.3.2 map(function or None, iterable)

리스트의 요소를 함수에 넣고, 리턴된 값으로 새로운 리스트를 구성해주는 함수입니다.

  • map()함수
def 제곱(number):
  return number * number

a = list(range(5))
print(list(map(제곱, a)))

[0, 1, 4, 9, 16, 25]

  • map()함수 with 람다
a = list(range(5))
print(list(map(lambda number : number * number, a)))
  • map()함수 활용
a, b, c = map(int, input().split())
a, b, c = map(float, input().split())

3.4 리스트 내포와 비교하기

a = list(range(5))
print([i*i for i in a if i % 2 == 0])

map(),filter() 함수는 제너레이터 함수라서
내부의 데이터가 실제로 메모리에 용량을 차지하지 않는다
하지만 신경쓰지 않을 정도로 컴퓨터의 성능이 매우 발전
최근에는 리스트내포 구문이 많이 쓰이는 추세이다


4. 참고 자료

0개의 댓글