티스토리 뷰

반응형

# 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']




반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday