240207 수 학습내용 복습
1. 함수 (funciton) 란?
호출될 때 특정 기능을 실행하는 재사용 가능한 코드 블록
- 지정된 코드에 이름을 붙여 관리하는 방법
- 코드의 간결함을 높여주고, 재사용성을 높여줌.
- python은 OOP(객체 지향 프로그래밍)도 지원하기 때문에 메소드 개념도 동시에 존재함
2. 함수의 종류
1) 내장 함수
2) 사용자 정의 함수
사용사 정의 함수 예)
-
- print() : 출력하는 기능len() : 길이 확인하는 기능replace() : 문자열을 대체하는 기능
- sort() : 정렬하는 기능
- range() : 입력된 범위에서 일련의 숫자열을 생성하는 기능
- type() : 데이터 타입 반환하는 기능
3) 익명함수 (람다식)
3. 사용자 정의 함수 문법 및 호출
사용자 정의 함수 및 구조
def 함수명 (매개변수) :
실행문장
return 반환변수
예) n1과 n2를 매개변수로 받아 두 수의 합을 구하는 함수 number_sum 정의
#함수 정의
def number_sum(n1, n2) :
result = n1 + n2
return result
함수 호출
예)위에서 정의한 n1과 n2를 매개변수로 받아 두 수의 합을 구하는 함수 number_sum 호출
#함수 호출
rs = number_sum(2,10)
print(rs) #출력 : 12
예) 빼기함수 만들기 : 두 수를 입력 받아서 뺀 결과를 return하는 함수 number_sub를 정의하고 호출하기
#함수 정의
def number_sub(num1, num2):
return num1 - num2
# 사용자입력
num1 = int(input('첫 번째 정수 입력>>'))
num2 = int(input('두 번째 정수 입력>>'))
# 함수 호출
rs = number_sub(num1, num2)
print(rs)
예) 약수 출력 함수 만들기 : 숫자 1개를 입력 받을 때 약수를 출력하는 함수 divisor 정의하고 호출하기
#함수 정의
def divisor(input_number):
for i in range(1, input_number+1):
if input_number % i == 0:
print(i, end=" ")
# 함수 호출
divisor(32) #출력:1 2 4 8 16 32
divisor 함수의 매개변수로 32를 넣어 호출하면 32의 약수가 출력된다.
4. 함수의 특징
4.1. 전역변수와 지역변수(global)
# 함수에서 선언된 변수는 지역변수다
a = 10 #전역변수 선언
def test() :
a = 1 # 지역변수로 인식
test()
print(a) #출력 : 10
마지막에 1이 출력되어야할 것 같지만 10이 출력됨
→파이썬은 지역변수가 우선 시 됨!!
# global 키워드를 이용해 전역변수로 인식시키자
a = 10 #전역변수 선언
def test() :
global a
a = 1 # 전역변수로 인식
test()
print(a) #출력 : 1
전역변수로 인식시키는 키워드 global를 사용하면 변수a가 전역변수로 인식된다.
4.2. 매개변수에 기본값 설정
- 매개변수에 기본값을 설정하여 호출시 인자를 생략가능
예)
def hello(name, age):
print(f"{name},{age}님 안녕하세요.")
hello('홍길동',50) #출력:홍길동,50님 안녕하세요.
기본값 설정
def hello(name, age=10): #
print(f"{name},{age}님 안녕하세요.")
hello('홍길동') #출력:홍길동,10님 안녕하세요.
name은 사용자 필수로 입력해야 하지만, age는 사용자가 선택적으로 입력가능하다.
age를 입력하지 않지 않아도 함수를 호출가능하고, 만약 입력하지 않은 경우 기본값으로 10이 출력된다
예) 파이썬 내장함수 중 sorted 함수
sorted(iterable, /, *, key=None, reverse=False)
sorted 함수의 인자를 보면 key=None, reverse=False 이런 식으로 값이 지정되어있는 인자가 있다.
이는 기본값이 설정되어있는 것으로, 함수 호출 시 필수로 입력하는 것이 아닌 선택적으로 입력가능한 사항이다.
3.3. 리턴 값을 여러 개 지정
- retrun 할 때 여러 값을 튜플로 묶어서 반환
- 호출시에 여러 변수를 만들어서 받을 수 있음
# return값을 2개 반환하는 사용자정의함수 정의
def getData() :
return 'A', 10
getData() #출력:('A', 10)
이 함수를 호출하면 2개의 데이터를 반환하는 것처럼 보이나, 출력해보면 사실 1개 데이터 튜플 형태로 리턴한다.
a,b = getData()
print(a) #출력:A
print(b) #출력:10
반환하는 2개의 값을 담을 변수 a,b를 선언하고 각각 출력해보면 'A'와 10을 각각 따로 담고 있는 것을 알 수 있다.
ex) for문과 함께 쓰이는 내장 함수 중 enumerate() 함수
=> 인덱스와 데이터를 함께 반환하도록 설계됨(함수의 리턴값 2개씩 튀어나온 것)
4.4. docstring
- 함수에 대한 부가 설명을 작성하는 기능
⇒ 해당 함수 커서 + shift+tab ⇒확인 가능
예시
def cal(num1 ,num2, op) :
""" 덧셈과 뺄셈을 계산하는 함수
op : 연산자를 의미, 주로 '+' 기호를 입력
"""
if op == '+' :
return num1 + num2
else:
return num1 - num2
정의한 함수 안에 큰따옴표 3개(”””) 쌍으로
“”” 설명할 내용 “”” 표시
cal(10, 5, '+') #출력:15
cal 함수에 커서를 가져다 대고 shift+tab 키를 누르면 캡처된 화면처럼 Docstring 을 확인할 수 있다.
4.5. 가변인자(*, **)
- 사용자가 입력인자를 정해진 길이 없이 넣고 싶은 경우
4.5.1. 튜플 스타일 (가변인자 * 1개)
#사용자 정의 함수 - 가변인자 튜플 스타일
def fun1(name, *score) :
print("이름 : ", name)
print("성적 : ", score)
#사용자 정의 함수 호출
fun1("김가가", 100, 80, 40, 50)
#출력
#이름 : 김가가
#성적 : (100, 80, 40, 50)
인자에 *를 1개 표시하면 입력된 입력된 여러개의 인자값들이 튜플 형태로 반환된다.
4.5.2.딕셔너리 스타일 (가변인자 * 2개)
#자:딕셔너리 스타일
def fun2(name, **score) :
print("이름 : ", name)
print("성적 : ", score)
#자:딕셔너리 스타일
fun2("김나나", java=100, python=80, html=40, css=50)
#출력:
#이름 : 김나나
#성적 : {'java': 100, 'python': 80, 'html': 40, 'css': 50}
딕셔너리 스타일은 가변인자에 *가 2개!
5. 익명함수(람다식)
- lanbda 표현식 : 메소드를 하나의 식으로 표현한 것
- 일반적으로 짧고 한 줄로 표현할 수 있는 함수에 대해 사용
- 이름이 없는 함수==람다식(lambda)
함수형 프로그래밍
- 다양한 프로그램 패러다임 중 하나 (cf. 객체 지향 프로그래밍(모든 프로그램은 객체!클래스 설계))
⇒ 모든 코드를 함수로만 만듦 →그 함수들 연결해서 코드 구성
클래스 구성x 함수로만 구성o 장점
→프로그램 간결(cf. 클래스는 부피 큼!)
⇒함수는 되도록 짧고 간결하게 구성 하는 게 원칙
모든 코드를 함수로 깔끔하게 조각 냄→자연스럽게 코드 내 결합도 낮아짐
(결합도 : 프로그램이 끈끈하게 묶여있는 정도! 낮을 수록 좋다)
(cf. 객체 지향하는 이유 ⇒결합도 낮추기 위해)
(하나의 파일 안에 코드 다 짜면 결합도 높음 →잘못 짜면 스파게티 코드 (꼬인 코드) 될 가능성o
결합도 높으면 코드들 끈끈하게 묶여 있음
→하나의 기능 수정하면 나머지 코드 같이 흔들림)
결합도 낮추면?(느슨하게 만들어주면?)
→하나 수정해도 파동(영향) 덜 줌
(like 지진 내진 설계)
람다식
- 익명함수 = 이름없어짐 = 람다식
- 자바, 파이썬, 자바스크립트… 람다식 지원
- 람다식 → 함수 정의를 한 줄로 간결하게 쓸 수 있게 하는 형식
- 함수명 조차 없음, 매개변수& 식 만 들어감
#1) 기존 함수 정의 방법
def 함수이름(매개변수):
return 결과
- 기존 방법 →함수 길게 작성 가능
#2) 람다식
lambda 매개변수 : 결과
- 람다식 → 형태 정해짐→어쩔 수 없이 코드 한 줄 씩⇒간결cf. 원래 java 람다식 지원x →버전 업데이트 →함수형 프로그램 수요 발생⇒java 버전 올라가면서 람다식 지원 (cf. java에도 람다식 존재)
- (스스로에게 제약 주면서 자연스럽게 코드 간결화 시키는 문법)
예)
일반적인 함수 정의
# 일반적인 함수 정의
def mul(x,y):
return x * y
result = mul(3,5)
print(result) #출력 : 15
람다식(lambda)을 이용한 함수 정의
# 람다식을 이용한 함수 정의
mul2 = lambda x,y : x*y
mul2(9,7)#출력 : 63
람다식 함수는 이름이 없음!→변수에 담아서 씀
(마치 객체를 변수에 담아서 쓰는 것처럼~)
'PYTHON' 카테고리의 다른 글
[python]딕셔너리(dictionary), 집합(set) (1) | 2024.02.07 |
---|---|
[python]데이터 핸들링 - 영화리뷰 분석 자료 (0) | 2024.02.07 |
[python]조건문(if, elif, else) (0) | 2024.02.04 |
[python]연산자(산술,지수,관계(비교), 대입(복합), 논리, 멤버, 삼항 연산자) (0) | 2024.02.02 |
[Python]파이썬 문자열 슬라이싱(slicing), 문자열 포매팅(Formating),문자열함수 (0) | 2024.02.01 |