0119 TIL

이종현·2022년 1월 19일
0

TIL

목록 보기
4/20
post-thumbnail

함수


함수를 왜 사용할까?

  • Decomposition
    - 기능을 분해하고 재사용 할 수 있게 한다.

  • Abstraction ( 추상화 )
    - 재사용성과 가독성, 생상성을 높여준다.


함수 기초

함수 ( Function )

  • 특정한 기능을 하는 코드 조각의 묶음
  • 매번 작성하지 않고 필요시, 호출하여 사용

사용자 함수

  • 구현되어 있는 함수가 없는 경어 사용자가 직접 함수를 작성
ex) def function (parameter ):

​		#codeblock

​		return  returning_value

함수를 사용해야 하는 이유

  • 내장함수를 이용하면 코드의 수를 줄일 수 있다.

함수 예시

'''
세제곱을 만드는 함수cube 만들기
2의 세제곱과, 100의 세제곱 반환
'''
def cube(x):
    #이때 x의 자료형은 int형
    return x**3
print(cube(2),cube(100))

#case2
# def cube1(num):
#     result=num**3
#     return result


>>> 8 1000000

함수의 결과 값

값에 따른 함수의 종류

Void function

  • 명시적인 return 값이 없는 경우, None 반환 후 종료

Value returning function

  • 함수 실행 후, return 값 반환
  • return을 하게 되면, 값 반환 후 함수가 바로 종료
    - retrun을 만나면 함수가 바로 종료 된다.
#Void function
print('hello python')
>>> hello python

#Value returning function
float(3.14)
>>> 3.14

'''
print 와 float의 차이?
print는 return이 없음
float는 return이 있음
'''

a = print('hello')
b = float('3.5')
print(a,b) 
>>> None 3.5

'''
return은 함수 안에서만 사용되는 키워드
printsms 출력을 위해 사용되는 함수
'''

두개 이상의 값을 반환하는 방법

def haha(x,y):
    return x - y , x * y
print(haha(2,3))
>>> (-1, 6)

ex)

'''
가로,세로 길이를 입력 받아 넓이와 둘레 출력
'''
def rec(width,height):
    area=width*height
    round_rec=(width+height)*2
    return area,round_rec
print(rec(2,4))

Parameter 와 Argument

  • Parameter (매개변수, 인수 ) : 정의, 식별자
  • Argument ( 전달인자, 인자 ) : 호출

Positional Argument

  • 기본적으로 함수 호출 시 Argument는 위치에 따라 함수내에 전달

Keyword Argument

  • 변수에 직접 값을 전달 할 수 있음 (호출)
def add(x,y):
    return x+y
print(add(1,2)) # x=1 ; y=2 Positional Argument
print(add(y=3,x=1)) #x=1 ; y=2 Keyword Argument
print(add(x=1,2)) #ERROR
print(add(1,y=2)) #동작, 위치를 지정..키워드
#처음부터 키워드로 쓰거나, 위치로 쓰다가 키워드로 써야한다.

Default Argument Value

  • 기본값을 지정하여 호출 시 argument 값을 설정하지 않도록 함 (정의)
    - 정의 된 것 보다 더 적은 개수의 argument들로 호출 될 수 있음
def add(x,y=4):
    return x+y
print(add(2))
>>> 6

정해지지 않은 변수 갯수

Positional Arguments Packing/Unpacking

*args

def add(*args):
    print(args,type(args))
    return args
    # for arg in args:
        
print(add(2,3,4))
>>>
(2, 3, 4) <class 'tuple'>
(2, 3, 4)

입력 받는 args의 type은 'tuple'

Key와 Value의 타입으로 묶고 싶은 경우 ( dict() ) =>kwargs**

def family(**kwargs):
    print(kwargs,type(kwargs))
    return kwargs
family(father='이종현',mother='김수정')

>>>
{'father': '이종현', 'mother': '김수정'} <class 'dict'>


def family(**kwargs):
    #kwargs=> dict()타입이기 때문에 kwargs.items()로 리스트 변경하여 사용 해야함
    for key,value in kwargs.items():
        print(key,":",value)
    return kwargs
family(father='이종현',mother='김수정')

keyword argument 의 타입은 'dict'

keyword argument 다음에 positional argument는 사용할 수 없음!!

함수

  • input
    - 호출 : 위치로 호출 or 키워드로 호출
    • 정의 : 필수로 정의 or 선택 정의
      • 많이 받고 싶을 때 : *args(tuple) **kwargs(dict)
  • output
    - 반드시 하나의 객체를 반환 ( 값, tuple )

함수의 범위( Scope )

  • 코드 내부에 local scope를 생성,
    그 외 공간인 global scope로 구분

  • scope
    global scope: 코드 어디에서든 참조 가능

    local scope : 함수 내부에서만 참조 가능

    • 함수는 가장 기본적으로 : local scope를 가짐
def ham():
    a='spam'
    return a 

print(a) #NameError : 'a' is not defined
print(ham())
  • 블랙박스 밖으로 결과를 주고 싶은 경우 return

이름 검색 규칙 ( Name Resolution )

LEGB Rule

Local -> Enclosed -> Global -> Bulit-in

global 예시

#case1
a=10
def func1():
    #global 을 통해 a의 값을 변경 시켜 줄 수 있음
    global a
    a=3
print(a)
func1()
print(a)

>>>
10
3

#case2
a=10
def func1():
    #global a
    a=3
print(a)
func1()
print(a)

>>>
10
10

global 변수는 사용하기 전에 먼저 선언 해줘야 한다.
func1() 안에 a는 func1()이 종료되면 같이 사람진다
따라서 case2는 둘다 a의 값이 10으로 나옴.


map( function , iterable )

  • 순회가능한 데이터구조 의 모든 요소에 함수를 적용하고
    그 결과를 map object 로 반환
  • 활용 사례

    #split() input으로 받은 str을 스페이스바 기준으로 잘라 리스트로 저장해줌
    n , m = map(int, input().split())

filter ( function , iterable )

  • 순회가능한 데이터구조 의 모든 요소에 함수를 적용하고
    결과가 True 인 것들을 filter object 로 반환

zip (*iterables )

  • 복수의 iterables를 모아 튜플을 원소로 하는 zip object를 반환
numbers=[1,2,3,4]
letters=['a','b','c']
for pair in zip(numbers,letters):
    print(pair)
    
>>>
(1, 'a')
(2, 'b')
(3, 'c')

lambda 함수

lambda [parameter] : 표현식

  • 람다 함수
    표현식을 계산한 결과값을 반한, 이름이 없는 함수 (익명함수)
    return 문을 가질 수 없음
    간결하게 사용 가능 , def가 없는 곳에서 사용 가능

재귀함수 ( recursive function )

  • 자기자신을 호출하는 함수
  • 무한한 호출을 목표로 하는 것이 아니며, 알고리즘 설계 및 구현에서 유용하게 활용
    • 알고리즘 중 재귀함수로 로직을 표현하기 쉬운 경우가 있음 (ex) 점화식 )
    • 변수의 사용이 줄어들고 ,가독성이 높아짐
  • 1개 이상의 base case (종료되는 상황) 가 존재하고, 수렴하도록 작성

ex)

  • Factorial
def factorial(n):
    if n==0 or n == 1:
        return 1
    else :
        return n * factorial(n-1)
print(factorial(4))
'''
f(4)
return 4 * f(4-1)
			return 3 * f(2)
						return 2 * f(1)
									return 1
								    => 1 * 2 * 3 * 4 : 24
'''
>>>
24

재귀 함수는 base case 에 도달할 때 까지 함수를 호출
메모리 스택이 넘치게 되면 프로그램이 동작하지 않게 됨

profile
개발 일기

0개의 댓글

관련 채용 정보