오늘은 목차 없다.
처음부터 끝까지 함수다.
함수(Function, 函數).
중학생 시절 수학선생님께서 함수의 함이 상자(서랍함 할때 그 함)라고 알려 주셨었다.
지금 생각해 보면 뼈문과인 나에게 참 적절한 설명이었다고 생각한다.
어떤 입력값(input)이 마술상자(함)에 들어갔다 뿅 바뀌어서 나오는거지(output).
결국 함수 선언이란 그 마술상자 안의 구조를 만드는 거고.
정확한 인식인지는 모르겠지만, 이때문에 나에게 함수는
어떤 동작을 실행하는 객체(object)에 가깝다.
메서드는 동작 그 자체, 함수는 어떤 동작을 시키는 애.
함수와 return
함수는 기본적으로 처리를 하지, 반환을 하지는 않는다.
상자에 배출 기능은 없는 것이다.
그래서 배출 기능(반환)을 달아줘야 하는데, 그게 return 문이다.
def hello():
print('안녕하세요? 반갑습니다!')
a = hello()
print(a)
# 출력값
None
def hello():
return '안녕하세요? 반갑습니다.' # return'문'이므로 괄호 안 쓴다.
a = hello() # 반환값이 있으므로 출력이 된다.
print(a)
# 출력값
안녕하세요? 반갑습니다.
매개변수, 위치 인수, 기본 인수, 키워드 인수, 가변 인수
개념적인 거니까 정리하고 넘어간다.
- 매개변수 : 함수의 괄호 안에 들어가는 변수, 이걸 원하는 함수도 있고, 아닌 함수도 있다.
- 위치 인수 : 자기가 여러 매개변수 중에 뭐인지를 위치 기반으로 전하는 인수 ex) range(a, b) : a부터 b 앞까지
- 기본 인수 : 매개변수가 있어야 하는데 없을 때 쓰도록 약속된 인수. 함수마다 따로 설정한다.
- 키워드 인수 : 위치 기반이 아니라 '매개변수 = 값'의 형태로 지정된 인수 ex) sns.hist(x = df['c1'], y = df['c2'])
제대로 쓴 거 맞나? - 가변 인수 : 매개변수에 하나가 아니라 여러 개의 인수가 전달되는 형태. 함수 내에서 반복문으로 처리한다. 매개변수 앞에 *을 붙여서 표기한다. iterable한 형태.
# 매개변수
def hello(name): # name이 매개변수
print(f'{name}님 안녕하세요? 반갑습니다!')
# 위치 인수
def hello(name, who):
print(f'{name}{who}님 안녕하세요? 반갑습니다!')
hello(홍길동, 선배) # '홍길동'이 앞에 있으니 name, '선배'가 뒤에 있으니 who
# 기본값 인수
def hello(name=홍길동): # 기본값을 '홍길동'으로 정의했으므로 매개변수 입력 안하면 '홍길동'으로 취급
print(f'{name}님 안녕하세요? 반갑습니다!')
# 가변 인수
def hello(*args): # 최초 정의 시 매개변수를 *가변인수로 설정
for who in args: # 반복문으로 복수의 인수 처리
print(f'{who}님 안녕하세요? 반갑습니다!')
hello('홍길동', '일지매', '강우동') # 3개의 값이 매개변수에 전달됨
주의사항 1. 가변 인수는 위치 인수 뒤에 와야 한다.(헷갈린다. 아래를 권장)
주의사항 2. 가변 인수가 앞에 있으면 나머지는 위치 인수 못쓰고 키워드 인수로 써야 한다(권장)
-> 가변 인수는 늘 앞에 두고, 가변 인수 있을 때는 키워드 인수 사용하자.
예외처리
매개변수에 설정하지 않은 값이 들어온다거나 하면 당연히 오류가 난다.
근데 오류는 안 예쁘잖아(...)
그러니 오류가 일어날 상황을 예측해서 예외처리를 해 주는 게 좋다.
# 함수 만들기
def divide(a, b) :
if b == 0 :
return('ERR: 나누는 값이 0이 될 수 없습니다.')
elif (type(a) != int) or (type(b) != int):
return('ERR: 정수 연산만 가능합니다.')
else:
return a / b
# 함수 사용
a = divide(10, 0)
b = divide(10, 'ab')
c = divide(10, 2)
# 확인
print(a)
print(b)
print(c)
# 결과
ERR: 나누는 값이 0이 될 수 없습니다.
ERR: 정수 연산만 가능합니다.
5.0
실습 문제
- 함수 even을 만들어 보세요.
- 입력 매개변수로 리스트를 입력받아.
- 입력받은 리스트 값들 중 짝수로만 구성된 새로운 리스트를 반환
# 함수 선언
def even(x):
result = [] # 빈 리스트 생성
for i in x: # 짝수 i를 result에 누적
if i % 2 == 0:
result.append(i)
return result
# 함수 사용
even([2, 3, 6, 8, 11])
# 또는 확장 문법으로 선언
def even(x):
result = [i for i in x if i % 2 == 0]
return result
# 함수 사용
even([2, 3, 6, 8, 11])
그리고
마지막에 정규 표현식이라는 녀석을 배웠다.
얜 진짜 난생 처음 본다.
강사님께서도 일단 구경하라는 느낌으로 알려주셨지만, 중요한 냄새가 솔솔 난다.
아래는 ChatGPT가 말하는 정규 표현식이다.
정규 표현식(Regular Expression, 줄여서 regex)은 특정한 규칙을 가진 문자열을 찾거나, 일치 여부를 검사하거나, 치환 등의 작업을 수행할 때 사용하는 일종의 패턴이다. 파이썬에서는 re 모듈을 통해 정규 표현식을 사용할 수 있다.
1. 정의
정규 표현식은 문자열의 검색, 치환, 검증 등에 사용되는 패턴을 정의한 언어이다. 복잡한 문자열에서 특정한 규칙을 가진 부분을 쉽게 찾아내거나 변환할 수 있도록 돕는다.
2. 쓰임새
- 문자열 검색: 특정 문자열이나 패턴을 찾을 때 유용하다.
- 패턴 매칭: 이메일 주소, 전화번호, 우편번호 등 특정 형식의 문자열을 검증하는 데 자주 사용된다.
- 치환: 특정 패턴에 일치하는 부분을 다른 문자열로 대체하는 데 사용된다.
- 분할: 특정 패턴을 기준으로 문자열을 여러 부분으로 나누는 데 유용하다.
3. 구성 요소
정규 표현식의 주요 구성 요소는 다음과 같다:
- 문자: 단순히 문자 자체를 검색한다. 예를 들어, a는 문자열에서 문자 "a"를 찾는다.
- 특수 문자(메타 문자): 정규 표현식에서 특별한 의미를 가지는 문자들이다.
- . : 모든 한 문자를 의미한다.
- ^ : 문자열의 시작을 나타낸다.
- $ : 문자열의 끝을 의미한다.
- * : 앞의 문자가 0번 이상 나타남을 의미한다.
- + : 앞의 문자가 1번 이상 나타남을 의미한다.
- ? : 앞의 문자가 0번 또는 1번 나타남을 의미한다.
- [] : 대괄호 안의 문자 중 하나가 나타남을 의미한다. 예: [abc]는 "a", "b", "c" 중 하나를 찾는다.
- \ : 메타 문자가 아닌 문자로 인식되도록 이스케이프 처리할 때 사용된다.
4. 예시
import re
pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'
email = "test@example.com"
if re.match(pattern, email):
print("유효한 이메일입니다.")
else:
print("유효하지 않은 이메일입니다.")
위 코드는 정규 표현식을 이용하여 문자열이 이메일 형식에 맞는지 확인하는 간단한 예시이다.
강의때 배운 것과 섞어서 요약하자면,
- 문자열의 패턴을 나타낸 것이다.
- 파이썬에서 import re를 통해 실행할 수 있다.
- 문자열 앞에 r을 붙임으로써 정규 표현식임을 나타낸다.
- 긴 문자열에서 특정 형식의 문자를 찾아내 편집가능하다.
- 규칙체계는 다음과 같다.
. | 하나의 문자 |
^ | 문자열 시작 |
$ | 문자열 끝 |
* | 0번 이상 문자가 나타남 |
+ | 1번 이상 문자가 나타남 |
? | 0번 또는 1번 문자가 나타남 |
[] | 안의 문자 중 하나가 나타남 |
\ | 문자가 있긴 한데 신경x |
d{x} | 숫자가 x개 연달아 있음 |
c{x} | 문자가 x개 연달아 있음 |
g<x> | 소괄호로 묶은 x번째 그룹 |
re.match() | 문자열의 시작 부분과 대조 |
re.search() | 문자열 전체에서 첫번쨰로 일치하는 패턴 검색 |
re.findall() | 주어진 패턴과 일치하는 부분을 리스트로 반환 |
음..... 막상 정리하고 보니.... 그렇게 막막하지만은 않은....? 느낌....?
아직 잘 모르겠다.
의식하고 몇 번 써먹어 보면 할 수 있게 되겠지.