본문 바로가기

Others

까먹기 쉬운 python 함수

728x90
반응형

본포스팅은 정말 오랜만에 python을 사용하실때 주의사항을 포스팅하겠습니다.

본 포스팅은 파이썬 코딩 컨벤션은 PEP8을 준수하며, flake8모듈로 체그함을 노력하겠습니다.

1.형

먼저 가장 중요한 특징은 python은 주소를 넘겨받고 주소를 변수로 지정하는 개념입니다.

다시말해 a=b라 하면 a는 b의 주소를 받게되는 것이고,

b.함수를 써서 (b.sort()와 같이) b의 값을 변화시킨다면, a도 b와 같이 변화합니다. 주소를 지정했기 때문이죠.

이는 a나 b에 새로운 값이 들어 갔을때부터 끊어지게 됩니다.

이를 확인하는 방법은 값의 비교에서 값이 같냐 틀리냐는 ==으로 하고 메모리 주소가 같냐 틀리냐는 is로 하니 간단하게 확인할 수 있습니다.

 

값을 지정하는 방법은

t=[1,2,3]
a,b,c=t
a=1
b=2
c=3

처럼 다양한 방법으로 가능합니다.

 

형변환에 대해 간략하게 보겠습니다.

문자열을 숫자로 바꿀 때

a='abcd'
int(a) # 정수형으로 변환
float(a) # 실수형으로 변환
long(a) # long으로 변환

이나 참고로 int에 서 float은 되나 float에서 int는 안됩니다.

복소수형의 경우

a="1+2j"
complex(a) #이렇게 하면 1+2j 반환

문자열의 경우

a=123.1
str(a)

입니다. 사실 Python은 Dynamic type으로 실행시점에 변수의 형이 결정되게 됩니다.

 

print 할때도 주의사항이 많지만, 단순히 ""내부에 {}을 쓰고 .format()내부에 데이터를 넣어주면 알아서 해줍니다.

print("%d %d %d" % (1,2,3))
print("{} {} {}".format("a","b","c"))
print("my name {0} D {1:.3f}".format("is",2.2343))

마지막 명령어를 실행하다면

my name is D 2.234

으로 출력이 됩니다. 이는 str의 format함수를 쓰는 것으로 {}{}아내 위 처럼 0 1 2 3 4 를 넣어줄 수 있는데, 이것은 format안에 들어간 변수의 순서입니다. {1:.3f}는 다시말해 1번째 변수를(0번째 : is, 1번째 : 2.2343) 뒷 세자리 까지 써서 표현한다. 입니다.

 

2. List

List도 중요한 개념인데요. LabVIEW의 클러스터와 같은 개념이고, JAVA와 C의 Array와 비슷한 개념입니다.(JAVA와 C에도 List가 있습니다.) List내부의 주소는 왼쪽에서 부터는 0부터시작하고 오른쪽에서부터는 -1부터시작합니다.

익히 아시는 것처럼 [:]는  List내 모든 원소를 지칭하며, 갯수가 a개 일때 b>a인 경우 [-b:b]를 해도 모든 원소를 지칭합니다. 또 [c:] 는 c이후의 모든원소를 지칭하며, [::2]는 두칸단위로 나열되는것, [::-1]는 반대로 뒤집는 것을 지칭합니다. 복잡해 보이겠지만, [시작:끝:단위] 라 생각하시면 간단합니다.

또한 List끼리 더하면 원소가 더한 순서대로 합쳐지고 List에 *2와 *3같은걸 하면 그 갯수만큼 원소가 반복됩니다.

find함수도 내장 되어있는데, K라는 List안에 k라는 원소가 있을 때

k in K
--> TRUE

가 됩니다. List자체를 변화시키는 것은 함수를 쓰면 간단한데,

L과 J이라는 List가 있을때

L.append(a) 를 하면 L에 a원소가 삽입니 되며,

L.extend(J)라 하면 L에 J원소가 삽입이 됩니다.

L의 0번째 원소만 바꾸고자 하면

L.insert(0, a)라 하면 0번째 원소가 a가 됩니다.

0번째 원소를 지우기 위해선 del L[0]을 하고 a라는 원소를 지우고 싶다면 L.remove(a)를 해주면 됩니다.

여기서 원소는 string, int, float뿐만아니라 list도 가능합니다.

 

이 모든것은 List가 메모리 주소를 저장해서 그렇습니다.

 

3. 조건, loop

loop의 경우 다른 언어와 같지만

for  조건문 :

의 구성이라는 것과 들여쓰기로 loop 범위를 본다는 것이 있습니다.

for i==1:
	print("i")
elif i==2:
	print("i")
else:
	print("i")

#for문의 끝

입니다. 즉 다른 언어처럼 괄호로 묶어주거나 end를 쓰는 등의 표기를 하지 않고 들여쓰기를 해주시면 됩니다.

참고로 들여쓰기는 space 키를 4번 누르거나 Tab키를 한번 누르시면 됩니다,

 

조건문은 익히 아는 것처럼 ==  !=  is   is not    >  >=

으로 나뉘고 이때 and  or  not  &  |으로 조건문들을 묶어줄 수 있습니다.

 

숫자를 다룰때 주의해야할 사항으로 python은 속도를 빠르게 하기위해 1부터 256까지는 메모리로 적재를 해놔서

is가 True로 나오지만 257부터는 새로운 메모리를 할당받기때문에 is가 False가 나옵니다.

a=256
b=256
a is b #True

a=257
b=267
a is b #False

다음과 같이 말이죠

 

for문의 경우

for a in [0,1,2,3,4,5]:

의 식으로 a에 0부터 5까지 순차적으로 들어가면서 실행이 되고

for a in range(0,5,1):

라고 쓰셔도 됩니다.

이외 문자열도 넣을 수 있는데, a, b, c, d, e가 순차적으로 들어오게하는 방법으로

for a in 'abcde':

for a in ["a","b","c","d","e"]:

둘중에 하나 쓰셔도 됩니다.

 

여기서 a대신에 _를 쓰게 된다면, 변수없이 for문이 돌아가게 됩니다.

 

while문은 간단히 조건문만 있으면 됩니다.

while i>10:

break와 continue도 앞에서 썼던것과 같이

for i in range(5):
    if i==3: braek
    print(i)
# 출력은 0,1,2

for i in range(5):
    if i==3: continue
    print(i)
#출력은 0,1,2,4

마지막으로 for와 while loop 마지막에 else:를 쓸수 있는데 loop가 끝날때 실행이 되는 코드입니다.

a =[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]

for i in a:
	for j in a:
    	print(j)

#출력 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

이차원 배열을 loop로 넣었을때 배열 한줄이 전달이 되어 다음 for문으로 넣을 수 있습니다.

 

4. 함수, 객채(OOP), 모듈

함수는 def와 return으로 이루어집니다.

def abcd(x, y):
    a=x+y
    return a

이때 x, y를 parameter라 하고 실제 코드에서 입력하는 값을 argument라 합니다.\

이때 함수에 parameter과 return이 없다면 함수내 수행문만 수행하고

parameter만 있다면 argument를 사용해서 수행문만 수행하고

return이 있다면 반환값만 반환하는 것입니다.

 

호출은 값에 의해서나 참조에 의해서 호출을 할 수 있는데,

argument에 값이냐 주소값을 넣어주느냐를 보는 것입니다.

그냥 사용하는 함수처럼 사용할때

def abcd(x):
    x.append(1)
    x=[1,2,3,4]

다음과 같은 함수에서 append를 이용하는 것은 결과에서 x에 변화를 주며, [1,2,3,4]를 넣어주는 것에는 x에 변화를 주지 않습니다.

다시말해 앞은 참조, 뒤는 값에 의한 호출입니다.

결론적으로 헷깔리므로 좋은 방법이 아닙니다.

 

대신 굳이 변경시키고 싶다면 지역변수(Local Variable)와 전역변수(Global Variable)를 나눠서 사용하면 좋습니다.

즉 함수와 코드의 변수를 분리시키고 싶으시다면 지역변수를 쓰시고

함수에서 사용하는 변수를 본 코드에도 포함시키고 싶으시다면 전역변수를 쓰면 됩니다.

전역변수를 쓰는 방법은 간단합니다.

global a

라고 선언만 해주면 됩니다.

 

함수를 호출할때 parameter가 너무 많을 경우 호출이 헷깔리기 때문에 parameter명으로 호출 가능합니다.

abcd(1,2)
abcd(y=2, x=1)

이때 순서대로 하는것이 먼저이므로 parameter명을 지정하지 않았을 경우 순서대로 실행이 됩니다.

함수에 기본값도 지정할 수 있는데

def abcd(x,y=1):

라고 해준다면, parameter를 지정하지 않았을 때 기본적으로 항상 y에는 1이 들어갑니다.

 

마지막으로 Asterisk(*)를 사용하는 가변인자라는 개념이 있는데, 이는 길이가 변하는 parameter입니다.

이는 맨마지막 parameter위치에 올수 있는데,

def abcd(x,y,*args):

으로 함수에 abcd(1,2,3,4,5)가 된다면 x=1,y=2,args=[3,4,5]형태로 입력이 됩니다. 이때 args의 형은 tuple입니다.

이외 키워드 가변인자도 있는데 이는 **를 쓰는 것입니다.

def abcd(**kwargs):

abcd(x=3,y=4,z=5)

다음과 같이 키워드를 직접 입력해 주는 것입니다. 이는 dict타입으로 입력이 됩니다. 이는 함수안에서 kwargs["x"]를 하면 값을 출력할 수 있습니다. 즉 이를 다 이용한다면

def abcd(x,y, *args, **kwargs):

로 사용이 가능합니다.

 

5. 자료구조

자료를 관리하는 건 크게 4가지가 있습니다.

stack, queue, tuple, set

으로 stack부터 다루자면, stack은 가장 나중에 넣은 데이터 부터 빼는 처리입니다..

데이터를 넣는것을 push, 빼는것을 pop이라하는데, python코드로 구현한다면

a=[]
a.append(1) #a=[1]
a.append(2) #a=[1,2]
a.append(3) #a=[1,2,3]

a.pop() #a=[1,2], ouput=3
a.pop() #a=[1], output=2

입니다. 이와 반대로 queue는 먼저 들어간것 먼저 나오는 데이터 처리입니다. 여기서 넣어주는것을 put, 빼는것을 get이라 합니다.

여기서는 pop(0)를 쓰는데

a=[]
a.append(1) #a=[1]
a.append(2) #a=[1,2]
a.append(3) #a=[1,2,3]

a.pop(0) #a=[2,3], ouput=1
a.pop(0) #a=[3], output=2

입니다.

tuple은 값이 변경안되는 list로 list가 []로 선언을 한다면 tuple은 ()로 선언을 하게 됩니다.  이때 tuple을 선언할 때

a=(3)와 같이 한다면 단순한 integer로 선언이 되고

a=(3,)으로 해야 tuple로 선언이 됩니다.

 

또한 set이라는 개념도 있는데, set은 a=set([1,2,3,4,5])로 선언하는 데이터 타입입니다. 이렇게 한다면 {1,2,3,4,5}로 선언이 되며 이는 순서없이 숫자가 들어가는 것으로 중복이 허용안됩니다. 즉 add(), remove(), discard(), clear()와 update()로 데이터를 넣고 지우고 대량으로 추가할 수 있지만, 값이 중복된다면 들어가지 않습니다.

 

또한 set a와 b간의 합집합 a|b

교집합 a&b

차집합 a-b도 가능합니다.

 

마지막으로 Dictionary입니다. 이는 데이터를 구분지을수 있는 값과 같이 저장하는 것인데, 구분지을 수 있는 값을 Key이라 하며 실제 데이터를 value라 합니다. Java에서는 hash table이라하며, python에서는 dict라 합니다.

이는 {}를 이용하여 선언해주는데 key가 1234이고 value가 spintronics인 경우 저장은

a={1234:"spintronics"}

불러오는 것은

a[1234]

로 불러오면 됩니다. 여러개를 저장하고 싶을경우

b={'fasd':123, 3324:'fadfsa', 'ddd':'fff'}
a['zxvcvzxcv']='fdfd'
a.items()->출력 dict_items([(1234,'spintronics'),('zxvcvzxcv','fdfd')])

와 같이 ,을 이용해서 저장하면 됩니다. 이때 items는 dict내에 적혀있는 모든 요소를 보여주는 것으로 for문에 for a in b에서 b 역할에 요긴하게 쓰입니다. 

반응형

'Others' 카테고리의 다른 글

블로그에 공식 쓰기  (0) 2019.05.20
쓰기좋은 Matlab 함수  (0) 2019.05.14
Mac에 최적화된 사항  (0) 2019.05.12
Lock in measurement  (2) 2018.10.24
XPS, XRD  (0) 2018.10.22