TIL 19. 파이썬 - 함수 Function, Scope, Parameters

문승준·2021년 9월 6일
0

Python

목록 보기
6/8
post-thumbnail

Function


함수란?

  • 반복되는 코드를 묶어서 하나의 기능을 수행한다.
    → 반복 사용이 가능하고 코드의 가독성이 높아진다.

  • 반드시 인풋과 아웃풋이 있다. input은 parameter라 하고, output은 return 값이다.

  • return 값이 없으면 None을 반환한다.

왜 사용하는가?

  • 코드의 재사용성을 높이고 중복을 최소화한다.

  • 절차적 분해 - 절차에 따라 혹은 기능에 따라 분해하여 테스트하기가 편하다.

함수는 정의와 호출로 이루어져 있다.

  • def 문으로 정의하고, 함수명()으로 호출한다.

  • def 문을 만나면 해당 함수명을 네임스페이스에 저장해둔다.
    -> ‘id(함수명)’으로 숫자주소를 볼 수 있다. ex) 변수도 마찬가지이다.


Scope


  • Global (전역) : 가장 바깥쪽

  • Local (지역)

함수 안에 위치한 변수 → 함수 외부에서 내부 변수 접근 불가하다.

하지만, 함수 내부에서 외부 변수로 접근은 가능하다.
-> 내부에 있는지 확인 후 없으면 점점 외부로 확인한다.(non-local 혹은 global)

Shadowing 효과 : 변수명이 같을때, 좁은 scope 변수가 넓은 scope의 변수를 가려버리는 것

함수는 객체이기 때문에 변수에 할당이 가능하다.

함수 내에서 변수를 찾을때 LEGB 규칙에 따라 찾는다.
LEGB 규칙
Local → Enclosure → Global → Built-in


Parameters


함수는 input parameter를 받아서 return 값을 output으로 리턴한다.

Positional arguments (위치 인수)

→ 입력된 인자의 순서는 parameter의 순서대로 전달된다.

→ 입력 인자의 순서가 바뀌어도 파악이 어려운 단점이 있다.

Keyword Arguments

  • parameter 순서에 맞추지 않고 값을 전달할 수 있다.

  • 함수를 호출할때 parameter 이름과 함께 값을 전달하는 방식이다.

    func(parameter2 = value2, parameter1 = value1)

  • 어떤 parameter에 어떤 argument가 입력되는지 명확히 알 수 있다.

Mixed arguments

  • positional arguments 와 keyword arguments를 혼용할 수도 있다.
  • positional argument의 순서는 반드시 지켜줘야한다.

Parameter Default Value

  • default value를 정해두면 입력값이 없어도 함수 호출이 가능하다.

  • 함수를 정의할때 parameter에 값을 지정한다.

    def func(param1, param2 = default_value):

  • parameter2다른 값으로 입력되어도 작동된다.

  • default 값이 있으면 non-default argument보다 뒤에 와야한다.

    그렇지 않으면, SyntaxError: non-default argument follows default argument 가 발생한다.

def func(a=1,b,c):
  	print(a)
	print(b)
	print(c)

func(2,3)

# SyntaxError: non-default argument follows default argument

→ 첫번째 인수 2가 a 파라미터로 들어가서 초기값을 바꿔야하는지, b에 들어가야 하는지 알 수 없기 때문이다.

Variable length arguments

  • 위치 인수의 개수가 정해지지 않았을 때 사용한다.
  • *args 파라미터로 표현한다.
  • 튜플로 변환되어 함수로 전달된다.
  • 인수가 없을 수도 있다.
def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)

func_param_with_var_args("정우성", "01012341234", "seoul", 20)

#`TypeError: func_param_with_var_args() missing1 required keyword-only argument: 'age'`

TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age' 에러가 발생한다.

*args 파라미터는 여러개의 인수를 받을 수 있기 때문에 age 파라미터의 값을 무엇으로 할지 알 수 없다.

→ 해결 : age=20 처럼 키워드를 이용해 age 파라미터의 값을 명시해서 입력해야한다. 아니면 *args 파라미터를 가장 끝으로 보내고 20 을 두번째 인수로 입력한다.

Variable length keyword arguments

  • 키워드 인수의 개수가 정해지지 않았을 때 사용한다. (딕셔너리)
  • **kwargs 파라미터로 표현한다.
  • 딕셔너리로 변환되어 함수로 전달된다.
  • 인수가 없을 수도 있다.
# 에러발생

def mixed_params(name="아이유", *args, age, **kwargs, address):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

mixed_params(20, "정우성", "01012341234", "male",
	    mobile="01012341234", address="seoul")
  • 위 예시는 SyntaxError: invalid syntax 에러 발생

  • ageaddress 를 앞으로 옮기면? address가 여러 값을 받는다.
    TypeError: mixed_params() got multiple values for argument 'address'

  • address 파라미터는 키워드로 인수를 입력하는 keyword-only argument이다.

## 수정본

def mixed_params(age, name="아이유", *args, address, **kwargs):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")

# name=정우성
# args=('01012341234', 'male')
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul
  • 위에서 함수 호출시 키워드 인수를 추가하면 kwargs 에 딕셔너리 형태로 입력된다.

    위 예시에서 디폴트 값 "아이유" 가 나오게 하려면?


함수 파라미터의 순서

func(param1, param2, param3=default_value, *args, key=value, **kwargs)

위치 인수 - 디폴트 인수 - 가변 위치 인수 - 키워드 인수 - 가변 키워드 인수

  1. Regular Positional args. : 인수 순서를 지키는 기본 형태

  2. Default args. : 파라미터에 초기값이 설정되어 있는 경우

  3. Variable length positional args. : 여러개의 위치 인수를 입력하는 경우 *args

  4. keyword-only args. : 인수에 키워드를 지정해서 입력하는 경우

  5. Variable length keyword args. : 파라미터에 없는 키워드로 값을 입력하는 경우 **kwargs


profile
개발자가 될 팔자

0개의 댓글