본문 바로가기

Python Basic/혼공파

[혼공파] Chapter 05 ③함수 고급


  • 는 개념 정리
  •  개인적으로 새롭게 알게 된 점 

5-3. 함수 고급

  1. 튜플
  2. 람다
  3. 파일 처리

튜플

튜플(tuple)은 몇 가지 점을 제외하고는 리스트(list)와 거의 비슷함. 

 

튜플과 리스트와의 차이

  • 리스트는 [] 로 둘러싸지만, 튜플은 ()로 둘러쌈.
  • 리스트는 그 값의 생성, 삭제, 수정이 가능하지만, 튜플은 그 값을 바꿀 수 없음. 

튜플의 형태

t1 = ()
t2 = (1,)
t3 = (1,2,3)
t4 = 1,2,3
t5 = ('a', 'b', ('ab', 'cd'))

튜플의 특징

  • t2 = (1, )처럼 단지 1개의 요소만을 가질 때는 요소 뒤에 콤마(,)를 반드시 붙여야 함.
  • t4 = 1,2,3 처럼 괄호() 를 생략해도 무방함

튜플과 리스트는 비슷한 역할을 하지만, 프로그래밍을 할 때 튜플과 리스트는 구별해서 사용하는 것이 유리함. 

  • 튜플: 프로그래밍이 실행되는 동안 그 값이 항상 변하지 않기를 바란다거나, 값이 바뀔까 걱정하고 싶지 않다면 튜플 사용
  • 리스트: 수시로 그 값을 변화시켜야 할 경우라면 리스트 사용

실제 프로그램에서는 값이 변경되는 형태의 변수가 훨씬 많기 대문에 평균적으로 튜플보다는 리스트를 더 많이 사용함. 

 

1. 리스트와 튜플의 특이한 사용

CODE

[a, b] = [10, 20]
(a, b) = (10, 20)

print(a)
print(b)
print(c)
print(d)

OUTPUT

10
20
10
20


2. 괄호가 없는 튜플

CODE

t1 = 10, 20, 30, 40
print(t1)

a, b, c = 10, 20, 30
print(a)
print(b)
print(c)

OUTPUT

(10,20,30,40)
10
20
30

 

3. 변수와 값을 교환하는 튜플

CODE

a, b = 10, 20

a, b = b, a

print(a)
print(b)

OUTPUT

20
10

+추가) 튜플이 값이 변경이 안된다는 것에 대한 의문

  • list 처럼 값 '수정'은 안됨.
  • 그러나, 아예 새롭게 값을 할당하는 것은 됨. 

 

4. 튜플과 함수

CODE

def test():
    return (10,20)
    
a, b = test()

print(a)
print(b)

OUTPUT

10
20

 

* emunerate()

for i, value in enumerate([1,2,3,4,5]):
    print("{}번째 요소는 {}입니다.".format(i, value))
  • i, value는 (i, value) 형태의 튜플에서 괄호를 제거한 것. 

람다

일반 함수와 람다 함수

  • 일반 함수: 함수를 이용하면 필요한 기능의 재사용이 가능함.
    • 함수를 정의한 후 필요할 때마다 호출하여 사용
  • 람다 함수: 가끔씩은 함수를 만들지 않고, 함수화된 기능만을 불러 사용하고자 할 경우가 있음.
    • 프로그램을 단순하게 만들며,
    • 1회용으로 함수를 만들고 싶은데, def 를 사용하여 이름을 짓는 것이 번거로울 수 있음. 

람다 함수

  • 람다, 람다 표현식이라고 불리우는 람다 함수는 이름이 없는 함수
    • 익명 함수 (anonymous function)로 부르기도 함. 
    • 이름이 필요한 경우, 할당하여 사용할 수 있음. 
  • 주의: 표현식 안에서 새 변수를 선언할 수 없음. 
  • 반환값은 변수 없이 식 한줄로 표현할 수 있어야 하며, 복잡한 함수가 필요하면 def 함수로 정의하여야 함. 
    • return 문 필요 없음. 

일반 함수와 람다 함수
람다 함수 사용법
lambda code

람다 함수는 위와 같은 방식으로 사용하기 보다는

* filter() 함수와 map() 함수에서 사용하는 함수임 *

 

filter()

  • filter() 함수는 순환가능한 요소들을 필터 함수에 넣어, 그 리턴값이 참인 것만 묶어서 반환함. 
    • 즉, 여러 개의 데이터로부터 일부의 데이터만 추려낼 때 사용. 따라서, 여러 개의 데이터를 담고 있는 list나 tuple을 대상으로 주로 사용하는 함수.
filter(조건 함수, 순회 가능한 데이터)
  • filter() 함수는 두 번째 인자로 넘어온 데이터 중에서 첫 번째 인자로 넘어온 조건 함수를 만족하는 데이터만을 반환. 

일반 함수를 사용한 filter() 함수

  • filter() 함수에서 False가 되는 값은 제외하고, return 값이 참인 값만 반환함. 
    • adult_func()는 필터함수로 여기서는 19세 이상의 나이만 True로 반환하고, 나머지는 False를 반환함. 따라서 리스트 원소 중 7, 11, 14는 가져오지 않음. 
  • 앞의 adult_func() 는 필터에서 사용할 1회용 함수로, 람다를 이용하여 단순화하는 것이 더욱 편리함. 

람다 함수를 사용한 filter() 함수

  • 간결하면서도, 핵심적인 알고리즘에 집중함. 
  • 한 번 사용한 후 뒤에는 사용 안함. 

 

map()

  • 리스트의 요소를 함수에 넣고, 리턴된 값으로 새로운 리스트를 구성해 주는 함수
  • 열거 가능한 자료형의 각 요소들에 대해서 mapping 함수를 적용함. 

map()

  • reversed() 함수와 마찬가지로,
  • filter() 함수와 map() 함수는 '이터레이터(iterator)'를 반환하는 '제너레이터(generator)'임. 
    • list() 함수를 적용해서 강제로 리스트 자료형으로 변환해 출력함. 

람다 함수 정리

  • 람다 함수를 사용하면, 코드를 더 깔끔하게 작성할 수 있고, 함수가 매개변수로 넣어졌다고 확인하고 어떤 함수인지를 알기 위해 다시 찾아 올라가는 수고를 하지 않아도 됨. 
  • 매개변수가 여러 개인 람다도 가능!
lambda x, y: x * y

파일 처리

파일과 관련된 처리를 하는 함수는 표준 함수가 기본으로 제공됨. 

 

파일은 크게 텍스트 파일과 바이너리 파일로 나뉘는데, 여기서는 '텍스트 파일'에 관련된 내용만 살펴봄. 

  • 텍스트 파일
  • 바이너리 파일

파일 열고 닫기

  • 파일을 열 때는 open() 함수 사용. 
  • 파일을 닫을 때는 close() 함수 사용. 
파일 객체 = open(문자열: 파일 경로, 문자열: 읽기 모드)
모드 설명
w write 모드 (새로 쓰기 모드)
a append 모드 (뒤에 이어서 쓰기 모드)
r read 모드 (읽기 모드)

 

with 키워드

open() 함수와 close() 함수를 사용할 때, 파일을 열고, 닫지 않는 실수의 경우가 생김. 이런 실수를 방지하지 위해 with 키워드 기능이 생김. 

with open(문자열: 파일경로, 문자열: 모드) as 파일 객체:
    문장
  • 이렇게 코드를 작성하면, with 구문이 종료될 때, 자동으로 파일이 닫힘. 

 

파일에 텍스트를 쓸 때는 write() 함수를 사용함. 

반대로 파일을 읽을 때는 read() 함수를 사용함. 

파일 객체.read()