**함수
1.매개변수가 있는 함수
=>매개변수가 있는 경우 매개변수의 이름만 나열 하면 됩니다.
=>매개변수가 있는 함수를 호출할 때는 기본적으로 매개변수를 전부 대입해서 호출해야 합니다.
=>매개변수는 순서대로 대입해야 하는데 매개변수 이름과 함꼐 대입하면 순서를 변경해서 대입해도 됩니다.
대다수의 경우 첫번째 매개변수는 핵심이 되는 매개변수일 가능성이 높기 때문에 이름없이 대입하고 두번째 매개변수부터 이름과 함께 대입합니다.
#data를 cnt 만큼 출력하는 함수
def disp(data,cnt):
for i in range(0,cnt,1):
print(data)
#함수 호출 -매개변수 2개를 순서대로 대입해서 호출
disp('python',3)
1) 매개변수를 적게 대입해서 발생하는 예외 : TypeError: disp() missing 1 required positional argument: 'cnt'
2) 매개변수의 자료형이 잘못 된 경우 TypeError: 'str' object cannot be interpreted as an integer
데이터 분석할 경우 햇갈리는 것:
numpy 의 array : 값만 있는 것->머신런닝
pandas의 dataframe : 통계 시각화 컬럼이름과 데이터
예를 들면 평균시 어떤 평균인지 알아야 한다.
둘다 2차원 배열 이다.
#disp('python') #매개변수 개수가 부족해서 예외
#disp(3,'python') #자료형 예외
#매개변수의 순서를 변경해서 대입
disp(cnt = 3, data = 'Java')
=>매개변수에 기본값 부여 가능
매개변수를 만들 때 = 기본값을 설정해주면 됩니다.
기본값이 있는 매개변수는 생략하고 호출이 가능
기본값이 있는 매개변수 뒤에 기본값이 없는 매개변수는 올 수 없습니다
=>매개변수 앞에 *을 붙이면 데이터를 몇 개를 대입하던지 이 매개변수가 전부 받습니다.
함수 내에서는 tuple 로 취급합니다.
이 매개변수는 반드시 마지막에 설정되어야 합니다.
=>매개변수 앞에 **을 붙이면 dict가 됩니다.
이 매개변수에 데이터를 대입할 때는 key = value형식으로 대입해야 합니다.
**이 붙는 매개변수를 가진 함수를 사용할 때는 document를 잘 읽어보고 사용해야 합니다.
그래프를 그리는 함수들이 이 형태의 매개변수를 가지고 있는 경우가 많습니다.
적절한 옵션들을 찾아서 사용해야 합니다.
#cnt에 기본값이 1이설정된 함수:
#cnt를 생략하면 1
def display(data,cnt=1):
for i in range(0,cnt,1):
print(data)
display('c++')
#sum함수의 도큐먼트 확인
help(sum)
start가 0이다.
#max함수의 도큐먼트 확인
help(max)
몇개를 주던 가장 큰값을 준다.
#max함수의 도큐먼트 확인
#help(max) #max의 3번째 매개변수는 *이 붙어서 몇개를 대입해도 됩니다
print(max(20,10,40,50))
print(max(20,10,40,50,89,87))
# **이 붙은 매개변수는 key = value형태로 여러 개 대입이 가능
def createurl(server, port, file, **param):
querystring =''
for key in param:
querystring = querystring+key +'=' +param[key] +'&'
url = server +':' +port +'/' +file+'?' +querystring
print(url)
createurl('211.183.6.60' ,'9000' ,'index.html',id='ggangpae1',pw='1234')
2. return
=>함수의 수행을 종료하고 호출한 곳으로 돌아가는 명령어
=>return 할 때 데이터르ㄹ 같이 가지고 갈 수 있습니다.
return뒤에 가지고 갈 데이터를 입력하면 데이터를 가지고 돌아값니다.
기본적으로 return은 1개만 가능합니다.
2개 이상 리턴하고자 하는 경우에는 (튜플),[리스트],{Set이나 DICE} 형태고 묶거나 나중에 나오은 CLASS,의 INSTANCE를 만들어서 리턴해야 합니다.
=>파이썬은 튜플의 경우는 변수에 나누어서 저장이 가능합니다.
변수나열 = (튜플)
튜플의 데이터를 순서대로 변수에 대입합니다.
변수의 개수와 튜플의 데이터가 개수가 다른 경우에는 마지막 변수에 튜플의 모든 데이터를 대입합니다.
python은 튜플 혹은 dict로 많이 준다. 쪼개서 하면 된다.
def reg(data):
slope = 3
intercept = 7
#결과를 tuple로 리턴
return (slope, intercept)
r = reg(10)
#튜플을 한꺼번에 저장
print(r)
print(type(r))#자료형을 확인 하기
#튜플을 나누어서 저장
slope, intercept = reg(10)
print('slope', slope)
print('intercept', intercept)
항상 매개변수는 뭐 잇을 가 확인
dir , help, type 등 자주 사용하기
3, 재귀함수(recursion)
=>함수가 함수르 호출하는 구조라서 느리고 메모리 사용량도 많지만 코드를 간결하게 만들 수 있는 장점이 있습니다.
피보나치 수열
1,1,2,3,5,8,13,...
첫번째와 두번째는 무조건 1
세번쨰 부터는 앞 2개의 합
def fibonacci(n):
if n == 1 or n ==2:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(9))
하노이의 탑을 연습하기
감독관 배정
4.파이썬에서 함수는 일급 객체
=> 함수를 변수에 저장할 수 있고 리턴할 수 있고 매개변수로 대입할 수 도 있습니다.
함수가 일급 객체 안되는 것이 java 이다.
변수에 저장할 수도 있어니깐 매개변수에 저장할 수 도 있다
=>함수형 프로그래밍을 사용할 때와 closure를 만들기 위해서 사용합니다.
=>함수형 프로그래밍은 데이터의 모임(list,tuple, set, dict등 )에 하나의 함수를 적용하는 프로그래밍
=>closure는 함수가 함수를 리턴해서 함수 내부의 데이터를 함수 외부에서 변경하도록 하는 프로그래밍
5.람다(lambda)
=>파이썬에서는 이름없는 한 줄 짜리 함수
lambda매개변수 나열: 리턴할 내용
def addint(x,y):
return x+y
#위의 함수를 람다 식으로 표현
lambdaadd = lambda x, y : x+y
print(lambdaadd(100,200))
=>람다 함수도 매개변수의 초기화 가능
=>한줄 짜리 함수라서 변수 선언은 안됩니다.
6.함수형 프로그래밍
=>데이터의 모임에 함수를 전부 적용하는 프로그래밍
1)map
=>데이터의 모임과 함수를 매개변수로 받아서 데이터의 모임에 함수를 전부 적용해서 결과를 데이터의 모임으로 리턴해주는 함수
=>대입된느 함수는 1개의 매개변수를 가져야 하고 반드시 데이터를 리턴해야 합니다.
numpy가 이행태로 연산한다.
#반복문을 사용할 경우
2020-02-18 19:18:05.056642
2020-02-18 19:18:05.068582
2020-02-18 19:18:45.946949
2020-02-18 19:18:45.962906
#함수형 프로그램의 맵을 사용할 경우
2020-02-18 19:20:24.933999
2020-02-18 19:20:24.937989
#10000개의 데이터에 1씩 더한 결과롤 list를 만들기
#반복문을 이용한 방법
def inc(x):
return x+1
collection = [i for i in range(0,100000,1)]
import datetime
print(datetime.datetime.now())
result = []
for i in collection:
#result.append(i+1)
result.append(inc(i))
print(datetime.datetime.now())
print()
#함수형 프로그래밍을 이용ㅇ한 방법
print(datetime.datetime.now())
result = list(map(inc,collection))
print(datetime.datetime.now())
2)filter
=>데이터의 모임에서 함수의 수행결과가 true인 데이터만 모아서 리턴해주는 함수
=>대입되는 함수는 매개변수를 1개 받아서 bool을 리턴하는 함수이어야 합니다.
def odd(x):
return x % 2 == 1
li =[10,30,21,32, 29]
print(list(filter(odd, li)))
3)reduce
=>데이터의 모임과 함수를 가지고 누적 연산을 수행해서 결과를 리턴하는 함수
=>결과가 1개
=>대입되는 함수는 매개변수가 2개이고 결과를 리턴하는 함수이어야 합니ㅏㄷ.
매개변수는 처음에는 첫번째와 두번째를 데이터를 가지고 수행을 하고 그 다음부터는 앞 연산의 결과를 가지고 다음 데이터와 연산
앞의 값으로 계산
count하는 것 개수 새는 것
=>python에서는 reduce가 내장함수에서 빠지고 functools패키지의 함수로 변경
7,pass
=>클래스나 함수의 내용을 작성하고자 할 때 사용하는 예약어
=>내용이 없는 함수나 클래스를 만들 때 사용합니다.
def addint(x,y):
return x+y
#reduce는 누적 연산을 해서 결과를 리턴하는 함수
import functools
print(functools.reduce(addint, li))
8.__doc__
=>함수 내부에 __doc__속성에 문자열을 대입하면 help(함수) 했을 때 출력이 됩니다.
=>파이썬이나R에서 함수를 만들어서 배포하고자 할 때 이 속성에 이 함수의 기능을 설명을 해야 합니다.
배포할 때는 한글로 사용하면 안된다.