본문 바로가기

노력/인공지능

3. 파이썬 개인공부 3 (데이터 타입, 함수)

값을 생성하는 방식: 리터럴 방식, 객체 방식


딕셔너리를 생성하는 리터럴 방식 : {'a':1, 'b':2}

딕셔너리를 생성하는 객체 방식 : dict(a=1,b=2)



함수 : 


def moon(a, a) :

  return a

  

함수의 파라미터가 두 개 같은 것이 들어간다면 에러발생


{'a':1, 'a':2} : 나중것으로 할당되는다.

dict(a=1, a=2) : 위의 이유로 에러발생, 좋은 개념은 아니다.


def moon(a=3):

    return a

    

위 처럼 파라미터의 기본값을 두면 moon()처럼 입력값이 없어도 기본값인 3이 출력된다.






def moon(a=3, b=7):

    return a+b

    

파라미터는 순서대로 들어간다.(positional 방식)


직접 명시해주는 방식은 keyword 방식 moon(a=1, b=3) : 이렇게 명시해주면 keyword 방식


만약에 하나면 넣어주면 moon(2) : 앞의 값만 들어간다.



def moon(a=3, b):

    return a+b

    

이 상태에서 값을 하나만 넣어준다면?


moon(2) : 에러가 발생한다. positional 방식에 의해 앞에서 부터 채워지기 때문에


그러므로, default값을 넣어줄 일이 있다면


def moon(a, b=7):

    return a+b

    

위처럼, 뒤에서부터 넣어줘야 한다.



def moon(a, b=7):

    return a+b

    

moon(b=1, 7)


위의 경우 positional에러가 발생한다. 앞에서 b에 강제로 1을 할당한다고 해도,

7이 a에 자동으로 할당되지는 않는다.




def moon(a, b=7, c=1):

    return a+b+c

    

moon(1, b=1, 7)    

    

위의 경우도 에러다. 한번 키워드 방식을 사용하기 시작하면 계속 키워드 방식을

사용해야 한다. moon(1, b=1, c=7) 이렇게 사용해야 에러가 없다.



abs(x, /) : positional only.



def sun(*, a):

    return a




   

sun(a=1)

    

def sun(b, *, a):

    return b, a

    

sun(1, a=2)

    

별표 뒤에 오는 것들은 다 keyword 방식으로 사용해야 한다. 아래 sun 함수는

b를 positional 방식으로 사용할 수 있다.




def sum(*a):

  return a





sun(1,2,3) : (1, 2, 3)


b = [1, 2, 3, 4]

sun(b) : ([1,2,3,4]) b를 그대로 입력하면 리스트가 입력된다.

sun(*b) : 언패킹이라고 부른다 (1, 2, 3, 4)로 저장된다.


입력하지 않아도 빈 튜플을 반환한다. ()


입력되어야 하는 값이 명확하지 않을 때, 여러 값을 받아서 반환해 줄 수 있는

방법이다.



*b, = 1,2,3,4,5 : 다음과 같이 할당할 수 있다. 리스트와 튜플 뒤에는 콤마 찍어라.

                  자기가 자동적으로 처리해준다.


b : [1, 2, 3, 4, 5]





a,b,c = 'wow'

a,b,c에 w, o, w가 하나씩 할당된다.




def sun(**x):

    return x

    

sun(x=1) : 별 두개는 딕셔너리 형태로 반환해준다.

sun(a=1, b=1) : 여러개의 아규먼트도 허락한다.

sun(a=1, b=1, b=2) : 리터럴이 아니기 때문에 다음의 형태는 에러가 발생한다.


입력안해도 빈 딕셔너리를 반환한다.


b = {'a':1, 'b':2}

sun(**b) : 딕셔너리의 언패킹, 딕셔너리를 직접 sun의 아규먼트로 넘기려면

이렇게 사용해야 한다.






객체에서 쓰는 함수가 메소드이다. 메소드와 함수는 거의 유사하다.



exec



* 하나 : , , , , , 로 입력

** 두개 : keyword 사용


오컴의 면도날(만약 똑같은 일을 할 수 있다면, 간단한 방식으로 한다.)



lambda : 익명함수


문(statement)이 아니고 식이지만 함수이다.



lambda : 3

<function __main__.<lambda>>


moon

<function __main__.moon>



t = lambda : 3


t

<function __main__.<lambda>>


t()

3




def moon(a):

    return a()

    

moon(lambda:5)


5


함수식을 넣으면 값을 a()처럼 출력해줄수 있다. a만 사용한다면 함수의 이름이 출력된다.

<function __main__.<lambda>>



t = lambda x,y : x+y

t(1,2) : 3


위와 같은 사용도 가능하다.







함수도 이름을 바꿀 수 있다.

def sun(x, y):
  return x+y
  
s1 = sun

s1(1, 32) : 33

위와 같은 사용이 가능하다.

sum = 3

del sum : 잘못만든 함수는 삭제할 수 있다.

s1 = sun
s1.__name__
'sun'

sun.__name__
'sun'

저렇게 함수를 할당하면 __name__ 내부 함수를 출력했을 때 이름이 같다.



%time
list(map(lambda x:x+10, range(100)))


%%time
temp = []
for i in range(100):
    i += 10
    temp.append(i)
    
    
두 코드 모두 각 range의 값에 10씩 더해주는 것인데 반복이 훨씬 느리다.



lambda는 좀 골치아픈편이다.

map부터 비인간적이 된다.

map(함수의 이름, 이터러블)

x='''
a = 1
# 설명
'''


print(x)

a = 1
# 설명

x
'\na = 1\n# 설명\n'


프린트는 \n을 제거하고 보여준다.
실제 변수에는 \n이 들어가있다.



y = '\n\n3'

y
'\n\n3'

y
print(y)


3


위와 같은 방식으로 y에 직접 값을 넣어도 사용 가능하다.


y = r'\n\n3'

y
'\\n\\n3'

print(y)
\n\n3


r을 붙여서 저장하면 raw 문자열이 된다.



함수가 선언할 때 어디엔가 저장된다.
함수의 default 변수는 어딘가에 저장되어 있다.

def a(x, y=time.time()):
    print(y)
    return x

mutable과 상태값을 쓰지 말라고 한다. 그렇기 때문에 위의 코드는 좋은 코드가 아니다.






moon_beauty : 이렇게 변수만드는 것을 스네이크 방식이라고 한다.


MoonBeauty : 이런 방식을 파스칼 방식이라고 한다.


moonBeauty : 카멜방식이라고 한다.



파이썬 동네에서는 카멜방식이라도 첫글자를 대문자로 한다.


셔뱅 : 파이썬2에서는 넣어야했고 지금은 아니다. UTF-8로 통일됐다.


그 동안 불러왔던 변수가 파이썬에서는 이름 혹은 식별자.


객체 참조에 의한 호출(call by object reference) 




a = 3

b = 4


a, b = b, a : 이렇게 우아하게 바꿀 수 있다.


def make_incrementor(n):

    return lambda x: x+n

    

f = make_incrementor(3)


f(1) : 1 + 3


클로져의 한 부분 - 함수가 함수를 리턴한다.

이것을 할당해서 함수로 사용할 수 있다.


람다 대신에 partial을 사용할 수도 있다(원한다면 한 번 사용해보자).




jupyter notebook에서 !를 쓰면 dos창(터미널)에서 사용하는 명령어를 사용할 수 있다.


!pip install 사용할 수 있다. 가끔 무한루프를 도는 것은 관리자 권한이 필요하다.



!pip install jupyter_contrib_nbextensions


!jupyter contrib nbextension install --user



jupyter notebook에 nbextension을 다운로드 받는다.


nbextension에 Autopep8을 사용한다.



!pip install autopep8