print("{1} {0} {owner} blog".format("this", "is", owner="lemoncandy's"))
본글에서는 파이썬의 기본 자료형(문자열, 논리, 기본연산자 등)을 다루고, 이에 대한 예시를 들어 독자의 설명을 돕고자합니다.
파이썬 & 객체
파이썬의 중요한 특징 중 하나는, 객체 모델이다. 숫자, 문자열, 자료구조, 함수, 클레스, 모듈은 모두 파이썬 객체라는 것으로, 객체라는 것에 저장된다. 이 객체에 해다하는 자료구조들에 대한 것만 살펴보도록한다. 파이썬의 자료구조는 크게 4가지로 분류할 수 있는데, 문자열(String), 리스트(List), Tuple(튜플), 사전(dictionary)에 해당된다. 추가하자면 파일 등을 덧붙일 수 있을 것 같다.
아래는 파이썬 내장 자료형에 대한, 내장함수와 기본적으로 알아야할 부분에 대한 오버뷰이다. 해당 내용중에 모르는 것이 있으면 자료구조를 더 이해하는 것이 바람직하다.
Python 내장 자료형 (요약)
- String: "" or ''으로 묶여진 문자의 모임
- Indexing
- Slicing : [Start index: Stop index : Step] 파이썬 2.3부터 지원
- immutable: 문자열은 중간 값이 변경되지 않는다.
- Membership test
- List
- List offset:
- 순서있음
- List length
- List slicing
- List 곱
- List 덧셈
- 확장 슬라이스
- Membership test
- Append
- del
- L.reverse() : 리버스하면 바로 리스트가 변경된체로 저장되어진다.
- L.sort(): 리버스와 마찬가지로, 정렬된 리스트가 변수에 담겨진다.
- Tuple
- indexing: 순서가 있다.
- Slicing
- 연결: 리스트와 똑같이 +으로 연결한다
- Membership test
- immutable
- Dictionary
- Key vs offset
- 순서
- Membership test
- mutable
- dic.keys() : 사전의 키만 추출
- dic.values() : 사전의 값만 추출
- dic.tiems(): 키와 값을 엮어서 리스트로 출력한다.
직접 자료형 | 직접 자료를 표현하는 자료형 | 정수, 실수, 롱형 정수 |
시퀀스 형 | 다른 자료를 포함하는 자료형 (순서를 가진다 = 인덱싱 및 슬라이싱이 가능하다) | 리스트, 튜플, 문자열 |
매핑 형 | 다른 자료를 포함하는 자료형 (순서를 가지지 않는다) | 딕셔너리 |
자료 변경 가능성에 따른 자료의 분류
변경가능(Immutable) | 자료의 값을 변경할 수 있다. | dic, list |
변경 불가능(Immutable) | 자료의 값을 변경할 수 없다. | 수치형, 문자열, 튜플 |
자료 변경 가능성에 따른 자료의 분류
자료형 | 저장 | 변경 가능성 | 기타 |
수치형(int) | 리터럴 (한 가지 종류의 데이터만 저장가능) | 변경 불가 | 직접 접근 (주소값으로) |
문자열(str) | 리터럴 | 변경 불가 | 시퀀스 |
리스트(list) | 저장 가능 | 변경 가능 | 시퀀스 |
튜플(tuple) | 저장 가능 | 변경 불가 | 시퀀스 |
사전(dict) | 저장 가능 | 변경 가능 | 매핑 |
1 2 3 4 | a = 'hello my world' b = 'hello my world' print(a==b) # true print(a is b) # false | cs |
파이썬 자료형의 확인
자료형을 지정하는 예약어를 사용하여 확인한다.
1 | type(123) == int | cs |
String Object & Method
문자열의 슬라이싱과 인덱싱
문자열 종류의 자료형은 문자열과 슬라이싱은 잘 설명되어 있는 사이트가 있어, 참조를 바란다. [https://wikidocs.net/2838]. 음수인덱싱을 하는 경우가 있어 해당 인덱싱만 설명한다.
음수 인덱싱
string[시작인덱싱:-음수]: 인 경우에는 음수 -1 은 뒤에서 역순으로 2번째 문자를 의미한다. 예를 들어, 문자 abcd가 있는 경우, a[-1]은 d를 가르킨다. 그러나, 범위로 슬라이싱을 하는 경우에는 맨 끝의 위치에 해당하는 인덱스를 제외한 결과를 출력하므로 a[0:-1]은 abc을 출력한다. 반대로 a[::-1]은 순서를 거꾸로 해달라는 경우이므로, 역순으로 출력된다. 역순으로 출력되는 경우는
1 2 3 | a = 'abcd' print(a[-1]) print(a[0:-1]) | cs |
str.split(separator, maxsplit):
-separator: 나누고자 하는 구분자
-max split: 최대로 나누고자하는 숫자. 만약 3이면 출력물은 3개는 분리되고, 나머지 1개는 그대로인 상태로 총 길이라 4개인 리스트가 나온다. 즉, 3개까지만 분리를하고 나머지는 그냥 쭉 이어서 배출한다.
1 2 3 4 5 6 7 8 9 | >>> syntax = 'separator : The is a delimiter. The string splits at this specified separator. If is not provided then any white space is a separator. \ >>> maxsplit : It is a number, which tells us to split the string into maximum of provided number of times. If it is not provided then there is no limit.' >>> syntax.split(' ',3) ['separator', ':', 'The', 'is a delimiter. The string splits at this specified separator. If is not provided then any white space is a separator. maxsplit : It is a number, which tells us to split the string into maximum of provided number of times. If it is not provided then there is no limit.'] | cs |
str.upper()
str.lower()
str.count(): 문자열에서 함수 안에 부분 문자열이 있는 횟수를 리턴
str.find(): 문자열에서 함수 안에 있는 부분 문자열의 offset(시작인덱스)를 리턴
str.find(like, 3): 문자열에서 함수 안에 있는 like의 offset(시작인덱스)를 3번 인덱스부터 탐색
s.rfind(): find의 reverse. 뒤에서부터 검색한다.
s.index(): find와 같다. offset을 리턴한다.
s.rindex(): index와 같으나, 뒤에서 부터 검색한다.
s.startswith(): 함수내에의 부분문자열로 시작하는 스트링인지 T/F 리턴
s.endswith(): 함수내의 부분문자열로 끝나는 스트링인지 리턴
s.startswith('like',7): 7번 문자열이 like로 시작하는가
s.replace(원래문자, 바꿀문자)
str.strip(): 좌우 공백을 없앤다.
str.rstrip(): 우측 공백을 제거
str.lstrip(): 좌측 공백을 제거
str.splitlines(): 라인 단위로 분리
':'.joint(t): ':' 문자로 결합. t = list형태,
u.center(): 전체 문자를 x개로 만들고, 문자를 가운데 위치시킨다.
1 2 3 | >>> string = "spoon and egg race" >>> string.center(60, '-') '---------------------spoon and egg race---------------------' | cs |
str.ljust(): 전체문자를 x개로 만들고, 문자를 왼쪽에 위치시킨다.
str.rjust(): 전체문자를 x개로 만들고, 문자를 우측에 위치시킨다.
str.isdigit()
str.isalph():
str.isalnu(): 숫자 혹은 영문자인가?
str.islower():
str.isupper():
str.isspace():
문자열 내에서 전체 자리수 지정하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | s = '내용 {0:15}을 전체 자리 15자리로 맞추어 출력합니다'.format("python help") print(s) # 우측으로 공백 k = '내용 {a:10}을 전체자리 10자리로 맞추어 출력합니다.'.format(a=13) print(k) # 좌측 공백 a = 'hello' s = '내용 {:3}와 {:10}의 자리수를 각각 맞춥니다'.format(a, 3.14) print(s) # 전체 다 나옴 s = '내용 {:<3}와 {:<10}의 자리수를 각각 맞춥니다'.format(a, 3.14) print(s) # 둘다 좌측 정렬 s = '내용 {:>3}와 {:>10}의 자리수를 각각 맞춥니다'.format(a, 3.14) print(s) # 둘다 우측 정렬 s = '내용 {:^10}와 {:^10}의 자리수를 각각 맞춥니다'.format(a, 3.14) print(s) # 둘다 중앙 정렬 s = '내용 {:!<10}와 {:*^10}의 자리수를 각각 맞춥니다'.format(a, 3.14) print(s) # 빈공간을 !로 s = '''숫자 {0:.4f}와 {1:0.4f}의 소수점 이하 자리수를 4자리 까지만 표현합니다'''.format(3.14325, 9485734.32184) print(s) | cs |
str.replace(원래문자, 바꿀문자)
1 2 3 4 | s1 = "Hello my name is Hong kil-dong" s2 = s1.replace("Hong", 'Kim') print(s1) print(s2) | cs |
List Method
Min, Max
1 | min(my_list), max(my_list) | cs |
-추가 관련 함수
List.append: 마지막에 추가해서 바로 변경됨. (Inplace =True)
List.insert(index, object): 자료를 지정된 위치(object)에 삽입. (Inplace =True). 해당하는 index에 위치시킨다.
1 2 | list_data = ['apple', 'banana', 'cherry'] list_data.insert(2, 'abc') | cs |
-인덱스 관련 함수
List.index(value ,start, stop, position) : return first index of value.
- value = 찾을 패턴
- start, stop = 시작 인덱스, 마지막 인덱스. 즉 범위를 지정할 수 있다.
1 2 3 4 5 | ref = [5, 6, 'abc', 7, 'apple'] >>> print(ref) [5, 6, 'abc', 7, 'apple'] >>> ref.index('abc', 1, 5) 2 | cs |
List.extend(value): 변수값 뒤에 리스트를 붙여준다.
1 2 3 4 5 6 | >>> a = ['abcd'] >>> b = ['b','bbb'] >>> print(a.extend(b)) None >>> a.extend(b) >>> a | cs |
List.count(value): 자료값의 개수를 카운트
-정렬 관련 함수
List.reverse(): 인덱스 순서를 반대로 돌려놓고, 저장시킴. 리턴 값 없음
List.sort(): 값의 순서대로 돌려놓고, 저장함. 리턴 값 없음
sorted(): 이는 범용함수이다. 리턴 해주고, 저장은 안함
-삭제 관련 함수
List.clear(): 리스트의 모든 항목을 제거
List.del()
List.remove(value): 리스트 원소중 value인 원소 맨 처음 원소 삭제
List.pop(index): 마지막의 요소를 리턴하고, 리스트에서 바로 제거
>>> s.pop(0): 가장 뒤에 있는 요소를 꺼낸다.
리스트의 슬라이싱
1 2 | list_data[-1:-5:1] # 라면 start가 end보다 커서 안나옴 list_data[-1:-7:-1] # 스텝이 마이너스이면 나오지만 | cs |
List Comprehension(리스트 내장)
[Expression for exp1 in sequence 1
for exp2 in sequnce 2....]
10보다 작은 정수 중 홀수의 제곱만 리턴한다.
>>> [k for k in range(0,10) if k%2 ==1]
2의 배수와 3의 배수중 두수의 합이 7의 배수가되는 두수의 곱의 리스트를 만든다.
List comprehension 작성시, expression부분이 튜플일 경우 꼭 활호로 감싸야한다.
>>>[(i, j) for i in range(0, 100, 2) \
for j in range(0, 100,3 ) if (i+j) %7 ==0]
Range()
# 순차적인 값을 할당할 때 사용한다.
>>> a, b, c, d = range(0,4)
None 이 포함된 리스트 생성
1 2 3 4 | #내용 없는 리스트 생성 L = [None] *10 for i in range(0,10,2): L[i] = i | cs |
리스트로 2차원 배열 표현
1 2 3 | #리스트로 2차원 배열 표현 L = [ [1,2,3],[4,5,6],[7,8,9]] L[2][2] | cs |
리스트의 슬라이스
*리스트를 슬라이스 할 때, 리스트[시작인덱스:마지막인덱스:단계] 의 구문으로 한다. 단계(step)을 이요한 슬라이드를 하는 경우 이를 확장슬라이드(extended slice)라고한다. 주의할 것은 확장슬라이드를 이용하여 변수를 치환할 경우 무조건 좌측의 확장슬라이드 값과 우측의 확장 슬라이드의 값이 동일해야한다.
1 2 | my_list = list(range(0,10)) my_list[::3] = list(range(5,9)) | cs |
정수형 연산. 결과는 실수형: 9/5
실수형 연산. 결과는 실수형: 9.0 / 5.0
실수형 연산. 결과는 몫만: 9.0 //5.0
나머지 (%)
>>> 9 % 5. 4
>>> divmod(9, 5)
reutrn (1, 4)
파이썬 예약어
>>> import keyword
>>> keyword.keylist
연속라인의 표시
\
문자열로 된 파이썬 코드의 실행
eval (expression[, globals[, locals]]): 파이썬에 사용되고 있는 식(expression)을 실행
>>> a = 4
>>> a = eval('a+4')
>>> print(a)
8
exec code [ in globals [, locals]] : 문자열로 된 문(statment)을 수행
>>> a = 5
>>> exec 'a = a+4'
>>> a
9
compile (string, filename, kind): 코드를 반복적으로 수행할 때, 컴파일 일하여 파이썬 코드를 리턴
1 2 3 4 | >>> code = compile ('a+1', '<string>', 'eval') >>> a= 1 >>> for k in range(10): a = eval(code) |
Console 입출력
pprint
1 2 3 | >>> import pprint >>> pprint.pprint(변수명) |
enumerate():
인덱스 값도 같이 필요한 경우 사용하는 함수. (인덱스, 요소 값) 튜플 자료로 반복적으로 넘겨준다.
1 2 3 | L = ['cat', 'dog','bird', 'pig','spam'] for k, animal in enumerate(L): print(k, animal) | cs |
Tuple
튜플의 + 연산
1 2 | t = (1,2,3) t + ('adsl','adsp') (1, 2, 3, 'adsl', 'adsp') | cs |
튜플: 변경 불가능(immutable)
튜플 패킹(Tuple packing): 튜플안에 어려 종류의 데이터를 보관
>>> t = 1,2, 'hello'
튜플 언패킹(Tuple unpacking): 튜플에서 데이터를 꺼내오는 것
>>> x, y, z = t (튜플에 x,y,z을 할당)
리스트와 튜플의 차이
리스트와의 차이
메소드를 가지지 않는다.
튜플을 사용하는 경우
1) 함수에서 리턴을 2개 이상할 때, 튜플로 묶어서 리턴
2) 문자열 포매팅
1 | print('id: {}, name: {}'.format('kkk','jjjj')) | cs |
3) 튜플에 있는 값을 함수의 인수로 사용할 때
1 2 | args=(4,5) calc(*args) | cs |
4) 그외 고정된 값을 표현하기 위해
Dictionary
Key 와 value을 이용한 자료형식 구조이다.
Key에는 문자, 논리, 튜플, 대소문자를 구별해서 같은 글자를 넣을 수 있다. 완전히 대소문자까지 똑같이 입력할 수는 없다. DISTICT해야한다.
한편, Value는 딕셔너리, 문자 , 논리, 리스트를 사용할 수 있으면 중복이되어도 상관이 없다. 위에서 key을 이용하였기 때문에, 자료의 순서가 없다. 따라서, 자료의 순서를 이용해서 입출력을 하는 append, extend, insert의 함수를 사용할 수 없다. 단, pop은 key을 인자로 제공한다면, 사용할 수는 있다.
Dic.items(): (key,value)을 리턴
Dic.get('key')
Dic.setdefault('key', 'value'): key가 없으면, 키/값을 새로 만들어준다.
Dic.popitem(): list의 pop과 동일
key in D: 멤머십테스트 D가 key을 가지고 있으면 True
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # keys, values 출력 my_dic = {'fruit':'apple', 'number':1, 'sport':'golf'} print('-'*20, "keys") for fav in my_dic: print(fav) #--------------------------- for fav in my_dic.keys(): print(fav) #--------------------------- print('-'*20, "values") for value in my_dic.values(): print(value) #--------------------------- print('-'*20, "items") for pair in my_dic.items(): print(pair) # Key의 중복 dict_data2 = {1:'hello', 0:'World', True:'Nice'} len(dict_data2) # 1이 True 여서 중복으로 하나만 들어간다. 마지막 원소로 덮어쓴다 dict_data2[3] = {'abc'} dict_data2['False'] = 'zzzzz' print(dict_data2) | cs |
위의 예제에서, key의 중복을 보면, True와 1은 동일한데 삽입된다. 그렇지만, 1이 True이기고, 앞에서부터 순차적으로 저장한다고 생각한다면 1이 덮어씌워져서 True(1)이 들어가고 그에대한 value로 nice가 입력되게 된다.
Dictionary의 중복
딕셔너리는 데이터를 참조할 때 주의해야하는 사항이 있는데, 파이썬은 바로 스텍구조의 자료형에 값을 갖지 않고, 객체를 가지고 주소를 참조한다. 예를 들어서, dictionary2와 dictionary1이 있다고 했을 때, dictionary 1= dictionary2을 하면 같은 각각 객체에 다른 데이터를 가지고 있는게 아니라, 주소가 같아서 같은 데이터를 참조한다. 즉 스텍에 있는 자료구조가 Heap이라는 공간에 값을 할당하여 찾는 구조인데, 주소가 똑같기 때문에 Heap에 자료값이 변경되면, 두 자료모두 변경될 수 있다. 아래의 예제를 통해 확인해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | d1 ={1:10, 2:10} d2 = d1 print(id(d1), id(d2)) # 주소값이 같다 d2[1] = 30 #한쪽만 데이터를 변경한다. print(d1, d2) # 그러나, 데이터가 같다. # 데이터의 변환이 안일어나가 하려면 Copy해야한다. # 그러나, Slicing한 경우는 equal 같은 이퀄이 아니라 값이 안바뀐다. l1 = [1,2,3,4,5,6,7,8,9,10] l2 = l1[0:5] print(l1, l2) del l1[2:6] print(l1, l2) #L l1 = [1,2,3,4,5,6,7,8,9,10] l2 = l1.copy() l1.pop() print(l1,l2) # 다르게 출력된다. | cs |
위의 예제를보면 list을 Copy하는 경우는 주소값이 따로따로 있기때문에 한쪽 자료를 변경하여도 모두 영향을 받지 않는다. Copy는 리스트나 딕셔러니 구조에서 사용가능하다.
Set
Set.issubset(set)
Set.issuperset(set):
Set.union(set):
Set.intersec(set):
Array module
Array(typecode [, initializer]): 새 배열을 생성한다.
typecode에는 i는 Signed integer(최소 2바이트)
1 2 3 4 5 | from array import * a = array('i', range(10)) # 어레이 생성 a.append(5) a.insert(5, 10) # 5위치에 10을 입력 a.extend(array('i',[12,3,4,5])) | cs |
디렉토리의 파일 목록 얻기
OS, glob 패키지
1 2 3 4 5 6 7 8 9 10 11 | #파일의 추가정보를 알아내기 import os import glob fileList = glob.glob('*') for name in fileList: if os.path.isfile(name): print('파일') elif os.path.isdir(name): print('directory') elif os.path.islink(name): print('link') | cs |
if 문에서 continue 와 break활용
1 2 3 4 | for x in range(10): if x < 8: continue # x <8인 조건을 맞을 떄, 계속 for의 위로 올라간다. print(x) | cs |
Decimal: 계산결과를 10진법으로 오류없이 출력해야하는 경우
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | e =0.0 for k in range(10000): e += 0.00001 print(e) #0.099999939 e = Decimal('0.0') delta = Decimal('0.00001') for k in range(10000): e += delta print(e) # 0.100000 import math, cmath d = Decimal('123.567') print(math.sqrt(d)) #11.116~ print(cmath.sqrt(-d)) #11.16.....j print(d.sqrt()) print(d.quantize(Decimal('0.01'), rounding=ROUND_DOWN)) #0.01 | cs |
지수 연산자
>>> 5 % -3 #파이썬 나머지는 젯수(나누는 값)의 부호와 같다. 5 = -3 * -2 + 1
>>> --3 #
result: 3 -(-3)
지수연산자는 오른쪽부터 순서대로 계산한다. 따라서,
2**3**5와 (2**3)**5의 계산은 다르다.
관계연산자: >, <, >=, <=
string type의 관계연산자의 크기비교
비교시에 길이가 다른 경우도 비교가 가능하다
>>> 'abcd' > 'abc'
False
>>> 'abc' < 'abcd'
True
위의 경우에서는 같은 인덱스끼리의 크기 비교를하고, 같으면 다음 순서도 비교를한다.
자료형간의 순서
숫자 < 사전 < 리스트 < 문자열 < 튜플
boolean으로 논리연산을 판단할 때, 공집합은 무조건 False이고, 아니면 True이다.
문자열 포맷팅
%s: 문자열 입력대체할 부분에 '%s' 라고 적은 후, 문장종료(따옴표 종료) 후, %"삽입할 말"을 적는다.
%d: 정수
%f: 부동소수
숫자가 같이 있으면 차지하는 캉을 의미
%10s이면 앞에 10칸을
%-10오른쪽
%0.2f : 소수점 2째자리면 표현됨.
파이썬 3에서는 str.format지원
인덱싱도 가능
print("session:{2}, val:{1}, loss:{0]".format(
키워드도 가능
'Data science > Python' 카테고리의 다른 글
0. Python 이란?: 언어형태, 특징, 메모리관리 (0) | 2019.06.16 |
---|---|
python 시각화 : Seaborn (0) | 2019.06.10 |
Python 시각화: 기본 (0) | 2019.05.30 |
3. Numpy 한 페이지 요약 (0) | 2019.05.13 |
2. Python: function (0) | 2019.03.19 |