[데이터 분석 부트캠프] 데이터 분석을 위한 핵심 Tool Python(8)
2023. 7. 11. 18:30ㆍIT 라이프/패캠 데이터분석 부트캠프 9기
반응형
1. 람다 표현식
⌘ 람다 표현식 이해
- 함수를 간편하게 작성할 수 있어서 다른 함수의 인수로 넣을 때 주로 사용함
- 따라서 보기 너무 복잡해지면 람다함수는 지양하고, def로 함수를 만들어서 사용하길 권장
- 람다 표현식은 lambda에 매개변수를 지정하고 콜론 뒤에 return value(반환값)로 사용할 식을 지정
# 람다식 자체를 실행해보면 함수 객체가 나오는데, 이 상태로는 함수를 호출할 수 없음
# 아! lambda 뒤에 오는게 매개변수였구나. 함수 정의할 때 첫줄에 들어가는 그거.(메인식에서 함수 호출할 때 넣는 인자가 아니라)
print(lambda x: x + 10) # <function <lambda> at 0x7fc530bb0ee0>
# 헷갈린다. 변수로 받았지만 그걸 함수로 사용하니까.
plus_ten = lambda x: x+10
print(plus_ten(1))
#변수 할당 안하고 바로 호출할 수 있음
# (lambda x: 식)(인자)
(lambda x: x + 10)(1)
# 람다 표현식 안에서는 변수를 만들 수 없다
# 변수가 필요한 코드일 경우에는 def로 함수를 작성하는게 좋음
(lambda x: y = 10; x + y)(1) # y를 만들어 쓸 수 없으므로 SyntaxError 발생
# 람다표현식 바깥에 있는 변수는 사용가능
y=10
(lambda x: x+y)(1)
⌘ map()에서 람다 표현식을 인수로 사용
# map()에서 람다함수 사용 가능한 이유는, int도 int()함수였기 때문에 동일한 것임
# map(적용하려는 함수, iterable 객체(=시퀀스자료))
# 1)
def plus_ten(x):
return x + 10
list(map(plus_ten, [1,2,3])) # [11, 12, 13]
# 2) 1번을 람다함수로 동일하게 표현
list(map(lambda x: x + 10, [1,2,3])) # [11, 12, 13]
# 필터 느낌도 있음
a = [1,2,3,4,5,6,7,8,9,10]
list(map(lambda x: str(x) if x%3 == 0 else x, a))
# 람다 표현식의 매개변수 개수에 맞게 '반복 가능한 객체'(시퀀스)도 콤마로 구분해서 넣어주면 됨
# map()에 객체를 여러 개 넣기
a = [1,2,3,4,5]
b = [2,4,6,8,10]
list(map(lambda x,y:x*y,a,b)) # a의 요소가 x로 들어가고 b의 요소가 y로 들어가므로 x,y를 괄호로 묶으면 안됨. 튜플이 되어버림
⌘ filter()에서 람다 표현식을 인수로 사용
# filter함수 사용법: filter(함수, 반복가능한객체)
# filter는 반복 가능한 객체에서 특정 조건에 맞는 요소만 가져옴. 즉, filter에 지정한 함수의 반환값이 True일 때만 해당 요소를 가져옴
def f(x):
return x > 5 and x < 10
a = [8,3,2,10,15,7,1,9,0,11]
list(filter(f,a))
# 람다로 위와 동일하게 짜보기
#filter(lambda x: x > 5 and x < 10, a) # filter객체를 리턴
list(filter(lambda x: x > 5 and x < 10, a))
⌘ reduce()에서 람다 표현식을 인수로 사용
# reduce(함수, 반복가능한객체) :누적으로 연산하는 용도
def f(x,y):
return x + y
a = [1,2,3,4,5]
from functools import reduce
reduce(f,a) # 15
# 위를 람다로 표현
# 객체리턴이 아니네ㅎ
reduce(lambda x,y:x+y, a) # 15
2. 파일 입출력
⌘ 파일 입출력
- 파일의 주인 = OS(운영체제)
- 파일을 사용할 때 파일주인에게 알려줘야 함
- 파일을 열어서 썼는데 닫질 않으면 다른 프로세스가 접근을 못하게 OS가 막음
⌘ readline()
inFp = open('data1.txt','r', encoding='utf-8')
inStr = inFp.readline()
print(inStr, end="")
inStr = inFp.readline()
print(inStr, end="")
inStr = inFp.readline()
print(inStr, end="")
inStr = inFp.readline() # 읽을게 없으면 그냥 null이고 에러 안남
print(inStr, end="")
inStr = inFp.readline()
print(inStr, end="")
inFp.close()
⌘ readlines()
# readlines()
inFp = None
inList = []
inFp = open('data1.txt', 'r', encoding='utf-8')
inList = inFp.readlines() # '\n'까지를 item으로 받는 리스트를 return하는 readlines()
#print(inList) # ['EduCoding\n', '에듀코딩\n', '파이썬 Python\n']
for line in inList:
print(line, end="")
inFp.close()
⌘ write()
# write 'data2.txt'
outFp = open('data2.txt','w', encoding='utf-8')
while True:
outStr = input("내용 입력: ")
if outStr != "":
outFp.write(outStr+'\n')
else:
break
outFp.close()
print('--- 정상적으로 파일에 써졌음 ---')
3. GUI
⌘ Tkinter
- Tkinter 라이브러리: 파이썬 표준 라이브러리(내장함수)
- 단점: 위젯부족, ui 안예쁨
- 장점: 표준 라이브러리라서 쉽고 간단한 GUI 프로그램 만들 때 활용, GUI개념을 익히기 적합
- 만드는 순서
- 메인 창(Tk 객체) 생성
- 위젯 생성(라벨, 버튼, 슬라이더 등)
- 위젯을 창에 배치
- 메인 루프 실행
# 버튼을 눌렀을 때 처리(클릭시마다 apple/orange로 출력 왔다갔다-전역변수 사용)
import tkinter as tk
# Tk 객체 인스턴스 생성
root = tk.Tk()
"""
text = 'apple'
def func():
global text
if text == 'apple':
label.config(text = 'orange')
text = 'orange'
else:
label.config(text = 'apple')
text = 'apple'
"""
bAct = False
print(type(bAct))
def func():
global bAct
if bAct:
label.config(text = 'Apple')
bAct = False
else:
label.config(text = 'Orange')
bAct =True
# 라벨 생성
label = tk.Label(root, text = 'Push Button')
# 라벨 배치
label.pack()
# 버튼 생성, command:이벤트 등록
button = tk.Button(root, text='Push!', command = func) # 클릭 n번하면 'Pushed'도 n번 print됨
# 버튼 배치
button.pack()
root.mainloop()
정리
그동안 감으로 대충 쓰던 람다함수를 제대로 이해하게 되었다.
문법도 왜 맨날 기억하던게 틀렸나(list comprehension처럼) 의아했는데 실제로 기본문법과 달라지는 구조가 있었다는 것도 오늘 확실히 정리되었다. map(), filter()는 매개변수로 함수명과 iterable 객체를 받고, 시퀀스 객체를 알아서 돌며 item을 함수의 인자로 받아서 실행하는 구조라는 것도 이해하고 나니 확실히 쉬운 느낌이 들었다. 실제로 뒤에 진도 나가면서도 느꼈지만 의외로 함수를 인자로 받는 경우가 많고, 그 경우에는 함수임에도 함수명만 쓰지 뒤에 괄호는 쓰지 않는다는 걸 보며 그동안 눈치 못채고 어렵게만 생각했단 걸 깨달았다.
예제에서는 시퀀스 객체로 리스트만 가지고 실습했지만, dict나 문자열 등도 있으니 dict가 특히 궁금해서 구글링해서 예제를 몇 개 봤다.
파일 입출력도 안쓴지 오래 되다보니 또 까먹어서...다양하게 쓰면서 배우고 싶었는데 아쉽게도 제일 흔하게 쓰고 파일을 닫을 필요도 없는 with open() as f로 시작하는 파일 오픈 방식을 다루지 않아서 아쉬웠다. 이건 다른 온라인 강의로 다시 확인해봐야겠다.
GUI는 처음 다뤄봤는데 거의 맛보기 수준이라서 딱히 코멘트할 건 없지만 GUI의 동작 프로세스나 객체지향(event driven)을 경험해봤다는 것에서 의미있었던 것 같다.
728x90
반응형
'IT 라이프 > 패캠 데이터분석 부트캠프 9기' 카테고리의 다른 글
[데이터 분석 부트캠프] 데이터 분석을 위한 핵심 Tool Python(10) (0) | 2023.07.13 |
---|---|
[데이터 분석 부트캠프] 데이터 분석을 위한 핵심 Tool Python(9) (0) | 2023.07.12 |
[데이터 분석 부트캠프] 데이터 분석을 위한 핵심 Tool Python(7) (0) | 2023.07.10 |
[데이터 분석 부트캠프] 데이터 분석을 위한 핵심 Tool Python(6) (0) | 2023.07.08 |
[데이터 분석 부트캠프] 데이터 분석을 위한 핵심 Tool Python(5) (0) | 2023.07.06 |