2일 복습 | 교재 위주
구직과 수강 사이를 고민하다가
계약직 전전하며 살바엔
눈 딱 감고 6개월 빚이라도 내자는 마음으로
2일차부터 수업을 듣게 됐다.
내 욕심일지도 모르겠지만 이왕 이렇게 된거
무조건 열심히 한다.
파이썬의 유래와 특징
파이썬은 그리스어 '피톤'에서 유래했으며 본래 '비단뱀'이란 뜻을 가지고 있다고 한다.
그래서 로고도 비단뱀 2마리가 꼬여 있는 모습을 형상화한 것이라고 한다.
파이썬으로 개발된 대표적인 프로그램으로 인스타그램이 있다.
파이썬의 특징
1. 파이썬은 대화식 언어인 인터프리터 언어이다.
* 대화식 언어 : 제작자가 이미 실행중인 동안 프로그램을 변경할 수있는 언어
2. 플랫폼에 독립적이다.
어떤 운영체제를 사용하든 같은 파이썬 코드를 사용할 수 있다.(자바와 유사)
개발자가 파이썬 코드(*.py)를 실행하면 먼저 '바이트 코드'상태가 되고, 바이트 코드는 PVM(Python Virtual Machine)이라는 파이썬 가상 머신, 즉 파이썬 실행 환경에 전달되어 처리된다. 파이썬을 설치할 때 운영체제에 맞는 파이썬을 선택해서 설치하면 그에 맞는 PVM이 설치되므로 운영체제에 맞는 파이썬을 선택해야한다.
/ 윈도우용 PVM - 윈도우 운영체제
파이썬코드
\ 리눅스용 PVM - 리눅스 운영체제
* 바이트코드(Bytecode, portable code, p-code) :
1) 가상 머신이 실행하는 명령어의 형태
2) 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법
3)고급 언어로 작성된 소스 코드를 가상머신이 이해할 수 있는 중간 코드로 컴파일한 것
* 컴파일 : 주어진 언어로 작성된 컴퓨터 프로그램을 다른 언어의 동등한 프로그램으로 변환하는 프로세스
3. 객체지향 언어다.
파이썬은 클래스와 객체를 기반으로 하는 객체지향 언어로 정보 은닉, 상속 등의 개념을 지원한다.
* 클래스(class) : 부품 객체를 만들기 위한 청사진, 설계도, 템플릿
=> 추상화의 과정을 통해 형성됨
같은 문제 도메인에 속하는 속성(attribute)과 행위(behavior)를 정의
* 객체(object) : 변수(값) + 메서드(실행코드) => 서로 연관된 것들끼리 묶어 만든것
참고 : https://mungto.tistory.com/105
4. 동적 타이핑(dynamic typing)언어다.
프로그램이 실행 중인 시점에 처리할 수 있는 작업을 '동적 작업'이라고 한다. 파이썬은 프로그램이 실행 중인 시점에 자료형(type)을 검사할 수 있는 '동적 타이핑'을 지원. 이는 미리 자료형을 정해두고 실행되는 대부분의 다른 언어들과 차별되는 부분
5. 개발 속도가 빠르다.
데이터 분석을 위한 pandas, 수치 연산을 위한 numpy, 데이터 시각화를 위한 matplotlib 등 이미 완성된 다양한 라이브러리들을 사용할 수 있어 빠르게 새로운 프로그램을 개발 할 수 있다.
파이썬 설치하기
1) 파이썬 홈페이지에서 다운로드로 제일 최신 파일 다운로드(모든 버전을 할 수 있기 위함)
※ ‘Add Python 3.8 to PATH’를 체크
(작성한 파이썬 소스 파일 (*.py)을 저장해 둔 경로와 관계없이 항상 실행할 수 있게 하기 위함)
2) ‘Customize installation’ 옵션을 사용, 파이썬의 설치 경로를 수정
3) ‘Add Python 3.8 to PATH’ 메뉴를 체크한 뒤 ‘Customize installation’ 옵션을 클릭
4) Optional Features 화면에서 ‘Next’를 클릭
5) Advanced Options 화면에서 ‘Customize install location’ 항목을 선택해 설치 경로를 수정
6) C:\Python38과 같이 간단한 경로로 수정하고 ‘Install’을 클릭해 설치를 시작
실행방법
1. 명령 프롬프트를 이용해 실행하기
2. IDLE을 이용해 실행하기
3. IDE를 이용해 실행 하기
파이썬 프로그래밍 기본
주석 : 프로그램 소스 코드에 설명을 작성해 둔 부분
# 한 줄 주석
작은따옴표 3개(''' ''') 여러 줄 주석
큰따옴표 3개(""" """)도 같은 역할을 수행하지만, 본래 용도는 Docstring을 작성하는 용도이므로 구별
Docstring은 모듈, 함수, 클래스, 메소드를 정의할 때 첫 번째로 작성하는 문자열
• 모듈 : 파이썬 프로그램 자체로 확장자가 .py인 파일을 의미
• 함수 : 특정 기능을 수행하는 프로그램 코드의 집합
• 클래스 : 객체를 생성하기 위한 설계도를 의미
• 메소드 : 클래스 내부에 포함된 함수를 의미
변수
변수는 저장공간
ex) score = 100
변수명
best => 영문으로 의미를 가진 소문자
영문, 한글, 숫자,언더하이픈_으로 구성,
특수문자 사용 x ,
대문자소문자 구분,
첫 글자가 숫자 x , 키워드(지정해놓은 단어) 사용 x
C, C++, Java는 변수를 사용하려면 우선 ‘변수 선언’
int age; // 정수를 저장할 age 변수 선언
age = 25; // age 변수에 25를 저장
파이썬 변수 선언x(변수에 값을 전달할 때 자동으로 메모리 공간이 할당되고 값도 저장되기 때문:동적 타이핑)
age = 25 # age 변수에 25를 저장하면서 age 변수의 자료형을 int로 자동 인식
기본 자료형(type)
(n)을 각각으로 변환
int(n) -> 정수
float(n) -> 실수
bool(n) -> 논리
값 : Ture, False(쓸 때 대소문자 구분)
파이썬에서 false는 값이 없는 모든 경우 의미, 숫자 0, 빈 문자열", 빈 리스트[] 등은 모두 false로 인식
>>> bool(0)
False
>>> bool('')
False
>>> bool([ ])
False
str(n) 문자열
1) 문자열 형태
한줄 문자열 '...', "..."
여러줄 문자열 '''...''', """..."""
2)문자열 변환
>>> str(100)
'100'
>>> str(True)
True'
>>> str(False)
'False'
>>> str(3.14)
'3.14'
3)문자열 인덱싱(indexing)
s = ⓗⓔⓛⓛⓞ
index 0 1 2 3 4
-5 -4 -3 -2 -1
>>>s='hello' >>>s[1] 'e' |
>>>s='hello' >>>s[1]==s[-4] Ture |
4)문자열 슬라이싱(slicing)
문자열 슬라이싱(slicing)은 문자열의 인덱스를 활용하여 한 한자 이상으로 구성된 단어나 문장을 추출할 때 사용
s[start : stop : step]
1. start : 시작 인덱스 지정, 생략시 처음부터 추출
2. stop : 종료 인덱스 지정(종료인덱스의 이전까지만 추출), 생략시 끝까지 추출
3. step : 인덱스의 증감값, 생략하면 1씩 변화
*대체로 step은 생략
>>>s = 'banana'
>>>s[0:3]
'ban'
컬렉션
"여러 값을 하나의 이름으로 묶어서 관리하는 자료형"
컬렉션 | 생성 함수 | 특징 | 예시 |
리스트 | list() | 추가, 수정, 삭제가 언제나 가능 | a = [1,2,3] |
튜플 | tuple() | 생성되고 나면 변경 불가능 | a = {1,2,3} |
세트 | set() | 중복된 값의 저장 불가능 | a = {1,2,3} |
딕셔너리 | dict() | 키+값으로 관리 | a = {'age':25} |
컬렉션 중 저장된 값들의 순서가 있는 컬렉션을 '시퀀스(sequence)'라고 부름. 리스트와 튜플이 대표적
데이터 요소가 통로를 지나갈 때
0
2
4
7
stack(쌓다)은 먼저 들어간 데이터가 가장 마지막에 나옴
ex)막혀있는 컵 같음, 게시판(최신글 위로)
들어갈 때 | 나갈 때 |
0 2 4 7 |
7 4 2 0 |
queue는 먼저 들어간 데이터가 먼저 나옴
ex)뚫려있는 통로, 대기순번표
들어갈 때 | 나갈 때 |
0 2 4 7 |
0 2 4 7 |
자료구조
list : index(0,1,2,3,4...)를 통해서만 값을 가져올 수 있음 ex) s[0]
남의 주머니 , 데이터가 많을 때, 찾을 때, 수정, 삭제 유리
ㅁㅁㅁㅁㅁ
0 1 2 3 4
set : 나의 주머니에서 직접 값 가져옴
추가 용이 데이터 찾을 때(조회) 불리
★○◇*#
map(dict) : list와 set을 합친 것
set이 index의 역할
'age' = 10
큐플은 값을 지정할 수 없음. 추가 수정 삭제 안됨
리스트
1)리스트는 여러 값을 저장할 때 가장 많이 사용하는 자료형, 저장하고자 하는 값들의 자료형이 서로 다르더라도 하나의 리스트에 저장할 수 있다.
리스트는 대괄호[] 또는 list() 함수를 이용하여 생성
li = [값1, 값2, ...]
li = list(반복가능객체)
실제로 정수, 실수, 문자열을 각 1개씩 저장하고 있는 리스트를 생성
>>>li = [100, 3.14, 'hello']
>>>li
[100, 3.14, 'hello']
반면, c나 java는 하나의 배열에 하나의 자료형만 저장함
2)리스트의 인덱싱과 슬라이싱 가능
3)리스트 요소의 추가와 삭제
리스트에 새로운 요소를 추가할 때는 append( )와 insert( ) 메소드를 사용.
append( ) 메소드는 항상 마지막 요소로 추가되며, insert( ) 메소드는 추가할 인덱스(위치 정보)를 지정
>>>scores = [50, 40, 30]
>>>scores.append(100)#마지막 요소로 100을 추가합니다.
>>>scores
[50, 40, 30, 100]
>>>scores.insert(0, 90)#인덱스 0에 90을 추가합니다.
>>>scores
[90, 50, 40, 30, 100]
기존 요소를 삭제할 때는 pop( ) 메소드를 사용.
pop()메소드는 인덱스를 전달하지 않으면 마지막 요소를 삭제하고 인덱스를 전달하면 전달된 인덱스의 요소를 삭제
>>>scores.pop() #마지막 요소를 제거
100
>>>scores
[90, 50, 40, 30]
>>>scores.pop(0) #인덱스가 0인 요소를 제거
90
>>>scores
[50, 40, 30]
자료형 확인 : type( ) -><class '자료형'>
>>>age = 20
>>>type(age)
<class 'int'> #age는 정수(int) 자료형
튜플
저장된 값을 변경할 수 없는 리스트. 이미 저장된 값 이외에는 추가, 수정, 삭제가 불가능
t = ( 값1, 값2, ... )
t = tuple( 반복가능객체)
세트
세트에 저장된 값들은 순서가 없기 때문에 인덱싱과 슬라이싱 사용 x.
s = { 값1, 값2, ... }
s = set( 반복가능객체 )
빈 세트 생성할 때 중괄호 사용 x , 빈 세트 생성시 set( )함수를 이용해야함
>>>s = { }
>>>type(s)
<class 'dict'>
>>>s = set( )
>>>type(s)
<class 'set'>
세트의 특징
1. 저장되는 순서가 없다
2. 중복된 값을 저장할 수 가 없다
>>>li = list(set([1, 1, 2, 2, 3, 3]))
>>>li
[1, 2, 3]
리스트 [1, 1, 2, 2, 3, 3]의 중복 요소를 제거하기 위해 우선 set( ) 함수를 이용해 세트로 변환
set([1, 1, 2, 2, 3, 3])의 결과는 {1, 2, 3}.
중복을 제거한 세트 {1, 2, 3}을 리스트로 변환하기 위해 list( ) 함수를 사용하면 최종적 으로 리스트 [1, 2, 3]이 생성
세트는 대괄호([ ])를 이용하여 특정 요소만 추출하는 방법(인덱싱과 슬라이싱)을 제공하지 않는다. 이와 같은 작업을 수행하기 위해서는 세트를 리스트나 튜플로 변환.
세트 요소의 추가와 삭제
세트에 새로운 요소를 추가할 때는 add( ) 메소드를 사용하고, 기존 요소를 삭제할 때는 remove( ) 메소드나
discard( ) 메소드를 사용할 수 있다.
>>> s = {10, 20, 30}
>>>s.add(40) #세트에 40을 추가합니다.
>>>s
{40, 10, 20, 30} # 세트에 저장되는 요소들은 순서가 없습니다.
add( ) 메소드에 저장할 값을 전달하면 세트에 추가 됨. 단 순서가 없는 세트의 특성상 추가 위치 지정은 안됨
>>>s.remove(20) #세트에서 20을 제거, 20이 없으면 KeyError 오류가 발생
>>>s
{40, 10, 30}
>>>s.discard(30) #세트에서 30을 제거. 30이 없어도 오류가 발생하지 않음
>>>s
{40, 10}
remove( )메소드는 삭제 대상이 없는 경우 오류가 발생하지만,
discard( ) 메소드는 삭제 대상이 없어도 오류가 발생하지 않는다.
딕셔너리
'키(key)'와 '값(value)'을 '단어'와 '단어의 의미'처럼 사용
dict = {키1:값1, 키2:값2, ...}
#값1==dict[키1]
#값2==dict[키2]
>>> d = {'a':'apple','b':'banana'}
>>> d
{'a': 'apple', 'b': 'banana'}
>>> type(d)
<class 'dict'>
>>> d['a']
'apple'
>>> d['b']
'banana'
새로운 요소의 추가와 삭제
>>> dic={'apple':'사과'}
>>> dic['watermelon']='멜론'
>>> dic
{'apple': '사과', 'watermelon': '멜론'} #추가
>>> dic['watermelon']='수박'
>>> dic
{'apple': '사과', 'watermelon': '수박'} #수정
새로운 키와 값을 추가할 때는 setdefault( )메소드를 사용, 기존 키와 값을 삭제할 때는 pop( )메소드를 사용.
값을 수정하는 update( )메소드도 있음
>>>me = {'name':'james'}
>>>me.setdefault('age'.20) # 'age':20을 추가하고 추가된 값 20을 반환
20
>>>me
{'name':'james'.'age':20}
'''▶추가된 나이를 수정◀'''
>>>me.update(age=25) # 'age':25로 수정
>>>me
{'name':'james', 'age':25}
'''▶기존에 존재하지 않는 키값을 이용해 update()메서드를 호출하면 새로운 데이터가 추가됨
다만 이 경우 키값은 문자열◀'''
>>>me.update(address='seoul')
>>>me
{'name':'james','age':25, 'adress':'seoul'}
'''▶pop()메소드에 삭제하고자 하는 데이터의 키값을 전달하면 해당 키값을 가진 데이터 삭제◀'''
>>>me.pop('address')
'seoul'
>>>me
{'name':'james','age':25}
mutable과 immutable
mutable은 생성된 후에도 변경이 가능한 자료형을 의미,
immutable은 생성된 후에는 변경이 불가능한 자료형을 의미
mutable | immutable |
리스트(list), 세트(set), 딕셔너리(dict) | 정수(int), 실수(float), 문자열(str), 튜플(tuple) |
id( )함수는 전달된 변수나 자료형이 메모리에 저장된 위치정보를 정숫값으로 반환함.
메모리는 1바이트마다 고유번호가 부여되어 있는데 이 위치정보를 나타내는 정숫값이며 일반적으로 '주소(adress)'라고 부름.
mutable한 자료형들은 할당받은 메모리에 저장된 값을 다른 값으로 바꿀 수 있다
>>>me = [1,2,3]
>>>id(me)
123 # 메모리의 123번지
>>>me.append(4)
>>>id(me)
123 #메모리 123번지, me의 주소가 변하지 않음
me.append(4)로 리스트에 새로운 요소인 4를 추가하면 [1,2,3,4]로 수정되나 append( )메소드로 값을 추가한 뒤에도 여전히 리스트 me의 주소는 123번지이다.
immutable은 한번 생성하면 최초로 저장된 값을 다른 값으로 바꿀 수 없다.
>>>me = 10
>>>id(me)
123 #메모리 123번지
>>>me +=1
>>>id(me)
456 #메모리 456번지, me의 주소가 바뀜
변수 me의 주소는 123번지이고, 변수 me에 최초로 저장된 10은 변경 불가. 따라서 me+=1코드로 me의 값을 11로 변경하면 123번지의 10은 변경불가기에 새로운 456번지에 증가된 11을 저장. 그리고 새로운 주소를 변수 me에 다시 할당.
mutable의 주요 특징
>>>me =[1,2,3]
>>>you = me
>>>id(me)
123 #메모리 123번지
>>>id(you)
123 #메모리 123번지
>>>you.append(4) #분명 you에만 4를 추가
>>>you
[1,2,3,4]
>>>me
[1,2,3,4] #me에도 4가 추가됨
me 123번지에 저장 ↘ 123번지에 저장된
you 123번지에 저장↗ [1, 2, 3]
123번지의 [1, 2, 3]은 자유롭게 수정이 가능한 mutable이기 때문에 you.append(4)를 통해서 [1, 2, 3, 4]로 수정가능.
수정된 리스트 [1, 2, 3, 4]는 me와 you가 공유하는 메모리 공간 123번지에 저장되어 있기 때문에 you를 통해 리스트를 수정했음에도 불구하고 me도 함께 수정된 것처럼 보이는 것.
응용예제
1. 5자리로 구성된 학번 '31025'를 학년, 반, 번호로 나누어 출력하는 프로그램을 구현
실행 예 : 3 학년 10 반 25 번
#풀이
>>> num = '31025' #애초에 문자열로 숫자를 저장하여 str() 사용 x
>>> num
'31025'
>>> print(num[0]+'학년',num[1:3]+'반',num[3:]+'번')
3학년 10반 25번
2. 전체 차량번호에서 뒤에 숫자 4자리만 출력하는 프로그램을 구현하세요. 전체 차량 번호는 '서울2가1234', '10가1234', '288가1234'와 같이 다르지만, 모두 차량번호 4자리는 '1234'이다.
실행 예 : 서울2가1234의 차량번호 4자리는 1234이다.
#풀이
>>> car = '서울2가1234'
>>> print(car+'의 차량번호 4자리는'+car[-4:]+'입니다.')
서울2가1234의 차량번호 4자리는1234입니다.
>>>car = '10가1234'
>>> print(car+'의 차량번호 4자리는'+car[-4:]+'입니다.')
10가1234의 차량번호 4자리는1234입니다.
>>>car = '288가1234'
>>> print(car+'의 차량번호 4자리는'+car[-4:]+'입니다.')
288가1234의 차량번호 4자리는1234입니다.
'''[-4]를 사용해야하는 이유는
>>> car = '10가1234'
>>> print(car+'의 차량번호 4자리는'+car[4:]+'입니다.')
10가1234의 차량번호 4자리는234입니다.
처럼 되기 때문.
끝에 0자리를 넣으면 안됨,
>>> car[-4:0]
''
로 나옴,
0은 기준점이기 때문에 그러하다.'''
3. 문자열 s에 'maple'이 저장되어 있다. 문자열 s의 가운데 글자를 출력하는 프로그램을 구현하라
실행 예 : maple의 가운데 글자는 p이다.
#풀이
>>> print(s[int(len(s)/2)]) # int()->정수, 2.5 -> 2
p
>>> print(s[int(len(s)/2)] if len(s) % 2 != 0 else s[int(len(s)/2)-1]) '''만약 s를 2로 나눈
나머지가 0이 아니면 앞의 식을 실행하고 0이면 뒤의 식을 실행하라'''
p
>>> s = 'controller'
>>> print(s[int(len(s)/2)] if len(s) % 2 != 0 else s[int(len(s)/2)-1])
r
4. 리스트 [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]의 3번째 요소부터 7번째 요소만 추출한 결과 리스트에서 2번 째 요소를 출력하는 프로그램을 구현하라 * 리스트의 인덱싱과 슬라이싱 기능을 활용해 보세요
실행 예 :
3번째 요소부터 7번째 요소 = [30, 40, 50, 60, 70]
3번째 요소부터 7번째 요소 중 2번째 요소 = 40
dataList = [10,20,30,40,50,60,70,80,90,100]
result = dataList[2:7]
print(result[1])
5. 어떤 중국음식점의 이번 주말 할인 메뉴는 금요일은 탕수육, 토요일은 유산슬, 일요일은 팔보채다. 요일별 할인 메뉴를 딕셔너리(dict)구조로 저장하고 다음과 같이 출력하는 프로그램을 구현하라.
실행 예 :
금요일 : 탕수육
토요일 : 유산슬
일요일 : 팔보채
#풀이
>>> d={'금요일':'탕수육','토요일':'유산슬','일요일':'팔보채'}
>>> d
{'금요일': '탕수육', '토요일': '유산슬', '일요일': '팔보채'}
>>> d['금요일']
'탕수육'
>>> print(d['금요일'])
탕수육