-
[KT 에이블스쿨 5기] DX트랙 2주 2일차 복습_함수, 정규표현식KT 에이블스쿨 복습 2024. 2. 28. 01:27
**셀프 복습용으로 작성한 것이라 실수가 있을 수 있습니다!
혹시 실수를 발견하시면 댓글로 알려주시면 감사드리겠습니다 :)08 함수
함수는 입력(input)을 받아 무엇인가를 처리한 후 그 결과를 반환하는 것!
입력을 함수에 넣으면 출력이 되는 형태와 같음
같은 입력이어도 함수 기능에 따라 다른 출력이 됨!
함수는 def문으로 정의함
함수의 구성
① 입력(Input) - 매개변수, 생략가능
② 처리 - 코드들
③ 출력(Output) - 처리 결과, 생략가능
입력(Input)
1) 매개변수
- 아래 함수는 입력이 없이 처리되는 함수이다.
def hello(): print('안녕하세요? 반갑습니다!')
- 이름을 직접 받아서 처리하는, 즉 매개변수를 갖는 함수는 아래와 같다
- 위치를 기준으로 매개변수에 전달되는 값을 위치 인수(Positional Argument)라고 한다!
def hello(name): print(f'{name}님 안녕하세요? 반갑습니다!') #name은 매개변수 hello('홍길동') #'홍길동'은 인수, 매개변수 X #홍길동님 안녕하세요? 반갑습니다! 출력
2) 매개변수 기본값
- 위 함수는 매개변수가 없으면 오류가 발생
- '매개변수 = 값'의 형태로 기본값을 지정할 수 있음
- 이름을 전달하지 않으면 '여러분'이 기본값으로 사용되게 수정
- 기본값으로 매개변수에 전달되는 인수를 기본 인수(Default Argument)라고 한다!
def hello(name='여러분'): print(f'{name}님 안녕하세요? 반갑습니다!') hello('홍길동') #홍길동님 안녕하세요? 반갑습니다! 출력 hello() #여러분님 안녕하세요? 반갑습니다! 출력
- 아래는 문자를 출력할 때 f-string사용하지 않고 더하기 연산자로 문자열을 연결함!
WHY? 매개변수인 name을 대/소문자 처리해야 하기 때문def hello(name, loud=1): for num in (name, loud): if loud == 1: print('HELLO ' + name.upper() + '!!!') elif loud == 0: print('Hello ' + name.lower() + '.') hello(name='Kim', loud =0) hello(name='Kim')
3) 매개변수 순서
- 매개변수 순서에 맞게 값을 넣으면 매개변수 이름을 생략할 수 있음(=위치 인수)
- '매개변수=값' 형태로 매개변수 이름을 지정하면, 전달되는 순서를 바꿀 수 있음
- '매개변수=값' 형태로 매개변수에 전달되는 인수를 키워드 인수(Keyword Argument)라고 한다!
def mem_info(name, score): print(f'{name}님 점수는 {score}입니다.') mem_info('홍길동', 90) #홍길동님 점수는 90입니다. mem_info(90,'홍길동') #90님 점수는 홍길동입니다. mem_info(score=90, name='홍길동') #홍길동님의 점수는 90입니다.
def hello(name, loud=1): if loud == 1: print(f'우~~와~~ {name}님 안녕하세요? 반갑습니다!!!') else: print(f'{name}님 안녕하세요? 반가워요.') hello(name='홍길동', loud=1) # 매개변수 이름 = 값 으로 지정 hello(loud=0, name='홍길동') # 매개변수 이름으로 지정하면 순서 변경 가능 hello('홍길동', 0) # 매개변수 순서에 맞게 값을 넣으면 매개변수 이름 생략 가능 hello('홍길동') # 함수 생성 시 loud = 1 로 선언했으므로, 생략하면 기본값 1이 입력됨
4) 가변 인수
- 임의 개수의 값이 매개변수에 전달되는 인수를 가변 인수(Arbitrary Argument)라고 한다!
- 가변 인수는 대부분 함수 안에서 반복문을 사용해 처리함
- 아래 코드의 뜻을 해석하면
1) hello라는 함수는 여러 개의 매개변수를 받는다 (가변 인수)2) for문을 통해 names 즉, 인수를 입력받은 매개변수에서 who에 하나씩 꺼내온다
3) f-string을 통해 who에 각각 하나씩 출력 + '님 안녕하세요? 반갑습니다!' 문자열이 반복된다
def hello(*names): for who in names: print(f'{who}님 안녕하세요? 반갑습니다!') hello('홍길동', '일지매', '강우동') #홍길동님 안녕하세요? 반갑습니다! #일지매님 안녕하세요? 반갑습니다! #강우동님 안녕하세요? 반갑습니다! 출력
5) 가변 인수와 위치 인수
- 위치 인수를 가변 인수 앞에 둘 수 있음
- 하지만 아래의 경우 키워드 인수로 사용할 수 없음
def hello(title, *args): for who in args: print(f'{who}{title} 안녕하세요? 반갑습니다!') hello('선생님', '홍길동', '일지매', '강우동') hello(title='선생님', '홍길동', '일지매', '강우동') #해당 코드는 키워드 인수가 있기에 불가능!
- 가변 인수 뒤에 위치 인수를 둘 수 없음 (→ 키워드 인수를 사용하면 가능)
def hello(*args, title): for who in args: print(f'{who}{title} 안녕하세요? 반갑습니다!') hello('홍길동', '일지매', '강우동', '선생님') #불가능 hello('홍길동', '일지매', '강우동', title='선생님') #가변 인수 뒤 위치 인수에 키워드 인수 사용!
***결론: 가변 인수, 위치 인수, 키워드 인수를 사용하는 위 방식을 활용하자!
출력(Output)
함수 안에서 결괏값을 반환할 때는 return문을 사용
return문만 작성하면 함수를 끝낸 다는 의미
def calculate1(a, b): summ = a + b return summ r1 = calculate1(10, 5) print(r1) #15 출력
- 위의 함수에서 반환하는 return문이 없을 경우 출력하면 None이 출력
def calculate1(a, b): summ = a + b print(summ) #return이 없음 r1 = calculate1(10, 5) print(r1) #15 출력
- 함수가 여러 개의 결괏값을 반환할 수도 있음!
def calculate2(a, b): summ = a + b mult = a * b return summ, mult r1, r2 = calculate2(10, 5) print(r1) print(r2)
예외 처리
함수 안에서 발생할 수 있는 오류에 대한 사전 처리를 하는 것 권고
다음 함수는 오류에 대한 처리가 없어서 함수 사용 시 오류가 발생
def divide(a, b) : result = a / b return result divide(10, 0) #분모는 0이 될 수 없기에 오류 발생!
1) 입력 오류 처리
- 위 함수를 오류 처리를 위해 아래와 같이 수정할 수 있음 (분모가 0인 경우에 대한 처리를 함수에 추가)
def divide(a, b) : if b == 0 : print('나누는 값이 0이 될 수 없습니다.') return else : result = a / b return result divide(10, 0)
2) 입력 데이터 형식 확인
a = 123 print(type(a) == int) #변수 a가 정수인지 b = 'abc' print(type(b) is str) #변수 b가 문자열인지 c = [1, 2, 3] print(type(c) is list) #변수 c가 리스트인지 d = {'v': 23} print(type(d) == dict) #변수 d가 딕셔너리인지
- 위 구문을 활용해 함수에 추가
def divide(a, b) : if b == 0 : print('나누는 값이 0이 될 수 없습니다.') elif (type(a) != int) or (type(b) != int): print('정수 연산만 가능합니다.') else: result = a / b return result divide(10, 0) #나누는 값이 0이 될 수 없습니다. divide(10, 'ab') #정수 연산만 가능합니다. divide(10, 2) #5.0
내장 함수
이미 Python이 제공하고 있는 함수 정리
abs(x) x의 절대값을 반환 (음수 → 양수 전환) all(x) x의 요소가 모두 참이면 True 반
(리스트에 0이 있으면 → False 반환)any(x) x의 요소 중 하나라도 참이면 True 반환
(리스트에 0이 있어도 → True 반환)chr(x) 아스키 코드값 x에 대응하는 문자를 반환
(ex. chr(65) = 'A', chr(97) = 'a')dir(x) 객체 x가 가지고 있는 변수나 메서드 목록을 반환
(객체의 속성 목록, 사용할 수 있는 방법을 알려줌)divmod(x,y) x를 y로 나눈 몫과 나머지를 튜플 형태로 반환 enumerate(x) 리스트, 튜플, 문자열을 받아 인덱스와 값을 반환 eval(x) 실행 가능한 문자열 x를 받아 그 문자열을 실행한 결과를 반환 filter(f, x) 함수 f에 x를 매개변수로 전달해 True인 경우만 반환 id(x) 객체 x의 고유 주소값을 반환 input() 사용자로부터 입력을 받음 (입력 받은 값은 항상 문자열) int(x) x를 정수로 변환 isinstance(x,y) x가 y의 인스턴스인지 여부를 True, False로 반환 len(x) x요소들 개수를 반환 list(x) x를 리스트 자료형으로 변환하여 반환 map(f,x) 함수 f에 x 요소를 하나씩 전달해 얻은 결과를 반환 max(x) x 요소들 중 최댓값을 반환 min(x) x 요소들 중 최솟값을 반환 ord(x) 문자 x의 아스키 코드값을 반환 pow(x,y) x를 y번 제곱한 결과를 반환 range(x,y,z) x부터 y-1까지 z씩 증가하는 객체를 반환 sorted(x) x 요소를 정렬하여 반환 str(x) x를 문자열로 변환하여 반환 sum(x) x의 요소를 모두 더한 결과를 반환 tuple(x) x를 튜플로 변환하여 반환 zip(x,y) x와 y 요소를 쌍으로 묶어서 반환 09 정규 표현식
Python만의 기능이 아닌, 문자열을 다루는 여러 곳에서 사용되는 공통된 표현식!
이해하기 어려울 수 있지만 알아두면 편리!
정규식 사용 전/후 비교
기존의 반복문으로 처리하던 것 → 정규식으로 처리하면 코드가 단순해짐
1) 기존 반복문으로 처리
: 빈 리스트를 변수 phone_x에 선언 후 for문을 통해 기존 peoples를 .split(' ')공백으로 쪼갠다!
: 공백을 기준으로 쪼갠 홍길동: / 010-1234-5678 / 한사랑: / 010-4321-8765 / 일지매: / 010-2143-6587 중
word의 글자수가 13개 (len())이고, 슬라이싱했을 때 숫자라면 (isdigit()) -앞까지 자르고 뒤에 -XXXX를 붙인다!# 이름과 전화번호가 섞여 있는 문자열 peoples = '홍길동: 010-1234-5678 한사랑: 010-4321-8765 일지매: 010-2143-6587' # 전화번호 뒷자리 숨기기 phone_x = [] for word in peoples.split(' '): if len(word) == 13 and word[:3].isdigit() and word[4:8].isdigit() and word[9:13].isdigit(): word = word[0:8] + '-XXXX' phone_x.append(word) else: phone_x.append(word) peoples_new = ' '.join(phone_x) print(peoples_new)
2) 정규식으로 처리
# 전화번호 뒷자리 숨기기 import re re.sub('(\d{3}[-]\d{4})[-]\d{4}', '\g<1>-XXXX', peoples) #re.sub(찾을 패턴, 새로운 값, 대상 문자열) #d의 의미: digit(숫자){3자리} / 소괄호의 의미: 살리겠다는 의미 #g의 의미: group(그룹), 소괄호로 묶은 그룹, \g<0>이면 콤마 전 나오는 전체 #peoples의 의미: peopls라는 문자열 (바꿀 대상) #아래도 가능 import re pat = re.compile('(\d{3}[-]\d{4})[-]\d{4}') pat.sub('\g<1>-XXXX', peoples)
기본적인 정규식
정규식에서 활용하는 메서드
특정 패턴의 문자열을 확인하는 메서드 match() 문자열 처음부터 정규식과 매치 여부를 확인 search() 문자열 전체를 대상으로 정규식과 매치 여부를 확인 findall() 정규식과 매치되는 모든 문자열을 리스트 형태로 반환 finditer() 정규식과 매치되는 모든 문자열을 반복 가능한 개체로 반환 매치된 결과 메서드 group() 매치된 문자열을 반환 start() 매치된 문자열의 시작 위치를 반환 end() 매치된 문자열의 끝 위치를 반환 span() 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 반환 그 외
- 대괄호([]) 안에 문자를 나열하여 그 문자들 포함 여부를 확인
- ^를 사용해 나열되지 않은 문자들 포함 여부 확인 [^ave] 이면 a,v,e를 제외한 문자열 찾기!
- 빼기 기호(-)를 사용해 문자의 범위를 지정
- 정규식의 Dot(.) 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치 (.의 의미는 문자 사이의 글자 수)
'KT 에이블스쿨 복습' 카테고리의 다른 글
[KT 에이블스쿨 5기] DX트랙 2주 4일차 복습_넘파이 기초, 판다스 데이터 프레임 생성 및 탐색 (3) 2024.03.01 [KT 에이블스쿨 5기] DX트랙 2주 3일차 복습_파일 읽고 쓰기, 엑셀 파일 다루기, 이메일 보내기 (0) 2024.02.29 [KT 에이블스쿨 5기] DX트랙 2주 1일차 복습_제어문 (0) 2024.02.26 [KT 에이블스쿨 5기] DX트랙 3일차 복습_튜플, 집합, 딕셔너리 (1) 2024.02.24 [KT 에이블스쿨 5기] DX트랙 2일차 복습_문자열, 리스트 (0) 2024.02.22