본문 바로가기

Back-End/Python

[Python][파이썬] 파이썬 함수

~ 목차 ~

    1. 함수
      • 입력값, 출력값(반환값)이 있다.
      • 코드의 반복을 줄이기 위해서 사용
      • 파이썬 함수의 구조 : def 함수명(변수1, 변수2...): 실행문1 실행문2 ... return 결과값
      • 매개변수(parameter) 와 인수(arguments)
        • 매개변수는 함수에 입력으로 전달된 값을 받는 변수
          • ex . def add(a, b):  # a, b는 매개변수
        • 인수는 함수를 호출할 때 전달하는 입력값
          • ex. print(add(3, 4))  # 3, 4는 인수
      • 변수1, 변수2 생략 가능
      • return 문 생략 가능  + return값 여러 개 가능
      • 파이썬에서는 None는 별도 데이터 타입으로의 객체로서 존재, 값의 부재를 나타냄 (error가 안남)
      • 내부함수란 함수 내부에 또다른 함수가 있는 것을 말한다. 내부함수는 외부에서 호출할 수 없다. 
      • 람다함수란 간략하게 함수를 사용할 경우 유용하다. 함수명 =  lambda 변수1, 변수2, ... : 결과값
      • 예제
ambda 함수
- lambda 변수1, 변수2, ... : 결과값
def say():
    print('Ho~')
say()

결과

Ho~

a = say()
print(a)

※ 함수를 변수로 둘 수는 있다. 하지만 a를 출력하게 되면 아무 값도 안나오게 된다.

 

결과

Ho~

None

def hello(x):
    print('hello', x)
hello('python')

결과

hello python

 

# data 여러 개 올때 변수 앞에 *넣어주기 

def sum_many(*args):
    sum = 0
    for i in args:
        sum += i
    return sum
sum_many(1, 2, 3, 4, 5)

결과

15

 

#더하기, 빼기 함수

def add_minus(x, y):
    a = x + y
    b = x - y
    return a, b
print(type(add_minus(1, 3)))
add_minus(1, 3)

결과

<class 'tuple'>

(4, -2)

 

# gender default값 설정(단, 파라미터 종류 별 순서 중요!!! default값이 앞에 나오면 안됌)

def say_myself(name, gender = 'M'):
    print(f'나의 이름은 {name}입니다.')
    print(f'나의 성별은 {gender}입니다.')
say_myself('홍길동')

결과

나의 이름은 홍길동입니다.

나의 성별은 M입니다.

 

#람다함수

a = lambda x : x*2
a(2)

결과

4

 


 

  • 패킹,언패킹

<packing>

 

패킹은 인자로 받은 여러개의 값을 하나의 객체로 합칠 수 있다.

위치인자 패킹은 *한개를 매개변수 앞에 붙여서 사용합니다.

def func(*args):
      print(args)
      print(type(args))

이런식으로 매개변수 이름 앞에 *을 붙여준다면, 위치인자로 보낸 모든 객체들을 하나의 객체로 관리해줍니다.

func(1, 2, 3, 4, 5, 6, 'a', 'b')

결과

Copy(1, 2, 3, 4, 5, 6, 'a', 'b')
<class 'tuple'>

 

 

동일하게 키워드 인자에 패킹은 **을 통해 작성할 수 있습니다.

키워드 인자는 패킹한 인자들을 키워드와 인자 쌍으로 이뤄진 딕셔너리로 관리합니다.

def kwpacking(**kwargs):
     print(kwargs)
     print(type(kwargs)

kwpacking(a=1, b=2, c=3)

결과값

Copy{'a': 1, 'b': 2, 'c': 3}
<class 'dict'>

<unpacking>

unpacking은 여러개의 객체를 포함하고 있는 하나의 객체를 풀어줍니다.

함수에서 unpacking을 할때는, 매개변수에서 *을 붙이는게 아니라 인자 앞에 *을 붙여서 사용합니다.

동일하게 위치인자를 unpacking 하는 경우는 *를, 키워드인자를 unpacking하는 경우 **를 사용합니다.

def sum(a, b, c):
    return a + b + c

numbers = [1, 2, 3]
sum(numbers) # error

print(sum(*numbers)) # 출력 : 6

[1, 2, 3]을 인자로 보낼때, *을 붙이면 unpacking이 됨.

unpacking은 아래와 같은 순서로 변경되어 실행됩니다.

1. sum(*numbers)
2. sum(*[1, 2, 3])
3. sum(1, 2, 3)

 

※해체된 결과가 함수의 매개변수에 갯수와 다르다면 에러가 발생

 

위치인자를 unpacking할때는 Container객체라면 다 가능합니다.

sum(*'abc') # 'abc'
sum(*(4, 5, 6)) # 15
sum(*{'가', '나', '다'}) # '나다가'
sum(*{'치킨': 3, '피자': 12, '음료수': 10}) # '치킨피자음료수'

 

※ set타입과 dict타입은 순서정보를 가지고 있지 않기 때문에 결과가 다를 수 있음

 

동일한 방식으로 키워드인자로 unpacking할 수 있다.

unpacking하기 위해선 인자가key인자로 구성되어 있는mapping타입, 즉dict가 필요하다.

def cal(first, op, second):
    if op == '+':
        return first + second
    if op == '/':
        return first / second
    if op == '-':
        return first - second
    if op == '*':
        return first * second

prob = {
  'first': 12,
  'second': 34,
  'op': '*'
}

cal(**prob) # 결과 : 408

위 예제에 키워드 인자의 unpacking은 다음과 같이 작동한다.

1. cal(**prob)
2. cal(prob = {
  'first': 12,
  'second': 34,
  'op': '*'
})
3. cal(first=12, second=34, op='*')

※위치인자의 unpacking처럼 unpacking되는 인자는 매개변수의 키워드 매개변수와 일치해야 한다.

 


< enumerate() 함수 >

  • enumerate() : index와 value값 같이 나오게 하는 내장 함수.
  • for 문의 in 뒷 부분을 enumerate() 함수로 한 번 감싸주기.

인덱스(index) 변수를 증가시키면서 for 루프를 돌리고 싶을 때 파이썬에서는 enumerate()라는 내장 함수를 통해 이러한 인덱스 변수를 사용하지 않고 루프를 돌릴 수 있다.

for entry in enumerate(['A', 'B', 'C']):
    print(entry)

결과

(0, 'A')

(0, 'B')

(0, 'C')

 

enumerate() 함수는 기본적으로 인덱스와 원소로 이루어진 튜플(tuple)을 만들어줍니다. 따라서 인덱스와 원소를 각각 다른 변수에 할당하고 싶다면 인자 풀기(unpacking)를 해줘야 한다.

for i, entry in enumerate(['A', 'B', 'C']):
    print(i, entry)

결과

0 A

1 B

2 C

 

  • 시작 인덱스 변경

루프를 돌리다보면 인덱스를 0이 아니라, 1로 시작하고 싶을 때가 있는데 이럴 때는 enumerate() 함수를 호출할 때 start 인자에 시작하고 싶은 숫자를 넘기면 된다.

for i, entry in enumerate(['A', 'B', 'C'], start=1):
    print(i, entry)

결과

1 A

2 B

3 C

728x90