자료들을 저장하는 여러 가지 구조들을 자료구조(Data Structure), 또는 데이터구조라 부른다.
시퀀스
- 요소(element)로 구성 - 요소 간에는 순서가 있다 - 시퀀스의 요소들은 번호가 붙여져 있다. - 내장 시퀀스 (str, bytes, bytearrary, list, tuple, range) - 동일한 연산을 지원 > 인덱싱(indexing), 슬라이싱(slicing), 덧셈연산, 곱셈연산 - 내장함수 적용가능 : 시퀀스의 길이를 반환하는 len()함수, 최대값과 최소값을 찾는 max()와 min()함수
튜플 패킹과 언패킹
- 패킹 t = ('apple', 'banana', 'grape') - 언패킹 (s1, s2, s3) = t - 결과 s1 = 'apple' s2 = 'banana' s3 = 'grape'
enumerate함수
- 순서가 있는 자료형(list, set, tuple, dictionary, string)을 입력으로 받았을 때, index와 값을 포함하여 리턴 - for문과 함께 자주 사용 - index와 값을 동시에 접근하면서 루프를 돌리고 싶을 때 사용
["apple", "banana", "grape"]
→
enumerate( ) 사용
→
(1, "apple") (2, "banana") (3, "grape")
Site Package 위치 확인하기
- Python에서 Site Packages가 설치되어 있는 경로를 출력하는 방법 - Terminal에서 다음 명령을 입력
python -m site --user-site
라이브러리
- 다른 사람들이 만들어 둔 함수들의 모음 - 자주 사용하는 기능을 쉽게 재사용할 수 있고 다른 사람과도 공유 - 표준 라이브러리 : 파이썬이 설치 될 때 같이 자동으로 설치 되는 라이브러리 - 외부 라이브러리 : 기본 외에 별도로 설치해서 사용하는 라이브러리 - 외부 라이브러리 설치 : pip install 라이브러리명, conda install 라이브러리명 - 사용법 : import 라이브러리명 - 현재 설치 되어있는 라이브러리 확인 : pip list - Pandas : 파이썬의 데이터 분석 라이브러리
- range()로 반복 횟수를 전달하면 range()가 자동으로 순차적인 정수들을 생성해준다.
- range( start = 0, stop, strp = 1 ) > start : 시작값 > stop : 종료값이지만 stop은 포함되지 않는다. > step : 한번에 증가되는 값이다.
조건제어반복
- 어떤 조건이 만족 되는 동안 반복한다. - ex) 투자금이 목표에 도달하는 기간을 계산해보자
무한루프와 break, continue
- 무한루프는 실제코드에서 많이 사용된다. 특히 반복을 빠져나가는 조건이 까다로운 경우에 많이 사용된다. 예를 들어서 사용자가 입력한 수가 3의 배수이거나 음수의 경우에 while 루프를 빠져나가야 한다고 하자. 이는 다음과 같이 while 루프의 조건문을 만드는 것보다,
while (x%3 == 0) or (x < 0) :
...
...
...
아래 나온 것 처럼 루프를 만들고 그 안에서 루프를 벗어나는 조건을 검사하는 편이 이해하기 쉽다.
while True:
if x%3 == 0:
break
if x<0 :
break
...
리스트 내포
- 리스트 내포(List Comprehension)는 원하는 자료들을 조회 또는 추출하여 리스트로 변환하는 현식 - 리스트 내포는 조건식을 이용하여 같은 연산을 전체 항목이나 일부 항목에 적용할 수 있음 - 리스트 내포를 이용하여 항목들을 대문자나 소문자로 바꾸는 등의 작업을 처리할 수 있음 - 리스트 내포 처리 과정 ① → ② → ③ 에서 ①로 이동하여 반복 수행, 더 이상 꺼내 올 항목이 없으면 종료함. ① 항목들에서 순차적으로 하나씩 꺼내온다. ② 조건식을 적용하여 해당 조건에 맞는 항목은 추출하고 조건에 맞지 않으면 무시한다. ③ 위에서 추출한 항목은 리스트에 추가한다. - 기본적인 리스트 내포 형식 > 항목들에서 순차적으로 꺼내 온 자료는 변수에 저장한 후 표현식에 적용하여 리스트에 추가함
함수
- 입력값, 출력값(반환값)이 있다. - 코드의 반복을 줄이기 위해 사용한다. - def 함수명(변수1, 변수2, ...): 실행문1 실행문2 ... return 결과값 - (변수1, 변수2) <= 변수 생략 가능 - return 문 생략 가능 - 함수명은 동사 + 명사 형태로 적는 것이 좋다. - ex. getId, deleteId
- 함수에 return을 여러개 찍으면 첫번째 return까지만 실행되고 멈춘다. 즉, 함수의 중단지점을 선언 할때 return을 쓴다
def add_minus(x, y):
return x + y
return x - y
- 함수에 쓰는 변수의 범위
- 변수에 default 값 설정 > default값을 지정한 파라미터가 먼저 나오면 오류가 난다. 즉, 파라미터 종류 별 순서가 중요하다
- global 변수 선언 > 로컬 변수, 글로벌 변수 구분하는게 중요 > 파이썬에서는 글로벌 변수일 경우 변수명에 global을 씀
> 아래의 경우는 로컬변수와 글로벌 변수를 함께 사용 하였으므로 함수내에 글로벌 변수 선언을 해준다.
lambda 함수
- lambda 변수1, 변수2, …: 결과값
파이썬 내에서 파일 생성 및 읽어오기
Pickle 라이브러리 사용
- 텍스트 상태의 데이터가 아닌 파이썬 객체 자체를 파일로 저장 - 기존의 텍스트 파일 저장과 다른점 > w, r 텍스트 모드 > wb, rb는 바이너리 모드(텍스트가 아닌 상태) > 저장할 때는 wb 읽을때는 rb로 지정 > pickle 쓸때는 무조건 wb랑 rb라고 작성 - Pickle 사용법
- 네비게이터(navigator)가 전략을 제시하고 드라이버(driver)가 실제 코드를 작성한다.
지금 까지 배운 내용을 토대로 고객의 정보를 관리하는 프로그램을 만듭니다. 고객의 정보를 관리하는 프로그램에서 사용하는 고객 정보를 저장하는 자료구조는 자신 있는 것을 이용합니다.
1. 주요 내용
- 고객의 정보는 이름, 성별, 이메일, 출생년도가 있습니다. - 고객의 정보를 입력받아 본인이 선택한 자료구조에 저장해야 합니다. - 이름은 문자열로 저장
- 성별은 남자는 M, 여자는 F로 저장 - 이메일은 문자열로 저장
- 태어난 연도는 정수로 저장
2. 요구사항
- 고객 관리 프로그램은 고객의 정보를 저장, 조회, 수정, 삭제 할 수있는 기능이 있어야 합니다. - 고객 정보를 파일에 저장하는 기능을 구현하지 않아도 됩니다.
- “ I ”를 눌러 고객의 정보를 입력받도록 합니다.
- 저장된 고객 정보는 “ P ” 또는 “ N ”을 눌러 이전 고객정보 또는 다음 고객정보를 조회할 수 있어야 합니다. - 조회한 고객 정보는 “ U ”를 눌러 새로운 정보로 수정할 수 있어야 합니다. - “ D ”를 누르면 조회한 고객 정보를 삭제해야 합니다.
- 프로그램의 종료는 “ Q ”를 누릅니다.
실습 시작 전 주요내용 정리하기
# 이름, 성별, 이메일, 출생년도
# 이름 - 문자열
# 성별 - M / F
# 이메일 - 문자열
# 출생년도 - 정수
# 저장, 조회, 수정, 삭제
# I - 사용자가 이름, 성별, 이메일, 출생년도를 순차적으로 입력할 수 있게한다.
# P, N - 입렭받은 여러명의 정보를 조회 (이전, 이후)
# U - 현재 위치의 고객정보를 수정해야 한다.
# D - 현재 위치의 고객정보를 삭제해야 한다.
# Q - 종료
작성한 코드
import re
# clientData = list()
# 기본으로 입력된 데이터 입니다.
clientData = [{'name' : 'aaa', 'gender' : 'M', 'email' : 'abc@gmail.com', 'birth' : '2000'},
{'name' : 'bbb', 'gender' : 'F', 'email' : 'bbb@gmail.com', 'birth' : '2001'},
{'name' : 'ccc', 'gender' : 'M', 'email' : 'ccc@gmail.com', 'birth' : '2002'}]
gender_pattern = re.compile(r'^[MFmf]$')
while True:
yourInput = input('I, R, U, D, Q 중에 입력하시오 : ')
if 'I' == yourInput:
while True:
name = input('이름을 입력하세요 : ')
if name.isalpha():
pass
else:
print('올바른 이름을 입력하세요.')
continue
gender = input('성별을 입력하세요(M / F) : ')
if gender_pattern.match(gender):
pass
else:
print('올바른 성별을 입력하세요.')
continue
email = input('이메일을 입력하세요 : ')
if email.isalpha():
pass
else:
print('올바른 이메일을 입력하세요.')
continue
birth = input('태어난 연도를 입력하세요 : ')
if birth.isdecimal():
pass
else:
print('올바른 태어난 연도를 입력하세요.')
dic = {'name' : name, 'gender' : gender, 'email' : email, 'birth' : birth}
clientData.append(dic)
print('입력완료 되었습니다.')
break
elif 'R' == yourInput:
count = -1
print('고객 정보를 조회하세요.')
while True:
search = input('이전정보를 조회하려면 P 다음 정보를 조회하려면 N을 입력하세요 : ')
if 'N' in search:
count += 1
print(clientData[count], f'당신의 번호는 {count}')
continue
elif 'P' in search:
count -= 1
print(clientData[count], f'당신의 번호는 {count}')
continue
elif 'Q' in search:
break
else :
print('N, P, Q중에 입력하세요 : ')
continue
elif 'U' == yourInput:
print('고객 정보를 수정하세요.')
user_count = input('당신의 번호를 입력하세요 : ')
print(f'현재 당신이 가지고있는 고객정보{clientData[int(user_count)]}')
rename = input('변경할 이름을 입력하세요 : ')
regender = input('변경할 성별을 입력하세요(M / F) : ')
reemail = input('변경할 이메일을 입력하세요 : ')
rebirth = input('변경할 태어난 연도를 입력하세요 : ')
dic = {'name' : rename, 'gender' : regender, 'email' : reemail, 'birth' : rebirth}
clientData[int(user_count)]=dic
print('입력완료 되었습니다.')
break
elif 'D' == yourInput:
print('삭제하시겠습니까?')
userDelCount=input('삭제할 번호를 입력하세요. 나가시려면 Q를 입력해주세요 : ')
if 'Q' in userDelCount:
continue
print(f'당신의 개인정보는 다음과 같습니다{clientData[int(userDelCount)]}')
real = input('정말 지우겠습니까?(Y / N) : ')
if 'Y' in real:
del clientData[int(userDelCount)]
continue
elif 'Q' == yourInput:
break
오류사항
- 고객 정보 조회 시 List에 존재하는 데이터 count을 넘어가면 오류가 난다.
- 이메일 입력시 isalpha()함수를 써서 문자형인지 확인하는데 정확한 이메일 형식을 입력하면 '@'와 '.' 등의 기호가 들어가기 때문에 문자 형식에 맞지 않아 오류가 난다.
- 변수의 이름 중간에 공백이 들어가면 안 된다. 단어를 구분하려면 밑줄(_)을 사용한다.
- 파이썬의 예약어(파이썬이 사용하는 특수한 언어)를 변수로 사용할 수 없다.
변수 예시
- 올바른 예 : size, cloud9, max_size, _count- 올바르지 않은 예 >> 6pack : 숫자가 앞에 오면 안 된다. >> mid score : 중간에 공백이 있으면 안 된다. >> class : 예약어를 변수로 사용할 수 없다. >> money# : 특수문자 사용할 수 없다.
낙타체낙타체는 변수의 첫 글자는 소문자로, 나머지 단어의 첫 글자는 대문자로 적는 방법이다. 예를 들어, myNewCar처럼 'm'은 소문자로, 나머지 단어들의 첫 글자는 대문자로 표기한다.
PyCharm은 전문 개발자를 위한 전체 스택 Python 통합 개발 환경(IDE)이다. Python 개발, 전체 스택 웹 개발, 데이터 과학 등 모든 Python 워크플로우를 지원한다. 지능형 Python 및 R 코드 지원, Python 웹 개발 프레임워크, javaScript 및 TypeScript, HTML/CSS, 데이터베이스, Jupyter Notebook에 대한 광범위한 지원을 한다.
DataSpell
DataSpell은 탐색적 데이터 분석 및 머신 러닝 모델 프로토타이핑을 위해 특별히 설계된 IDE이다. Jupyter Notebook의 대화형 기능과 지능형 Python 및 R코딩 지원을 하나의 사용자 친화적인 환경에 결합했다.
지능적인 코딩 지원, 버전 관리 및 기타 IDE 관련 기능은 물론 데이터를 시각화하고 데이터에서 인사이트를 얻는 데 도움이 되는 테이블, 플록 및 위젯 같은 대화형 출력기능이 있다.
- 문자열 포맷팅 : 문자열 내에서 변수, 값 또는 표현식을 삽입하거나 형식을 지정하는 방법
2-1. 문자열 함수
- upper() : 대문자 바꾸기
- lower() : 소문자 바꾸기
- count() : 문자열 안의 특정 문자열 개수 반환
- join() : 특정 문자열을 기준으로 문자열을 삽입
- split() : 특정 문자열을 기준으로 문자열을 나눈다
- replace() : 특정 문자열을 지정 문자열로 반환
- strip() : 공백제고 (lstrip, rstrip)
- find() : 특정 문자열을 찾아준다
- input(): 기본 입력 장치로 부터 입력된 정보를 반환한다.변수 = input()의 형식으로 사용
3. 리스트
- 요소들의 모음을 나타내는 자료형
- 요소들은 []로 감싼다
- 모든 자료형을 담을 수 있다
- 리스트 연산
>> + 연산자 : 순서대로 연결하여 하나의 리스트로 만든다 >> * 연산자 : 곱하는 수 만큼 반복하여 하나의 리스트로 만든다
3-1. 리스트 함수
- len() : 리스트의 길이를 반환 - sum(), min(), max() 함수 : 리스트 요소의 총합, 최솟값, 최댓값 (문자의 경우도 코드가 있기 때문에 코드가 가장 작은 값, 큰 값 반환) - in() : 특정 요소가 리스트에 있는지 확인하는 함수 - append() : 맨 마지막에 요소 추가 - extend() : 맨 마지막에 다른 리스트를 추가 - insert() : 특정 위치에 요소를 삽입한다 - remove(), pop() : 리스트의 요소를 삭제 - join() : 리스트의 요소들을 하나의 문자열로 합침 - split() : 문자열 리스트의 요소들로 나눈다
- range() : range(시작, 끝, 간격)을 리스트로 반환해준다.
4. 튜플
- 리스트와 같다 - 수정 불가능 (불변성) - 리스트보다 빠르다 - []가 아닌 () 사용 - append, insert, extend, remove, pop, sort 사용할 수 없다 - 튜플은 항목 할당을 지원하지 않는다. 즉, 대입 연산자가 먹히지 않는다.