Languages/Python

함수

잔망루피 2021. 1. 18. 23:28

:와 ->

def func(파라미터명: 파리미터타입) -> 반환형타입 :

 

 

언팩 연산자를 사용하는 튜플 형식의 가변 매개변수

def calc_sum(*params) :
    total=0
    for val in params :
    	total +=val
    return total
    
ret_val=calc_sum(1, 2, 3)		# 6

 

가변형 매개변수는 가장 마지막 매개변수로 사용해야 에러x

 

키워드 언팩 연산자(**)

매개변수의 개수를 가변적으로 사용할 수 있음.

키워드 인자들을 전달해 매개변수를 딕셔너리 형식으로 처리

def use_keyword_arg_unpacking(**params) :
	for k in params.keys() :
    	print("{0} : {1}".format(k, params[k]))
        
use_keyword_arg_unpacking(a=1, b=2, c=3)		# a:1, b:2, c:3

 

기본 값을 갖는 매개변수

def calc(x, y, operator="+") :
	if operator == "+" :
    	return x+y
    else :
    	return x-y
        
ret_val=calc(10, 5, "+")		# 15

 

매개변수 operator의 기본값은 "+"다. 

함수 호출 시 세번째 인자를 생략하면 기본값으로 처리됨.

 

함수는 변수에 접근하는 절차는 지역변수 > 전역변수

함수 내에서 global 키워드를 붙여서 전역변수에 접근 가능

전역변수와 함수 내의 지역변수가 이름이 같더라도 global을 붙이지 않으면 서로 다른 변수로 취급

함수 내부에서 전역 변수의 값을 변경하는 것은 좋은 방법이 아니다.

매개변수로 값을 받아서 함수에서 return으로 결과를 반환하는 방식을 사용하자!

def even(lst, answer, size) :
    for i in range(0, size, 2) :
        answer += (lst[i] * lst[i+1])
    return answer

 

 

🐝 함수 내에 중첩함수를 선언해 사용 가능

1. 중첩함수를 포함하는 함수 내에서만 호출이 가능.

2. 중첩함수를 포함하는 함수의 스코프에도 접근 가능.

3. 중첩함수에서 변수의 값을 수정할 때 nonlocal

함수 내에서 직접 선언해 호출할 수도 있고, 함수의 매개변수로 함수 인자를 전달받아 함수 내에서 호출해서 사용 가능

프로그램의 유연성을 높이기 위해 함수를 매개변수로 전달하는 방식 선호!

def solution(n) :
    answer=0
    board=[0]*n

    def dfs(cnt):
        nonlocal answer

        def check():
            for j in range(cnt):
                if board[cnt] == board[j]:  # 같은 행
                    return False
                elif abs(cnt - j) == abs(board[cnt] - board[j]):  # 대각선
                    return False
            return True

        if cnt == n:
            answer += 1
            return
        for i in range(n):
            board[cnt] = i
            if check():
                dfs(cnt + 1)

    dfs(0)

    return answer

nonlocal을 쓰면 answer을 수정할 수 있다.

 

 

# 백준 '15683. 감시 문제'중에서
def dfs(cnt) :
    global ans, temp_a
    if cnt == len(cctv) :
        temp_a=deepcopy(a)
        c=0
        for i in range(len(cctv)) :
            x,y=cctv[i]
            if a[x][y] == 1 :
                c+=move(x, y, dir[i])
            elif a[x][y] == 2 :
                c+=move(x, y, dir[i])
                c+=move(x, y, (dir[i]+2)%4)
            elif a[x][y] == 3 :
                c+=move(x, y, dir[i])
                c+=move(x, y, (dir[i]+1)%4)
            else :
                c+=move(x, y, dir[i])
                c+=move(x, y, (dir[i]+1)%4)
                c+=move(x, y, (dir[i]+2)%4)
        ans=min(ans, area-c)
        return

    for i in range(4) :
        dir.append(i)
        dfs(cnt+1)
        dir.pop()

def move(x, y, d) :
    cnt=0
    while True :
        nx=x+dx[d]
        ny=y+dy[d]
        if not 0 <= nx < n or not 0 <= ny < m or temp_a[nx][ny] == 6 :
            return cnt
        if 0 < temp_a[nx][ny] < 6 or temp_a[nx][ny] == -1 :
            x, y=nx, ny
            continue
        temp_a[nx][ny]=-1
        cnt+=1
        x, y=nx, ny

dfs 함수에서 temp_a에 global을 붙여서 move 함수에서도 접근 가능

이제 temp_a는 전역변수가 되었다.

 

 


람다식

Lambda 매개변수 : 반환값

변수에 저장해 재사용이 가능한 함수처럼 사용

기존의 함수처럼 매개변수의 인자로 전달

함수의 매개변수에 직접 인자로 전달


클로저

중첩함수에서 중첩함수를 포함하는 함수의 scope에 접근 가능

중첩함수 자체를 반환값으로 사용한다면?

정보 은닉 구현 가능

전역변수의 남용 방지

메서드가 하나밖에 없는 객체를 만드는 것보다 우아한 구현 

def outer_func() :
	id=0
    def inner_func() :
    	nonlocal id	# 변수 id가 중첩함수인 inner_func함수의 지역변수가 아님. 변수 id 접근 시 outer_func함수 스코프에서 찾게 됨
        id+=1
        return id
    return inner_func
make_id=outer_func()

 

중첩함수 inner_func() 호출

outer_func() 함수의 지역변수 id 값 1씩 증가

증가된 id값 반환

 

 

 

 

👇 참고 : SW expert academy

 

https://www.infoking.site/64

 

파이썬 global 전역변수 사용방법과 사용예 알아보기!

프로그래밍 언어에서 변수를 분류하는 방법은 여러가지가 있다. 그 중에 하나로 전역변수와 지역변수의 개념이 있다. 일반적으로 전역변수는 프로그램에 혼란을 주기 때문에 사용을 권장하지

www.infoking.site

 

https://www.delftstack.com/ko/howto/python/nested-functions-python/

 

Python의 중첩 함수

이 자습서에서는 Python에서 중첩 함수를 만들고 사용하는 방법을 보여줍니다.

www.delftstack.com

 

반응형

'Languages > Python' 카테고리의 다른 글

set() 자료형  (0) 2021.03.19
[Error] int object is not callable  (0) 2021.02.24
print  (0) 2021.01.08
filter함수  (0) 2020.12.24
Counter함수  (0) 2020.12.24