관리 메뉴

IT journey

Python-함수 본문

개인공부공간/Python

Python-함수

step 2021. 5. 26. 15:31
728x90
반응형

직접 내용 정리하고 만든 예이니 퍼가실 때는 출처를 남겨주세요:)

함수

(1) 정의

특정한 기능을 하는 코드들을 묶어 하나의 명령어처럼 사용하는 작은 프로그래밍 단위를 '함수'라고 합니다.

(2) 기본 형태

#빈 함수 만들기
def 함수명():
	pass
    
#사용자 정의 함수
def 함수명(인수): 
	실행할 명령
    	실행할 명령
        ...
        
#일반적인 함수의 구조
def 함수명(입력 인수):
	수행할 문장1
    	수행할 무장2
        return 반환 값
        

#함수 안에 함수 만들기
def 함수이름1():
	코드
    	def 함수이름2():
        	코드
            
def hi_hello():
  hello = "hi"
  def hi_journey():
    print("Hello IT journey")
  hi_journey()

hi_hello()
  • -def은 define에서 따온 키워드로 함수를 만들 때 사용하는 예약어입니다.
  • -함수명은 변수명 만드는 법과 동일합니다.
  • 입력인수는 이 함수에 입력될 값을 말합니다.
  • 수행할 문장은 함수 안에서 어떤 기능을 수행하는 것을 말합니다.
  • return은 함수가 기능을 수행할 결과를 반환합니다.
  • pass라는 키워드는 Python - 제어문 에서 했으니 참고부탁드립니다.

형태 4가지

ⓐ입력값 결과값이 모두 있는 함수 -11

def subtract(a,b):
  result = a-b
  return result

r=subtract(10,5)
print(r)

#subtract(a,b) 
#함수를 호출할 때 넣는 a,b를 인수(argument)라 부릅니다.

def 함수이름(매개변수1,매개변수2):
	코드

ⓑ입력값이 없고 결과값만 있는 함수 -01

def Here():
  return "IT journey"

r = Here()
print(r)

ⓒ입력값만 있고 결과값이 없는 함수 -10

def subtract(a,b):
  print("%f,%f의 빼기는 %f입니다."%(a,b,a-b))

print(subtract(25,20.1))

ⓓ입력값 결과값이 모두 없는 함수 - 00

def option():
  print('''1.Python
  2.C
  3.JAVA
  4.DBMS
  5.C#
  6.R''')

option() #함수를 호출합니다. = call

*함수를 정의한다는 것은 파이썬에게 미리 알려준다는 것이고

함수를 호출한다는 것은 만들어진 함수를 부른다는 것(실행한다는 것)입니다.

(3) 종류

range()함수 처럼 내장되어있는 함수(내장함수)와 사용자 정의 함수가 있습니다.

(4) 쓰면 좋은 이유

1. 코드의 용도를 구분할 수 있습니다.

2. 코드를 재사용할 수 있습니다.

3. 실수를 줄일 수있습니다.

 

(5) 실행 순서

함수는 순차적으로 실행됩니다.

 

(6) 함수 독스트링(docstings)

""" """(큰따옴표 3개)로 문자열로 입력하면 함수에 대한 설명이 가능합니다.

def subtract(a,b):
  """이 함수는 a와 b를 빼는 결과를 반환하는 함수"""
  result = a-b
  return result

r=subtract(10,5)
print(r)
print(subtract.__doc__) #독스트링 출력
help(subtract) #함수 이름, 매개변수, 독스트링을 도움말 형태로 출력

(7) return

#함수에서 값을 여러 개 반환하기(리턴 값의 유형)
def calculate(a,b):
  result = a+b,a-b
  return result

r=calculate(10,5)
print(r) #튜플로 반환

#return으로 함수 중간에 빠져나오기
def subtract(a,b):
  if (a-b) == 2:
    return
  print((a-b),'입니다',sep='')

r=subtract(10,5)

 

(8) 위치인수 사용하기

위치인수(positional argument)란 인수의 위치가 정해져 있는 것을 말합니다.

print(1,2,3)
def print_numbers(a,b,c):
  a
  b
  c

(9) 가변 인수(예상할 수 없는 인수)를 갖는 함수

입력 값(매개(입력)변수)이 몇 개 일지 모를 때 가변인수(varable argument)를 사용합니다.

매개변수를 전부 모아서 튜플로 반환해줍니다.

#키워드 인수를 사용하는 가변 인수 만드는 구조
def 함수명(*매개변수):
	<수행할 문장>

#사용한 예
def showMenu(*x):
  print(x)

고정인수와 가변인수를 함께 사용할 경우에는 고정인수 뒤에 가변인수를 씁니다.

두 개의 가변인자는 쓸 수 없습니다.

def feed(a,*args):
  print(a)
  print(args)

feed("monkey")
feed("monkey","feed","banana")

 

가변인자, 매개변수(인수) 미리 초기화 설정할 때 무조건 맨 뒤에서부터 작성해야 합니다!!

매개변수 값을 초기해놓으면 매개변수 들어오지 않았을 때 설정 값으로 함수를 실행합니다.

#매개변수에 초기값 지정하기
def 함수이름(매개변수=값):
	코드
    
#사용한 예
def showMenu(x="파스타"):
  print(x)

showMenu()
showMenu("찜닭")
def zoo_feed(name,age,gender=True):
  print("이름:",name)
  print("나이:",age)
  
  if gender:
    print("남자")
  else:
    print("여자")

zoo_feed("turtle",200,False)

 

키워드 인수와 딕셔너리 언패킹

#구조
def 함수명(**딕셔너리):
	<수행할 문장>

#사용한 예
zoo={'name':'turtle','age':200,'gender':'Man'}

def zoo_feed(**zoo):
  print("이름은 %s입니다." %zoo['name'])
  print("나이는 %d입니다."%zoo['age'])
  print("성별은 %s입니다."%zoo['gender'])

zoo_feed(**zoo)

#사용한 예를 바꾼 코드
def zoo_feed(name,age,gender):
  print('이름:' ,name)
  print('나이:',age)
  print('성별:',gender)

zoo={'name':'turtle','age':200,'gender':'Man'}

zoo_feed(**zoo)

키워드 인수를 사용하는 가변 인수 만들기

#구조
def 함수이름(**매개변수):
	코드
    
#예
zoo={'name':'turtle','age':200,'gender':'Man'}

def zoo_feed(**zoo):
  for index,phone in zoo.items():
    print(index,":", phone, sep='')

zoo_feed(name='monkey')
zoo_feed(**zoo)

위치 인수와 키워드 인수 함께 사용하기

고정 매개변수, *args, **kwargs 순으로 지정해서 함께 써야 합니다.

def zoo(*args,**kwargs):
  print(*args,**kwargs)

zoo('monkey','bana',sep=':',end='')

(10) 재귀호출(recursive call)

함수 안에서 함수 자기 자신을 호출하는 방식입니다. 알고리즘 구현 시 유용하게 사용할 수 있습니다.

def greet():
  print("Hello IT journey")
  greet()

greet()

파이썬의 최대 재귀 깊이(maximum recursion depth)는 1000으로 지정되어 있습니다.

위 재귀호출 코드를 실행하게 되면 계속 출력하다 에러를 발생합니다. 그렇다면 종료할 수 있는 조건을 만들어야 합니다.

조건을 만든 예는 아래와 같습니다.

def greet(count):
  if count == 0:
    return 

  print("Hello IT journey",5)
  
  count -=1
  greet(count)

greet(5) #greet 함수 호출

재귀호출를 이용하여 팩토리얼을 구하는 함수를 만들어 봅시다.

정답은 아래에 있습니다.

더보기
def factorial (n):
  if n==1:
    return 1
  return n * factorial(n-1)

print(factorial(6))

(11) 익명 함수 만들기

㉮람다 표현식(lamda expression)

함수를 생성할 때 사용하는 예약어 def  동일한 기능의 예약어입니다.

보통 한 줄로 간결하게 함수를 만들어 사용할 때 사용합니다. 또한 다른 함수의 인수로 넣을 때 주로 사용합니다. (즉, def를 사용할 수 없는 곳에서 사용합니다.)

def subtract(a,b):
  result = a-b
  return result

subtract(10,5)

#이 식을 람다 형식으로 변경해 봅시다.
subtract = lambda a,b: a-b
subtract(10,5)

#람다 표현식 자체를 호출해 봅시다.
(lambda a,b : a-b)(10,5)

#기본적인 람다 사용 형식
lambda 인수1, 인수2... : 인수를 이용한 표현식

주의할 사항이 있다면 람다 표현식 안에서는 변수를 만들 수 없습니다.

대신..람다 표현식은 람다 표현식 바깥에 있는 변수는 사용할 수 있습니다.

b=2
(lambda a:a+b)(1)

㉯람다 표현식을 인수로 사용하기

람다 표현식을 사용하는 이유는 함수의 인수 부분에서 간단하게 함수를 만들기 위해서 입니다.

def pprint(a):
  return a-20

list(map(pprint,[20,30,40]))

#람다식으로 변경해 봅시다.
list(map(lambda a:a-20,[20,30,40]))

㉰람다 표현식으로 매개변수가 없는 함수 만들기

콜론 뒤에는 반드시 반환할 값이 있어야 합니다.  이유는 표현식은 반드시 값으로 평가되어야 하기 때문입니다.

a=5
(lambda:a-2)()

㉱ 람다 표현식에 조건부 표현식 사용하기

#람다 표현식에 조건부 표현식 형식
lambda 매개변수들 : 식 1 if 조건식 else 식2

#1.map을 이용해서 리스트 a에서 2의 배수를 실수로 반환
a=[5,8,6,7,9,4,1,2,3]
list(map(lambda x:float(x) if x%2==0 else x,a))

#2.filter 사용하기
#반복 가능한 객체에서 특정 조건에 맞는 요소만 가져옵니다.
#filter에 지정된 함수의 반환값이 True일 때만 해당 요소를 가져옵니다.

def subtract(x):
  return x-5 >0 and x-9<0

a=[5,8,6,7,9,4,1,2,3]
list(filter(subtract,a))

a=[5,8,6,7,9,4,1,2,3]
list(filter(lambda x:x-5>0 and x-9<0,a))

#3.reduce 사용하기
#reduce(함수,반복가능한 객체)
#반복 가능한 객체의 각 요소를 지정된 함수로 처리한 뒤
#이전 결과와 누적해서 반환하는 함수
#참고로 reduce는 파이썬 3부터 내장 함수가 아니므로
#functools 모듈에서 reduce 함수를 가져와야 합니다

def subtract (a,b):
  return a-b

a=[20,1,6,5,4]
from functools import reduce
reduce(subtract,a)

#람다 표현식으로 표현해봅시다.
a=[20,1,6,5,4]
from functools import reduce
reduce(lambda a,b: a-b,a)

(12) 변수의 스코프(Scope)

변수는 스코프라는 접근가능한 영역이 존재합니다.

변수의 스코프의 종류

지역(Local)변수란 함수 내에 정의된 변수를 말합니다.

전역(Golbal)변수란 함수 영역에 포함되지 않는 모듈 영역의 변수를 말합니다. 

a=56 #전역변수

def subtract(a,b):
  b = 20 #지역변수
  print(a-b) #함수내에서는 전역변수,지역변수에 접근 가능

print(a)
print(b) #지역변수이므로 에러

 

지역변수를 전역변수로 변경하는 방법

#1.global 사용하기
name="IT journey" 

def name_print():
  global name
  name="tistory"
  print(name) 

print(name) #IT journey
name_print() #tistory
print(name) #tistory

#2.함수의 return 이용하기
name="IT journey"

def name_print():
  name="tistory"
  return name

print(name) #IT journey
name=name_print()
print(name) #tistory

(13) 클로저

클로저(closure)란 함수를 둘러싼 환경(지역변수, 코드)등을 유지하다가 함수를 호출할 때 다시 꺼내서 사용하는 함수를 말합니다.

def calculate():
  a=int(input("정수를 입력하세요"))
  b=int(input("정수를 입력하세요"))
  def subtract(x):
    return a*x+b
  return subtract

closure = calculate() #closure에 저장된 함수가 클로저
print(closure(5),closure(10))

#람다식으로 표현하면
def calculate():
  a=int(input("정수를 입력하세요"))
  b=int(input("정수를 입력하세요"))
  return lambda x:a*x+b

closure = calculate() #closure에 저장된 함수가 클로저
print(closure(5),closure(10))

클로저를 사용하면 프로그래밍의 흐름을 변수에 저장할 수 있습니다.

지역 변수와 코드를 묶어서 활용하고 싶을 때 활용합니다.

클로저에 속한 지역 변수는 바깥에서 직접 접근이 없으므로 데이터를 숨기고 싶을 때 활용됩니다.

 

(14) nonlocal

지역변수가 아닌 변수를 사용하고 싶을 때 쓰는 키워드입니다.

def calculate():
  a=int(input("정수를 입력하세요"))
  b=int(input("정수를 입력하세요"))
  mul_sum = 0
  def mul_add(x):
    nonlocal mul_sum
    mul_sum = mul_sum + a *x+b
    print(mul_add)
  return mul_add

clousre = calculate()
clousre(1)

 

 

 

(예제) 소수 찾는 함수 만들기

def primen(n:int):
  if n<2:
    return False
  for i in range(2,n):
    if n%i==0:
      return False
    return True

 

이전 발행 글

Python - 제어문

Python-자료형(사전형,집합)

Python-자료형(리스트,튜플)

Python - 자료형 (숫자형,문자열,불린형)

Python - 내장함수 1편

728x90
반응형

'개인공부공간 > Python' 카테고리의 다른 글

Python - 클래스 2편  (10) 2021.05.28
Python - 클래스 1편  (18) 2021.05.27
Python - 제어문  (10) 2021.05.25
Python-자료형(사전형,집합)  (10) 2021.05.24
Python-자료형(리스트,튜플)  (0) 2021.05.22
Comments