티스토리 뷰
# Python은 R과 다르게 벡터, 원소별 연산이 적용함수를 적용해야만 가능합니다.
>>> l1
[1, 2, 3]
>>> l1 + (10,10,10) # 벡터 연산 불가
TypeError: can only concatenate list (not "tuple") to list
>>> l1 + [10,10,10] # 리스트로 연산을 시도해도 결합이 되어버립니다
[1, 2, 3, 10, 10, 10]
#. 함수 정의 (def)
def funcName(input, ..) : # 매개변수에 default 값 설정 가능
함수 내용
return output
def funcName(*param) : # 매개변수 개수에 제한이 없는 경우(*)
함수 내용 # for i in param :
return result
funcName(param) # 함수 적용
>>> def f(x) :
if x%2 == 0 :
print('짝수입니다.')
else :
print('홀수입니다.')
>>> f(10)
짝수입니다.
>>> f(7)
홀수입니다.
#. 간단한 함수 (lambda)
funcName = lambda input : output # def 과 마찬가지로 매개변수에 기본값 설정 가능
# 단순한 input과 output 처리로 함수 생성 가능
[ lambda in Python ]
sum = lambda x, y : x+y
[ def in Python ]
def sum(x, y) :
return x + y
[ in R ]
f1 <- function(x, y) {
return(x+y)
}
>>> sum(1,2)
3
#. 적용 함수 (map)
map(func, 인자..) :: 원소별 연산 (1차원 구조 벡터만 적용 가능) (=sapply, lapply in R)
# Python에서 적용 함수는 기본적으로 출력을 바로 해주지 않고 메모리상에만 저장해줍니다.
>>> l1
[1, 2, 3]
# 함수 사용 방법 (ex. 각 원소별 10을 더하는 함수)
>>> f1 = lambda x : x + 10
>>> f1(l1) # Python은 벡터 연산이 불가능하다고 했죠?!
TypeError: can only concatenate list (not "int") to list
>>> map(f1,l1) # 함수 적용 시 메모리에 저장만 해주고, 출력은 따로 해주지 않습니다.
<map object at 0x0000000002EE3860>
>>> list(map(f1, l1)) # 적용 함수의 결과를 list 에 담아서 print
[11, 12, 13] # list 형식 데이터가 함수에 input 되었으므로, list 형식 데이터로 output
# 앞에 0을 붙여 숫자를 출력하는 함수
>>> f2 = lambda x : print("%02d" % x)
>>> list(map(f2, l1))
01
02
03
[None, None, None] # print는 출력만 해줄 뿐 메모리에 저장하지 않기때문에 None 이 출력
>>> f2 = lambda x : "%02d" % x
>>> list(map(f2, l1))
['01', '02', '03']
>>> f2 = lambda x : '0' + str(x) # 다른 방법 : str() 문자형으로 변환
>>> list(map(f2, l1))
['01', '02', '03']
# 특징. lambda 함수가 여러 매개변수를 갖는다면, 적용함수는 적용대상의 개수에 맞게 추가 인자를 적용
>>> l1=['a/b/c','aa/bb/cc']
>>> l2=['abc@naver.com','aaa@daum.net']
>>> f_split2 = lambda list, sep, ord=0 : list.split(sep)[ord]
>>> list(map(f_split2, l1,'/'))
['a'] # 1개의 대상만 적용
>>> list(map(f_split2, l1,['/','/'],[0,0]))
['a', 'aa'] # 모든 대상에 적용하기 위해 대상의 개수에 맞게 추가 인자 작성
>>> list(map(f_split2, l2,['@','@'],[0,0]))
['abc', 'aaa']
#. 재귀함수
def multiple(num, m) : # 1000 이하 n의 배수
if num <= 1000 :
print(num, end=' ')
multiple(num*m, m)
else :
return
#. Q
l1 = [1,2,3,4]
l2 = [10,20,30,40]
l3 = [1.567, 2.456, 5.342, 5.534]
1) l1을 소숫점 둘째자리로 표현
>>> f1 = lambda x : "%.2f" % x
>>> list(map(f1, l1))
['1.00', '2.00', '3.00', '4.00'] # 포맷 변경 시 결과가 문자형으로 변경
2) l3을 정수자리로 표현(버림)
>>> import math # 모듈 호출
>>> f2 = lambda x : math.trunc(x)
>>> list(map(f2, l3))
[1, 2, 5, 5]
3) l1 + l2 계산
>>> f3 = lambda x,y : x+y
>>> list(map(f3, l1, l2))
[11, 22, 33, 44]
4) l2의 l1승 출력, 10^1, 20^2, 30^3, 40^4
>>> f4 = lambda x,y : x**y
>>> list(map(f4, l2, l1))
[10, 400, 27000, 2560000]
# f_split(list,sep,ord) 함수를 만들어 리스트에서 분리구분기호(sep)로 분리된 "ord" 번째 값 출력
def f_split(list,sep=' ',ord=0) :
lis = []
for i in list :
lis.append(i.split(sep)[ord])
return(lis)
================ RESTART: D:/Aaron/Q.py ================
>>> l1=['a/b/c','aa/bb/cc','aaa/bbb/ccc']
>>> l2=['abc@naver.com','xyz@daum.net','opq@daum.net']
>>> f_split(l1,'/',0)
['a', 'aa', 'aaa']
>>> f_split(l1,'/',1)
['b', 'bb', 'bbb']
>>> f_split(l2,'@',0)
['abc', 'xyz', 'opq']
'Python > Process' 카테고리의 다른 글
[Python] 리스트 (list) (0) | 2019.01.25 |
---|---|
[Python] 반복문(for, where, 무한루프, break, continue, pass, next) (0) | 2019.01.25 |
[Python] 조건문(if, ifelse, elseif) (0) | 2019.01.24 |
[Python] 문자열 메서드(method) (0) | 2019.01.23 |
[Python] 파이썬 기초(변수, 출력, 모듈, 연산, 문자열) (0) | 2019.01.22 |