파이썬은 함수를 조금 더 편리하게 사용할 수 있도록 튜플(tuple)과 람다(lambda)를 제공해준다.
- 튜플 : 함수와 함께 많이 사용되는 리스트와 비슷한 자료형으로, 리스트와 다른 점은 한번 결정된 요소는 바꿀 수 없다는 것이다.
- 람다 : 매개변수로 함수를 전달하기 위해 함수 구문을 작성하는것이 번거롭고 코드 공간낭비라고 생각이 들 때 함수를 간단하게 선언하는 방법이다. 1회용 함수를 사용할 때 많이 사용한다.
튜플
튜플은 리스트와 비슷한 자료형이지만, 한번 결정된 요소를 바꿀수 없다는 차이가 있다.
(데이터, 데이터, 데이터 ... )
튜플은 위와 같이 () 괄호 안에 데이터를 나열하고 [인덱스]를 입력하여 요소를 가져올 수 있다.
아래 예제를 살펴보면 리스트와 크게 다르지 않게 동작하는 것을 확인할 수 있다.
tuple_test = (10,20,30)
tuple_test[1] #20 출력
tuple_test[2] #30 출력
(a,b) = (10,20)
print("a:",a) # a: 10
print("b:",b) # b: 20
tuple_test[0] = 1
# TypeError: 'tuple' object does not support item assignment
예제 마지막 문장에서 튜플의 내부 요소 값을 변경하려고 하니 TypeError가 발생된다.
이처럼 튜플은 내부 요소 변경이 불가능한 점이 특징이다.
추가로 요소를 하나만 가지는 튜플을 선언할 때에도 아래의 특이사항을 유의해야한다.
tp = (10)
print(type(tp)) # <class 'int'>
tp_t = (10,)
print(type(tp_t)) # <class 'tuple'>
만약 요소를 하나만 가지는 튜플을 만들때 (10) 이라는 형태로 입력하면 숫자 10을 () 로 감싼 것으로 인식한다.
튜플로 데이터를 만들어야하는 경우 반드시 (10,) 과 같이 요소 뒤에 쉼표를 넣어 선언해야한다.
그렇다면 언제 튜플을 활용하게 되는지 더 자세히 살펴보자.
괄호 없는 튜플
튜플을 선언할 때에는 () 괄호를 이용한다고 하였지만 괄호를 생략해도 튜플로 인식할 수 있는 경우는 괄호를 생략할 수 있다.
tuple_test = 10,20,30,40
print(tuple_test) # 10,20,30,40
a, b = 10, 20
print("a:",a) # a: 10
print("b:",b) # b: 20
a, b = b, a
print("a:",a) # a: 20
print("b:",b) # b: 10
이처럼 괄호를 생략하고 여러 값을 할당하거나 값을 교환할 수 있다.
튜플과 함수
튜플은 함수의 리턴에 많이 사용한다.
함수의 리턴에 튜플을 사용하면 여러개의 값을 리턴하고 할당할 수 있기 때문이다.
def test():
return(10,20)
a,b = test()
print("a:", a, "b:", b)
위 예제처럼 괄호 없이 여러 값을 할당할 수 있는 것은 튜플로만 할 수 있기 때문에 자주 사용된다.
튜플도 리스트처럼 +와 *연산자 등을 활용할 수 있지만, 연산자를 활용하면 리스트로 작성하는 것과 큰 차이가 없어 튜플에서 사용하는 경우는 거의 없다.
람다
프로그래밍 언어에서는 함수라는 '기능'을 매개변수로 전달하는 코드를 많이 사용한다.
이 때 조금 더 효율적으로 작성할 수 있도록 제공되는 기능이 람다이다.
함수의 매개변수로 함수 전달하기
먼저 함수의 매개변수로 함수를 전달하는 코드를 살펴보자.
*콜백함수 : 함수의 매개변수에 사용하는 함수 (ex. print_hello() )
def call_10_times(func):
for i in range(10):
func()
def print_hello():
print("Hello")
call_10_times(print_hello)
filter()함수와 map()함수
함수를 매개변수로 사용하는 대표적인 내장함수(표준함수)로 filter()함수와 map()함수가 있다.
filter() 함수 : 리스트의 요소를 함수에 넣고 리턴된 값이 True인 것으로, 새로운 리스트를 구성해주는 함수
filter(함수, 리스트)
map() 함수 : 리스트의 요소를 함수에 넣고 리턴된 값으로 새로운 리스트를 구성해주는 함수
map(함수, 리스트)
아래 예제를 통해 map()함수와 filter() 함수를 알아보자.
def power(item):
return item * item
def under_3(item):
return item < 3
list_input_a = [1,2,3,4,5]
#map 함수 이용
output_a = map(power,list_input_a)
print(output_a) # <map object at 0x0000015F171175B0>
print(list(output_a)) # [1, 4, 9, 16, 25]
#filter 함수 이용
output_b = filter(under_3,list_input_a)
print(output_b) # <filter object at 0x0000015F176A3BB0>
print(list(output_b)) # [1, 2]
map()함수와 filter()함수를 호출할때 함수와 리스트를 매개변수로 사용하였다.
두 함수 모두 결과로 <map object>와 <filter object>가 출력되었는데 이를 제너레이터(generator)라고 부른다.
람다의 개념
위 예제처럼 매개변수로 함수를 전달하기 위해 함수 구문을 작성하는 것은 번거롭고 코드공간이 낭비되는 단점이 있다.
이러한 단점을 보완하기 위해 등장한 '람다'는 '간단한 함수를 쉽게 선언하는 방법'이다.
lambda 매개변수:리턴값
람다는 위와 같은 형태로 만들며, 이전 예제를 람다식으로 변경해보자.
list_input_a = [1,2,3,4,5]
#map 함수와 lambda 이용
output_a = map(lambda x: x * x,list_input_a)
print(output_a) # <map object at 0x0000015F171175B0>
print(list(output_a)) # [1, 4, 9, 16, 25]
#filter 함수 이용
output_b = filter(lambda x: x < 3,list_input_a)
print(output_b) # <filter object at 0x0000015F176A3BB0>
print(list(output_b)) # [1, 2]
실행결과는 이전과 같지만 람다를 사용하면 코드를 더 깔끔하게 작성할 수 있고, 함수가 매개변수로 넣어졌다고 확인하고 어떤 함수인지 알기 위해 다시 올라가는 수고를 하지 않아도 된다.
파일 처리
파일은 크게 텍스트파일과 바이너리파일로 나뉘는데 여기서는 텍스트파일과 관련된 내용만 살펴보자.
파일 열고 닫기
파일객체 = open("파일경로", "모드")
파일을 열때는 open() 함수를 사용하며 매개변수에는 파일경로(path)와 모드를 지정한다.
- "w" : write 모드 (새로 쓰기 모드)
- "a" : append 모드(뒤에 이어서 쓰기 모드)
- "r" : read 모드(읽기 모드)
파일객체.close()
파일을 닫을 때는 close()를 사용한다.
open() 함수로 파일을 열면 반드시 close() 함수로 닫아주어야한다.
스트림
스트림은 프로그램이 외부 파일, 외부 네트워크와 통신할때는 데이터가 흐르는 길을 의미한다.
open()함수를 실행하면 프로그램에서 파일로 흐르는 길이 만들어지고, clsoe() 함수를 실행하면 프로그램에서 파일로 흐르는 길이 닫힌다.
이러한 이유로 open() 함수로 파일을 열면 반드시 close() 함수로 닫아주어야 하며, 스트림을 열고 닫는 실수를 줄이고자 with 키워드가 등장하게 되었다.
with 키워드
개발을 하다보면 파일을 열고 닫지 않는 실수를 하는 경우가 생길 수 있다.
python은 이러한 실수를 방지하기 위해 with 키워드라는 기능을 제공한다.
with open("파일경로", "모드") as 파일객체:
실행할 문장
with 키워드를 사용하면 with 구문이 종료될때 자동으로 파일이 닫히기 때문에 파일을 열고 닫지 않는 실수를 줄일 수 있다.
텍스트 읽고 쓰기
- 파일객체.write("작성할 내용") : 파일에 텍스트를 작성한다.
- 파일객체.read() : 파일을 읽어온다.
텍스트 한 줄씩 읽기
텍스트를 사용해 구조적으로 표현할 수 있는 방법으로는 CSV, XML, JSON 등이 있는데 이 중 CSV에 대해 살펴보자.
CSV는 Comma Separated Values의 줄임말로 쉼표로 구분된 값들을 의미한다.
CSV파일은 한줄에 하나의 데이터를 나타내며 각각의 줄은 쉼표를 사용해 데이터를 구분한다.
이 때 첫번째 줄에 헤더를 넣어 각 데이터가 무엇을 의미하는지 설명할 수 있다.
이름, 키, 몸무게 -> 헤더 윤인성, 176, 62 ┐ 연하진, 169, 50 ┘-> 데이터 |
데이터가 많이 있다고 가정하고 데이터를 한 줄씩 읽어들일때는 for 반복문을 아래와 같은 형태로 사용한다.
for 한줄을 나타내는 문자열 in 파일객체:
실행할 문장
with open("C:\\Users\\USER\\Desktop\\VSCODE TEST\\info.txt","r", encoding="utf-8") as file:
for line in file:
(name, weight, height) = line.strip().split(", ")
if (not name) or (not weight) or (not height):
continue
bmi = int(weight) / ((int(height)/100)**2)
result = ""
if 25<=bmi:
result = "과체중"
elif 18.5 <= bmi:
result = "정상체중"
else:
result = "저체중"
print('\n'.join([
"이름 : {}",
"몸무게 : {}",
"키 : {}",
"BMI : {}",
"결과 : {}"
]).format(name,weight,height,bmi,result))
* SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3 오류가 발생되는 경우 파일 경로 C:\에 \을 추가하여 C:\\ 형태로 만들어주면 된다.
* 만약 한글이 깨져서 나오는 경우 encoding = "utf-8"로 설정해준다.
'Spec UP - Backend > 혼자 공부하는 파이썬' 카테고리의 다른 글
chap_07. 모듈 (0) | 2023.12.19 |
---|---|
chap_06-1. 구문오류와 예외 (0) | 2023.12.12 |
chap_05-2. 함수의 활용 (0) | 2023.11.13 |
chapter_05-1. 함수 만들기 (0) | 2023.10.27 |
chap_04-4. 문자열, 리스트, 딕셔너리와 관련된 기본 함수 (0) | 2023.10.26 |
댓글