언어/Python

파이썬 기초 문법2 (함수와 람다 표현식, 라이브러리)

뭉지(moonz) 2021. 1. 2. 13:02
반응형
Youtube '동빈나' - [이코테 2021 강의 몰아보기] 영상을 보고 복습하는 글입니다.

6. 함수와 람다 표현식

ㄱ. 함수

▶함수(Function): 특정한 작업을 하나의 단위로 묶어놓은 것

    -> 불필요한 소스코드의 반복을 줄일 수 있다.

▶내장 함수 : 파이썬이 기본적으로 제공하는 함수  ex)input(), print()

▶사용자 정의 함수 : 개발자가 직접 정의하여 사용할 수 있는 함수

▶매개변수 : 함수 내부에서 사용할 변수

▶반환 값 : 함수에서 처리된 결과를 반환

▶파라미터 지정할 때, 매개변수의 순서가 달라져도 직접 지정할 수 있다.

    ex) add(b = 3, a = 7)

 

ㄴ.  global 키워드

▶함수 내부에서 바깥에 선언된 변수를 사용하고자 한다면, global 키워드로 변수를 지정한다.

a = 0

def func():
    global a		# 함수 밖에 있는 변수를 참조하기 위해 global키워드로 변수를 선언.
    a += 1
     
    for i in range (1,10):
      a += 1
      print(a)
  
func()

▶단순히 전역변수를 참조하여 값을 출력하는 경우에는 global키워드없이 참조가능하지만,

   전역변수의 값을 변경하는 경우에는 global키워드를 사용해야한다.

* 단, 리스트의 경우 append()로 원소를 추가하는 것은 global키워드없이 가능하다.

a = 10
array = [1, 2, 3, 4, 5]

def func1():
  global a
  a += 1
  print(a)	#11
  
def func2():
  global array
  array = [3, 4, 5]
  print(array)	#[3, 4, 5]
  
func1()		# 11
func2()		# [3, 4, 5]

▶global키워드 없이 이름이 같은 변수를 함수 내에서 선언하여 사용하는 경우, 지역변수를 우선순위로 생각하지만, 함수 밖에서는 전역변수가 출력된다.

a = 10
array = [1, 2, 3, 4, 5]

def func1():
  a = 0
  a += 1
  print(a)	# 1
  
def func2():
  array = [3, 4, 5]
  print(array)	# [3, 4, 5]
  
func1()		# 10
func2()		# [1, 2, 3, 4, 5] 

 

ㄷ.  여러개의 반환 값

▶파이썬에서 함수는 여러개의 반환 값을 가질 수 있다.

  packing : 여러개의 변수가 한꺼번에 반환되는 것

  unpacking : 반환된 값을 차례대로 특정 변수에 담는 것

def operator(a, b):
  add_var = a+b
  subtract_var = a-b
  multiply_var = a*b
  divide_var = a/b
  return add_var, subtract_var, multiply_var, divide_var	# packing
  
A, B, C, D = operator(7, 3)		#unpacking
print(A, B, C, D)

ㄹ. 람다 표현식

▶람다 표현식을 이용하면 함수를 간단하게 작성 할 수 있다.

  -> 특정한 기능을 수행하는 함수를 한 줄에 작성할 수 있다는 점! (별도의 함수를 정의하지 않고) (이름 또한 정의 X)

함수 자체를  입력으로 받는 또다른 함수가 존재할 때 유용하게 사용 가능.

    혹은 함수를 한번 사용하고 말 경우

# 기존 함수 정의
def add(a,b):
  return a+b
  
print(add(3, 7))

# 람다 표현식으로 구현한 add()메서드
print((lambda a, b: a + b)(3, 7))	# (lambda [입력으로 받을 매개변수]: [함수 반환 값])(매개변수 값)

▶람다 표현식 예시1 : 내장 함수에서 자주 사용.

array =[('홍길동',50), ('이순신',32), ('아무개',74)]

# 일반적
def my_key(x):
    return x[1] #두번째 원소를 반환

print(sorted(array, key=my_key))  #array리스트를 정렬하는 내장함수에서, key속성의 값을 정렬 기준으로 넣어줄 수 있다.

#람다식
print(sorted(array, key=lambda x: x[1]))  #튜플 x에서 두번째 원소를 반환.

▶람다 표현식 예시2 : 여러 개의 리스트에 동일한 규칙을 적용할 경우.

list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10]

result = map(lambda a,b: a+b, list1, list2)  
# a,b에 list1,list2를 넣어서 a+b를 반환하는데, 각 원소에 lambda함수를 모두 적용(map)

print(list(result)) # list형태로 출력

7. 자주 사용되는 표준 라이브러리

▶코딩 테스트에서 사용빈도가 높은 라이브러리로 살펴보겠다.

    - 내장함수 : 기본 입출력 함수부터 정렬 함수까지 기본적인 함수들을 제공. (import없이 사용 가능)

       ex)input(), print(), sum(), min(), max(), sorted(), eval()

    - itertools : 파이썬에서 반복되는 형태의 데이터를 처리하기 위한 유용한 기능들을 제공.

       특히 순열과 조합 라이브러리는 코딩 테스트(완전탐색 문제)에서 자주 사용됨! (모든 경우의 수를 고려해야할 때 사용)

    - heapq : 힙 자료구조를 제공. 일반적으로 우선순위 큐 기능을 구현하기 위해 사용된다.

      최단경로 알고리즘에서 많이 활용

    - bisect : 이진 탐색 기능을 제공.

    - collections : 덱, 카운터 등의 유용한 자료구조를 포함.

    - math : 필수적인 수학적 기능을 제공.

       팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수 관련 함수 ~ 파이(pi)같은 상수 포함.

 

▶내장 함수

ⓐ eval()함수 : 사람입장에서 표현된 수식을 계산하여 숫자로 반환하는 함수

result = eval("(3+5)*7)")
print(result)	# 56 출력

ⓑ sorted() 함수 with key : key속성으로 정렬 기준을 지정해주어 원소를 오름/내림차순으로 정렬하는 함수

array = [('홍길동', 35), ('이순신', 75), ('아무개', 50)]
result = sorted(array, key= lambda x: x[1], reverse=True)	#x[1]값을 key값으로 내림차순(reverse=True) 정렬
print(result)	# [('이순신', 75), ('아무개', 50), ('홍길동', 35)]

 

▶itertools : 모든 경우의 수를 고려해야할 때 사용하는 라이브러리

ⓐ 순열 nPr : 서로 다른 n개에서 서로 다른 r개를 선택하여 일렬로 나열하는 것 (순서 고려)

  - ['a', 'b', 'c']에서 세 개를 선택하여 나열하는 경우 : 'abc', 'acb', 'bac', 'cab', 'bac', 'cba'

from itertools import permutations

data = ['A', 'B', 'C']	# 데이터 준비

result = list(permutations(data, 3))	# 모든 순열 구하기
print(result)	# [('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]

조합 nCr : 서로 다른 n개에서 순서에 상관없이 서로 다른 r개를 선택하는 것

  - ['a', 'b', 'c']에서 순서를 고려하지 않고 두개 뽑는 경우 : 'ab', 'ac', 'bc' 

from itertools import combinations
data = ['A', 'B', 'C']	# 데이터 준비

result = list(combinations(data, 2))	# 뽑을 개수에 대한 모든 조합 구하기
print(result)	# [('A', 'B'), ('A', 'C'), ('B', 'C')]

-> 해당 문제를 풀기 위해 모든 경우의 수를 고려했을 때 시간초과가 되는지를 확인할 때 사용함.

순열로 구했을 때 값이 천만, 1억 단위로 넘어가는 경우, 완전탐색을 이용하면 시간초과 판정받게 됨.

 

ⓒ 중복 순열을 구할 때의 코드 (product이용)

from itertools import product

data = ['A', 'B', 'C']

result = list(product(data, repeat=2))	# 2개를 뽑는 모든 순열 구하기 (중복 허용)
print(result)	# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]

ⓓ 중복 조합을 구할 때의 코드 (combinations_with_replacement 이용)

from itertools import combinations_with_replacement

data = ['A', 'B', 'C']

result = list(combinations_with_replacement(data, 2))	# 2개를 뽑는 모든 조합 구하기 (중복 허용)
print(result)	# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]

 

▶ collections 

ⓐ Counter : 등장 횟수를 세는 기능을 제공.      ->워드클라우드에서 사용됨.

  - 리스트와 같은 반복 가능한 객체가 주어졌을 때 내부의 원소가 몇 번씩 등장하는지 알려준다.

from collections import Counter

counter = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue']) # Counter 객체를 생성

print(counter['blue'])	# 3
print(counter['green'])	# 1
print(dict(counter))	# 사전 자료형으로 변환하는데, key값이 등장 횟수

# 3
# 1
# {'red': 2, 'blue': 3, 'green': 1}

 

▶ math

- 최대 공약수를 구해야 할 때 math 라이브러리의 gcd()함수를 이용할 수 있다. >>gcd(greatest common deviser)

- a,b의 최소 공배수 : a*b를 최대공약수로 나눈 값. 

import math

# 최소 공배수(LCM)를 구하는 함수
def lcm(a,b):
	return (a*b) // math.gcd(a,b)
    
a = 21
b = 14

print(math.gcd(a,b))	# 21, 14의 최대 공약수(GCD) 계산
print(lcm(a,b))		# 21, 14의 최소 공배수(LCM) 계산

# 7
# 42

 

반응형