오늘은 어제에 이어서 문자열을 마무리하고 그 이후
- 인덱싱
- 슬라이싱
- 문자열에 사용되는 주요 함수
컬렉션 계열인
- 리스트
- 딕셔너리
- 튜플
- 집합
에 대해서 배웠다.
어제는 정리할게 너무 많아서 거의 수업 내용 메모 느낌으로 진행하였는데 오늘은 조금 더 복습 느낌으로 작성해보려 한다.
문자열 마무리
- 여러개의 문자열에 동일 기호를 중복하여 작성할 시 \ 기호를 사용해서 구분한다
- ex)
- a = 'abcd' 'hi' 'efg'
- a
- 오류
- a = 'abcd' \'hi\' 'efg'
- a
- 'abcd' 'hi' 'efg'
- 또는 바깥쪽 기호를 다른 대체제로 변경한다
- ex)a
a - "abcd' 'hi' 'efg"
- a = "abcd' 'hi' 'efg"
- 오류
- a = 'abcd' 'hi' 'efg'
- ex)a
- 문자열 더하기
- a = 'hi'
- b = 'hello'
- a + b
- 'hihello'
- 문자열 반복
- '-' * 10 = '----------'
인덱싱
- 문자열에서 특정 문자열을 추출하는 행위
- 대부분 컬렉션 계열 자료구조에서 지원
- 본질적 의미
- * 차원이 축소됨 *
- 2차원 -> 인덱싱 -> 1차원
- 리스트, 딕셔너리, 튜플, 배열, 시리즈, 데이터프레임, 텐서
- 문자열은 차원축소 x
- 문법
- [] <- 대괄호
- 정 / 역방향 둘 다 가능하다
- ex)
- a = 'hihello'
- a [0] = 'h' - 코딩에서는 0부터 시작한다
- a [3] = 'e'
- a [-1] = 'o'
- a [-3] = ''l'
슬라이싱
- 원본 데이터에서 특정 데이터만 잘라냄
- 차원 유지 -> *인덱싱과 차이점!*
- 2차원 -> 슬라이싱 -> 2차원
- 문법
- 변수명 [시작 인덱스 : 끝 인덱스 : step(간격, 생략 가능, 생략시 기본값 1)] - 대괄호
- [시작 인덱스:끝 인덱스] -> 둘 중 하나를 사용하지 않아도 무방함
- [ : ] = 원본 카피
- 0<=인덱스<끝 인덱스 (끝 인덱스는 포함 x)
- ex)
- a = 'abcdefghijk'
- a[ : ] = 'abcdefghijk'
- a[ : 2 ] = 'ab' -> a[0] 과 a[1] 만 합쳐진것
- a[-2 : ] = 'jk' -> -2 <=인덱스 마지막까지
- a[ 1: -1 : 2 ] = 'bdfhj'
문자열 주요 함수
- 분해
- 문법 split()
- 특정 구분자 기준으로 문자열을 분해, 통상 리스트로 출력됨
- ex)
- a = 'uid=1234&aid=5678'
- a.split('&')
- ['uid=1234', 'aid=5678'] -> &를 기준으로 양쪽이 나눠져 리스트의 형태로 나온다
- 이를 통해 인덱싱을 이용하여 uid의 값과 aid의 값을 구하면
- a.split('&')[0].split('=')[1] = 1234
- a.split('&')[1].split('=')[1] = 5678
- 두번의 분해로 값을 도출해낼 수 있다.
- 순서
- 먼저 a.split('&')로 [uid=1234, aid=5678] 리스트 도출
- a.split('&')[0]으로 uid=1234 인덱싱 추출
- a.split('&').split("=")으로 ['uid, '1234'] 리스트 도출
- a.split('&').split("=")[1] 로 1번 인덱싱 추출
- 주의사항 -> 문자열 ''과 인덱싱 대괄호[]를 절대 잊지 말것
- ex)
- 조립
- 특정 구문자를 기반으로 리스트같은 컬렉션 데이터를 하나의 문자열로 구성한다
- 문법
- .join()
- '구분자'.join(컬렉션, 등등 타겟 데이터)
- ex
- a = list('helloworld')
- a = ['h' , 'e' , 'l' , 'l' , 'o' , 'w', 'o', 'r', 'l', 'd']
- ''.join(a) = ('helloworld')
- 구분자를 입력할 시
- '-'.join(a) = ('h-e-l-l-o-w-o-r-l-d')
- 대소문자 일괄 처리
- 알파벳만 해당됨
- 회원가입, 로그인 등에서 대 소문자 구분없이 가입 / 로그인 처리 등등에 사용
- 문법
- lower(), upper()
- ex
- a = 'aB'
- a.lower() = 'ab'
- a.upper() = 'AB'
- 공백 제거
- 문자열의 왼쪽, 오른쪽, 공백을 제거함
- 불필요한 공백은 필요 X
- 복잡한 공백은 정규식을 적용, replace() 함수 활용
- 문법
- strip(), lstrip(), rstrip()
- 양쪽, 왼쪽, 오른쪽
- 문법
- 포맷팅
- raw 데이터의 문자열을 특정 형태로 가공 처리할 때 유용함
- '포맷' %
- 정수면 %d, 부동소수면 %f, 문자열 %s -> 옛날방식
- '포맷' .format
- 함수의 매개변수에 순서대로 포맷팅자리 {}에 세팅됨 -> 포맷팅은 중괄호{}
- ex
- x = 1
- y = 2
- '{} + {} = {}'.format(x, y, x+y)
- '1 + 2 = 3
- 이 방식은 계산이 아닌 단순 변수 대입이기 때문에 연산을 원하면 바로 앞의 f포맷팅을 사용해야 한다.
- * fstring *
- 가장 많이 사용
- x = 1
- y = 2
- f'{x} + {y} = {x+y}'
- '1 + 2 = 3"
- ps : 이 부분은 추후 함수 공부를 하며 더 진도가 나간다고 하여 간단히 설명해주셨다. 실제로는 거의 fstring만 쓰는 추세
- '포맷' %
- raw 데이터의 문자열을 특정 형태로 가공 처리할 때 유용함
- 문자열 대체
- 문자열 바꾸기
- 간단한 변경 -> replace()
- 복잡한 변경 -> 정규식 사용
- ex
- 'helloworld'.replace("h" , "@")
- '@elloworld'
- 문자열 바꾸기
불린형
- 값의 종류
- 참 : True
- 거짓 : False
- 데이터의 결과가 2종류 (2분법)인 경우 표현
- 조건식의 결과 -> 불린형
- 절대적 False ( 부정 상황)
- None, 0, 0.0, False, [], {}, ()
- 조건식을 간결하게 구현할 수 있음
- 추후 흐름제어 진도에서 강조
- 절대적 False ( 부정 상황)
컬렉션 유형 (1개 이상의 데이터를 관리)
- 아래의 자료구조 형태에서 멤버로 데이터가 n개 소속되는 형태
- 표현의 차이가 있다
- ex
- list() : 자료구조를 생성 후 추후 데이터 추가 -> 동적 구성
- [] : 같은 리스트이지만 데이터를 미리 세팅하여 생성하는 스타일 -> 정적 구성
- 컴프리헨션 스타일(?)
타입명 기호 (리터럴)특징 생성법
| *리스트 | [] | - 순서 O - 값 중복 O |
list(), [] |
| *딕셔너리 | {} | - 순서 X(3.7이후 순서 유지) - 키와 값으로 매핑 - 키는 고유하다 |
dict(), {} |
| 튜플 | () | - 순서 O - 수정 X, 단순히 값을 묶는다 |
tuple() |
| 집합 | {} | - 중복 제거 | set() |
- 리스트
- 생성
- 두가지 방법이 있음
- list() : 리스트 생성 이후, 추후 멤버를 추가하는 스타일에 경우 선호
- [] : 최초 생성 시 멤버가 존재한 상태로 생성
- 컴프리헨션(내포라는 뜻)으로 리스트 컴프리헨션이라고 주로 불림
- * 특정한 경우에만 사용해야 하는 방법은 아니므로 두 방법 모두 사용 가능
- 두가지 방법이 있음
- 데이터 추가
- append() 함수 사용
- 데이터의 마지막에 추가됨
- 추가되는 데이터의 타입은 상관x
- ex
- a = ['b' , 100, True]
- a.append('hello')
- a = ['b' , 10, True, 'hello']
- append() 함수 사용
- 리스트 간 더하기
- a = [1, 2, 3]
- b = [4, 5, 6]
- a + b = [1, 2, 3, 4, 5, 6]
- 인덱싱
- 리스트는 순서가 있음, 고로 인덱스 사용 가능
- 차원 축소의 특성
- ex
- a [ 0 ] = 1 -> 괄호가 없어짐
- ab = [[1, 2] , [3, 4]]
- ab[0] = [1,2] -> 괄호가 없어짐
- 응용
- ab[0][1] = 2
- 차원 축소의 특성
- 리스트는 순서가 있음, 고로 인덱스 사용 가능
- 슬라이싱도 동일하게 적용
- 하나의 리스트를 하나의 데이터로 취급하면 동일함
- 리스트 삭제
- 멤버 제거
- 파이썬의 고유 문법 del로 대부분 타입에 적용
- del 변수, 변수, 변수
- 리스트의 삭제 기능
- clear()
- del은 원본 자체를 지워버리므로 보통 clear 사용
- 파이썬의 고유 문법 del로 대부분 타입에 적용
- 멤버 제거
- 리스트 추가
- extend()
- 추가 및 확장의 개념 존재하여 append()와는 다르게 사용됨
- ex
- a.extend([4,5,6])
- a = [1, 2, 3, 4, 5, 6]
- a.append([4, 5, 6])
- a = [1, 2, 3, [4, 5, 6]]
- extend는 현재 멤버와 동일하게 추가 -> 차원의 변화 x
- append는 하위 그룹으로 들어가 개념이 확장됨.
- extend()
- 생성
- 딕셔너리
- 특징
- 데이터 포맷 중 JSON과 가장 유사
- JSON으로 받은 데이터를 그대로 딕셔너리로 활용 가능
- JSON은 자바스크립트도 객체와 동일 (바로 변환 가능)
- JSON
- 서로 다른 OS / 랭귀지 / 프로그램들 간에 공통으로 이해하는 데이터 포맷
- 웬만한 곳에선 xml 과 JSON을 지원함. 통용되니까!
- xml
- 여행, 숙박, 항공 등등에 주로 이용
- ms(윈도우)기반 시스템
- JSON
- 모바일 앱, 웹 서비스에 주로 이용
- xml
- 데이터 종류 관점
- 정형 데이터
- 데이터베이스상의 데이터
- 스키마(구조정보)를 가지고 있다
- 비정형 데이터
- 바이너리 데이터
- 이미지, 사운드, 동영상,...
- 반정형 데이터
- xml, JSON
- 데이터와 구조가 같이 구성되어 있음
- 정형 데이터
- 이 부분은 추후 공부하며 진도가 더 나갈 예정
- 딕셔너리 구성
- 키와 값으로 쌍으로 관리됨
- 키는 고유해야 함(unique) 아이디가 같으면 안되니까
- 순서(인덱스) 없음
- 값은 중복 ok
- 데이터 포맷 중 JSON과 가장 유사
- 생성
- 멤버 나중에 추가
- dics = dict()
- 멤버 세팅하며 생성
- dics = {
- '키' : '값'
- 'age' : '20'
- 'key' : 'value'
- }
- 이렇게 생성할 시 값은
- ({'키' : '값' , 'age' : '20' , 'key' :'value'})
- len(dics) = 3 : 한쌍으로 보기 때문
- 멤버 나중에 추가
- 데이터 추가, 수정
- 만약 dics[ 10 ] = 100이라는 코드를 입력한다면
- 10이라는 키가 있으면 그 값이 100으로 대치된다
- 10이라는 키가 없으면 키와 함께 추가된다.
- 고로 인덱스 문법을 사용한다는 점만 외우면 됨 -> 대괄호!
- 만약 dics[ 10 ] = 100이라는 코드를 입력한다면
- 인덱스
- 따로 없기 때문에
- dics['키'] = '값'
- 으로 출력됨 하지만 키가 없으면 오류가 남
- 따로 없기 때문에
- 방어코드
- .get()문법을 사용하여 오류를 방지함
- 방어코드를 수행하지 않으면 오류가 나기 때문에
- 해당 키가 없어도 None으로 반환하는 문법을 사용하는게 일반적
- dics.get('키') = '값'
- dics.get(없는키) = None
- .get()문법을 사용하여 오류를 방지함
- 기타 함수
- dics.keys() = 모든 키 출력
- dics.values() = 모든 값 출력
- dics.items() = 모든 쌍 출력
- dics.clear() = 모든 멤버 삭제
- 특징
- 튜플
- 특징
- 단순하게 값을 묶는다
- 보통 일부러 만들기보다는 자동으로 처리되어 만들어짐
- 함수에서 여러 값을 반환할 때
- 함수 가변인자 (?)
- **수정 불가, 조작 불가, 읽기 전용**
- 표현
- (1) = 단순 숫자 1
- (1,) = 튜플
- 튜플일 시 값이 1개라면 반드시 ,반점을 찍어줘야 구분이 된다
- 생성
- 마찬가지로 두 가지 방법이 있다
- a = tuple()
- a = (1, 2, 3)
- 주 용도
- 포맷팅을 했던 것 처럼 튜플 또한 순서를 가지고 있어 각 변수에 값을 담는 것이 가능
- ex
- age라는 변수에 튜플의 1을 담아서 출력하시오
- age = a[0]
- age = 1
- 포맷팅을 했던 것 처럼 튜플 또한 순서를 가지고 있어 각 변수에 값을 담는 것이 가능
- 특징
- 집합
- 중복 제거
- 차집합, 교집합, 합집합
- 사용 빈도 적습니다
- 느림 / 넘파이보다
- 중복 제거
- data = ['helloworld']
- set(data)
- = {'d', 'e', 'h', 'l', 'o', 'r', 'w'}
- 중복 제거
수업중에 종종 나중에 나오는, 그리고 알아야 할 개념에 대해서 설명해주신다.
아직 정말 기초적인 단계지만 나중에 나오는 개념들에도, 추후 진행할 프로젝트와 실무에서도 지금 배우고 있는 부분들이 사용될 것이고 모든 기술이 연관되어있다는 생각을 하게 되었다.
예전에 학교에 다니며 공부하고, 실무에서 느낀 점들이 수업을 들으며 새록새록 생각난다.
1학년, 2학년 때에는 cad에서 선 긋는것, 사각형, 원, 타원, 곡선 이정도만 연습하는 예제를 주시고 그것만 30분동안 하면서 아 이게 내가 그린 도형이라고? 하면서 엄청 신나했었는데 어느 순간 그것들은 그냥 내 손에 익은 채로 생각하는것보다 빠르게 손이 움직이는 그 순간이 기억났다.
이걸 흔히 '체화' 라고 표현한다. 나도 더욱 열심히 차근차근 나아가면 지금은 도형 하나 만드는데에도 오래걸리던 그 때처럼 아직 모르는것 투성이지만 이 기술들의 개념을 당연하게 머리 속에 생각하는 그 날이 오기를 바라며 오늘도 글을 마친다.