25.10.16 7일차 [ 파이썬 기초 개념 강의_(매개변수, 함수 종류, 내장함수, 외장함수, pickle, scope, 애너테이션, 모듈화, 모듈 가져오기, __name__, 예외처리)]
Datadesigner2025. 10. 17. 17:48
오늘은 어제에 이어서
매개변수 파트 정리
함수의 종류
내장 함수
외장 함수
pickle
scope
애너테이션
모듈화
모듈 가져오기
__name__
예외처리
등의 내용을 공부하였다
내용 정리
요구사항 - 함수명 : add_ex - 입력 : 가변인자 (*인자명) , x - 처리 : 입력된 모든 인자를 합산 - 반환 : 합산 결과
def add_ex( *x ): print ( x , type(x)) sum = 0 for n in x: sum += n return sum
add_ex(1) add_ex(1, 2) add_ex(1, 2, 3) 출력값
(1,) <class 'tuple'> (1, 2) <class 'tuple'> (1, 2, 3) <class 'tuple'> 6 1. 가변인자 *x에 튜플을 대입하며 sum = 반환값이다 2. 이 때 for문을 통해서 sum에 각 값을 합산한다는 반복을 부여하고 3. n 값이 합산된 값 sum을 반환받는다.
매개변수, 인자 : 일반인자, 가변인자 혼용
대부분 타인이 만들 라이브러리들은 이 순서를 따름
일반 인자는 *필수인자*로 인식됨 -> 반드시 함수 호출 시 세팅되어야 함
def add_ex2( x , *y ) : # *y = 가변인자 print( f'x={x} , y={y}') add_ex2(1) add_ex2(1, 2) add_ex2(1, 2, 3) 출력값 x = 1, y=() x = 1, y=(2, ) x = 1, y=(2, 3) # 첫 번째 인자는 x로, 나머지 인자들은 가변인자로 대입되어 이러한 출력이 나온다.
1 same None 2 same None 3 valid None 1 vaild None 1 same (4, 4) 2 vaild (4, 4)
기본 인자를 제공하지 않는다면 함수 정의 시 부여된 기본값으로 출력된다. 하나하나 출력값과 대입해서 생각해본다면 어떠한 과정으로 매개변수에 인자가 들어가는지 알 수 있다. 이 때 shape 부분은 None인데 이는 어떠한 형식의 데이터도 받아들일 수 있는 Any로 나온다.
def add5 ( a, b, *c, **kwargs): print ( a, b, c, kwargs)
add5 (1, 2, 3, 4, 5, 6, ppp='파이썬')
출력값은? 1 2 (3, 4, 5, 6) {'ppp' : '파이썬'} 이는 일반 인자 a b 에는 순서대로 1 과 2 가 배치되고 3, 4, 5, 6 은 가변인자 *c로 **kwargs에 키 값이 배치된것이다.
def add5 ( a, b, *c, **kwargs): print ( a, b, c, kwargs)
add5 ( a = 10 , ppp='파이썬', b = 100) 10 100 () {'ppp' : '파이썬'} 기본값이 없는 매개변수에는 반드시 함수 호출 시 인자값을 전달해야 한다 -> 필수 옵션
함수 종류
내장 함수
파이썬 설치하면 바로 사용 가능함
외장 함수
파이썬 설치 혹은 써드파트 라이브러리 (패키지) 설치 후 접근 가능
특정 모듈을 가져와서, 해당 모듈 기반에서 접근
import random
# 거의 대부분 . 연산자가 보임 -> 출처 표기가 명확함
random.randint()
사용자 정의 함수
기본형
람다함수 (가장 빠른 함수)
데코레이터 적용된 함수
순수함수, 클로저 개념 적용
변수 스코프 사용 : global(전역), nonlocal(아웃터(바깥쪽)) 함수 내부에서 이너(내부) 의 함수의 변수를 사용할 때 표기)
제너레이터 적용된 함수
중요 내장 함수
중요한것만 살피고, 필요시 찾아서 사용이 기본
파일 I/O(입출력)
목적
파이썬 프로그램 <-> 파일(리소스, 로컬 PC내 os단에 존재, 클라우드 내 서비스 s3 등등)
읽기(r), 쓰기 (w), 생성
기본값 텍스트 읽고 쓰기, b(바이너리)읽고 쓰기
open()
파이썬 인터페이스(도구)만 제공, 실제 처리는 C/ C++이 수행, 연결고리는 싸이썬 라이브러리 처리 <- 싸이썬 오타 아니다!
특징
I/O 수행하면 잠재적으로 오류 발생할 수 있음
예외처리등 필요
리소스를 오픈했으면 반드시 닫는다 (close())
close() 누락 방지 -> 자동 닫기 기능 제공 -> with문
# 기본 파일 생성 오픈, 닫기 # 1. 생성 및 오픈 f = open("a.txt", (w)) -> w가 쓰기를 표시하는것임 # 2. 작업 f.write('ab AB 가나 12 !@') # 3. 닫기 f.close() -> 이 작업을 수행하면 파일칸에 a.txt가 생기고 읽어보면잘 출력이 된 것을 볼 수 있다.
with문을 사용한다면 as = 별칭을 붙여주는 함수와는 또 다른 기능이다 문법 대상 as 별칭
with open("a.txt" , "w") as f: f.write('ab AB 가나 12 !@")
실행해보면 똑같은 작업이 구동되는것을 확인할 수 있다. 그리고 자동으로 close()가 적용되어 close함수도 빠져 더욱 처리가 빠른 코드가 된것!
map()
목적
연속된 데이터(컬렉션 계열들 중 리스트)의 멤버를 하나씩 꺼내서 뭔가 작업(2배로 확대, 전처리 등등)
데이터를 하나씩 꺼내 조작(전처리)
datas = [1, 2, 3, 4, 5]
# 요구사항 : datas의 모든 멤버의 값을 2배로 업그레이드 하시오
# 2배 곱하는 함수 정의 def double( x ): return x * 2
list( map( double , datas ) )
출력값 [2, 4, 6, 8, 10] map()은 쉽게 생각해서 뒤에 있는 데이터를 하나씩 꺼내서 앞에 있는 함수에 대입한다고 생각하면 된다. 그리고 list로 묶여있기 때문에 그대로 리스트에 담겨서 출력되는것
그리고 이것을 리스트 컴프리헨션으로 구한다면
[ v*2 for v in datas ]
같은 값이 출력되는것을 알 수 있다. 리스트 컴프리헨션 짱이다 순서대로 [ v ] -> 리스트에 하나 나올 변수 제공 [ v *2 ] -> 원하는 값이 2배니까 변수에 *2 [ v*2 for v in datas ] -> 그냥 변수에 for문으로 하나씩 대입 끝 덜덜
람다 함수
가장 빠른 고속 함수
사용된 곳과 한 몸으로 세팅이 됨 -> 재사용 x -> 1회성
lambda 매개변수 .. : 수행문이 1개여야 함, return 생략
# 람다함수로 동일한 값을 구하면?
list( map ( lambda x : x*2 ,datas))
[2, 4, 6, 8, 10] map() 함수는 뒤의 리스트에서 앞의 수행문을 수행한다, 이 때 lambda x : x*2 는 대입받는 변수 x 에 *2를 한다는 뜻이니 그대로 출력되는 것이다.