> 1 ~ 3 주차 과제 - Flask, MYSQL을 사용하여, CRUD ( Cread Read Update Delete ) 기능 구현 및 완성, 도커 명령어, 도커 파일, 도커 컴포즈 개념, 도커 개념 공부하기
+ 점프 투 파이썬 사이트에서 공부하고, 각 01장, 02장, 03장, 04장, 05장 까지만 요약하여 블로그에 작성
- 기본적인 Docker에 대한 개념을 공부하고 Dockerfile 문법을 공부 하세요.
- 공부한 내용에 대해 상세하게 블로그에 작성하세요.
- 도커 명령어와, 도커 파일에 대해 작성하면 됩니다. ( *필수* 도커 컨테이너 생성, 삭제, 도커 컨테이너 이미지 생성, 삭제 그 외에도 꼼꼼히 작성 하세요 )
* 제대로 공지를 읽고 도커 파일, 도커 컴포즈(Compose) 개념, 도커 명령어, 도커 개념에 대해 제대로 작성하세요. 퀄리치 신경쓰시기 바랍니다
- 점프 투 플라스크 사이트를 보면서 게시판 CRUD를 구현 하세요.
* 이번 주 내로 해당 게시판 완성 바랍니다. 점프 투 플라스크를 보고 게시판 만들 때 까지 정독하시면 됩니다.
- CRUD는 Create, Read, Update, Delete으로 게시판 생성, 읽기, 수정, 삭제 기능을 구현 하는 것을 말 합니다.- 구현해야 될 게시판 기능은 다음과 같습니다.
- 게시판 생성, 삭제, 수정, 읽기
점프 투 플라스크 : https://wikidocs.net/book/4542
flask 공식 문서 : https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html
도커 관련 공식 문서 : https://docs.docker.com/get-started/
4 주차 과제 : Dockerfile을 이용하여 Flask + MYSQL으로 만든 서버를 구축, 도커 파일과 Flask MySql으로 만든 소스코드들을 전부 GITHUB에 업로드 하여 깃허브 링크를 포함하여 과제 제출 바랍니다.
+ docker build 명령어와 docker run 등의 명령어를 이용하여 바로 서버가 작동 될 수 있도록 만들어야 합니다. ( 한 마디로, 도커라이징 하면 됩니다. )
+ 본인이 도커 명령어를 이용하여 서버를 작동 시킨 명령어를 모두 README.md 파일에 업로드 하시기 바랍니다.
* 해당 과제는 도커 빌드하는 법, 도커 이미지 빌드하는 법, 플라스크 서버 도커 이미지 빌드하는 법 등 이런식으로 구글링 하면서 하시면 됩니다.
5 ~ 6 주차 과제 : SQL에 대해 공부하고, 아래의 항목에 있는 내용들을 모두 작성 바랍니다. ( * 설명 꼼꼼히 읽으세요! )
+ DML, DDL, DCL, DCL, TCL에 대해 각각 공부하시기 바랍니다.
+ HTTP METHOD에 대해 공부하세요.
+ HTTP COOKIE, SESSION에 대해 공부하고, 차이점을 알아오세요
+ HTTP PACKET 구조에 대해 알아오세요.
+ 파이썬으로 socket 모듈을 이용해서 http packet을 직접 만들어, me2nuk.com에 요청하고 출력하는 코드를 작성하세요
7 주차 - DVWA 웹 모의해킹 실습 서버 구축 및 취약점 실습 ( Low 문제 풀이 및 문제풀이 자세하게 작성 )
+ DVWA 템플릿을 직접 컴퓨터에 구축하여 취약점 테스트를 진행하면 됩니다.
+ 취약점을 찾는 것이 우선은 맞지만, 무조건 취약점을 이해하고 자세하게 작성하세요.
DVWA 플랫폼 : https://github.com/digininja/DVWA
- DVWA 서버를 직접 구축하여 취약점 공부를 하세요.
- 각 취약점 마다 난이도가 존재합니다. 일단 7 주차는 Low 난이도만 진행하면 됩니다.
- **중요** 취약점에 대해 자세하게 작성하고, 취약점을 발생 시키기 위해 사용한 코드를 자세하게 설명하세요.
- 만약 취약점에 대해 이해도가 부족한 것으로 파악되면 마이너스 요소가 될 수 있습니다.
- 과제를 우선시로 푸는 것도 맞지만, 취약점에 대한 이해를 먼저 하고 하세요 :)
점프 투 파이썬
1장: 파이썬이란 무엇인가?
1-1: 파이썬이란?
- 인터프리터(interpreter) 언어: 소스 코드를 한 줄씩 해석한 후 그때그때 실행해 결과를 바로 확인할 수 있는 언어
- 공동 작업과 유지 보구가 쉬움 => 빅 테크에서 많이 사용
1-2 파이썬의 특징
- 파이썬은 인간다운 언어
- 프로그래밍: 인간이 생각하는 것을 컴퓨터에 지시하는 행위를 말한다
- 파이썬은 사람이 생각하는 방식을 그대로 표현할 수 있다
- 직관적
-
if 4 in [1,2,3,4]: print("4가 있습니다") #만약 4가 1, 2, 3, 4 중에 있으면 "4가 있습니다"를 출력해라
- 문법 쉬움 => 빠르게 배움
- 자료형, 함수, 클래스 만드는 법, 라이브러리 및 내장 함수 사용 방법을 익히는데 일주일이면 충분하다 - Eric Raymond
- 무료 but 강력
- open source(오픈 소스) = 무료
- 만들고자 하는 대부분의 프로그램을 파이썬으로 만들 수 있다
- 물론 시스템 프로그래밍이나 하드웨어 제어와 같은 매우 복잡하고 반복 연산이 많은 프로그램은 파이썬과 어울리지 않는다
- 하지만 파이썬은 이러한 약점을 극복할 수 있도록 다른 언어로 만든 프로그램을 파이썬 프로그램에 포함시킬 수 있다
- 파이썬과 C는 찰떡궁합: 뼈대 => 파이썬 & 빠른 실행 속도 필요한 부분 => C
- 파이썬 라이브러리 중 C로 만든 것도 많다 => 속도가 빠르다
- 파이썬 라이브러리: 파이썬 프로그램을 작성할 때 불러와 사용할 수 있도록 미리 만들어 놓은 파이썬 파일의 모음
- 간결하다; simple as fuck boiii
- 다른 언어 like Perl(펄) => 100가지 방법으로 1가지 일을 처리 할 수 있음
- but 파이썬은 가장 좋은 방법 1가지만 사용하는 것을 선호 => 코드 이해 쉬움 => 공동 작업 & 유지 보수 편리
- 단락을 구분하는 괄호({}) 없음
- but 파이썬은 줄을 잘 맞춰야 한다 => 안 맞추면 프로그램 실행 안 됨
- 프로그래밍을 즐기게 해 줌
- 개발 속도가 빠름
1-3 파이썬으로 무엇을 할 수 있을까?
파이썬으로 할 수 있는 일
- 웹 프로그래밍
- 구글 크롬이나 마이크로소프트 엣지와 갗은 웹 브라우저에 있는 게시판, 방명록 => 웹 프로그래밍
- 인공지능과 머신러닝
- 인공지능(Artificial Inteligence): 기계가 인간처럼 생각하고 행동할 수 있는 능력을 제공하는 기술
- 파이썬을 활용하여 저연어 처리, 음성 인식, 이미지 인식 등 인공지능 기술 구현 가능
- 머신러닝(Machine Learning): 인공지능의 한 분야; 경험을 통해 자동으로 발전하는 컴퓨터 알고리즘을 연구하는 분야
- 파이썬은 인공지능과 머신러닝 프로그래밍을 쉽게 할 수 있도록 사이킷런(scikit-learn), 텐서플로(Tensorflow), 파이토치(PyTorch), 케라스(Keras) 등 다양한 라이브러리 제공
- 수치 연산 프로그래밍
- in fact, 파이썬은 수치 연산 프로그래밍에 적합안 언어 아님
- 수치가 복잡하고 연산이 많다면 C와 같은 언어가 더 빠름
- but 파이싼은 넘파이(NumPy)라는 수치 모듈을 제공 => C로 작성된 모듈이기 때문에 파이썬에서도 빠른 수치 연산 수행 가능
- 데이터 분석
- 파이썬은 데이터 분석에 이상적인 언어
- 넘파이(NumPy)
- 판다스(Pandas)
- 맷플롯립(Matplotlib) 등 과 같은 라이브러리들을 활용하여 데이터 처리, 통계 분석, 시각화를 손쉽게 수행
- 기존에는 데이터 분석을 위해 R 많이 사용 but 판다스 등장 이후 파이썬 사용 추세 증가
- 파이썬은 데이터 분석에 이상적인 언어
- 데이터베이스 프로그래밍
- 파이썬은
- 사이베이스(Sybase),
- 인포믹스(Infomix),
- 오라클(Oracle),
- 마이에스큐엘(MySQL),
- 포스트그레스큐엘(PostgreSQL) 등의 데이터베이스에 접근하기 위한 도구 제공
- 위의 굵직한 DB를 직접 사용하는 것 말고도 파이썬에 피클(pickle)이라는 모듈 존재 => 파이썬에서 사용하는 자료를 변형 없이 파일에 저장하거나 불러오는 일 수행
- 파이썬은
- 시스템 유틸리티 제작
- 파이썬은 운영체제(윈도우, 리눅스 등)의 시스템 명령어를 사용할 수 있는 도구를 갖추고 있음
- 파일 관리, 로그 분석, 시스템 모니터링 등 여러 가지 시스템 등을 유틸리티를 만드는 데 유라함
- 실제로 시스템에서 사용 중인 서로 다른 유틸리티성 프로그램을 하나로 합쳐 보다 유용한 프로그램 만들 수 있음
- GUI 프로그래밍
- GUI(graphic user interface) 프로그래밍: 윈도우에 창을 만들고 그 창에 프로그램을 동작시킬 수 있는 메뉴나 버튼 등을 추가하는 것
- GUI 프로그래밍을 위한 도구들이 잘 갖춰져 있음 => 쉽게 만들 수 있음
- Tkinter(티케이인터) -> 5줄의 소스 코드로 윈도우 창을 뛰울 수 있음
- C/C++와 결합
- 파이썬은 접착(glue) 언어라고도 불림
- b/c 다른 언어와 결합해서 사용가능
- C/C++에서 만든 프로그램 <=> 파이썬에서 만든 프로그램
- 사물 인터넷
- 사물 인터넷(Intenet od things) 분야에서도 황용도 높음
- 라즈베이파이(Rasberry pi)는 리눅스 기반의 매우 작은 컴퓨터
- 홈시어터나 매우 작은 게임기 등 여러 재미있는 것들 만들 수 있음
- 라즈베리파이를 제어할 떄 파이썬 사용
- 라즈베리파이에 연결된 모터 작동, LED 불 켜기 등
- 라즈베이파이(Rasberry pi)는 리눅스 기반의 매우 작은 컴퓨터
- 사물 인터넷(Intenet od things) 분야에서도 황용도 높음
파이썬으로 할 수 없는 일
- 시스템과 밀접한 프로그래밍 영역
- 파이썬으로 리눅스와 같은 운영체제 또는 엄청난 횟수의 반복과 연산이 필요한 프로그램을 만드는 것이 어려움
- 매우 빠른 속도를 요구하는 프로그램 & 하드웨어를 직접 건드려야 하는 프로그램에는 부적합함
- 모바일 프로그래밍
- 파이썬은 구글이 애용하는 언어
- but 파이썬으로 안드로이드 네이티브 앱(android native app)을 개발하는 것은 어려움
- 아이폰 앱도 파이썬으로 개발할 수 없다
1-5 파이썬 기초 문법
- 사칙 연산
# 1 더하기(+) 2는 3
>>> 1 + 2
3
# 나눗셈(/)과 곱셈(*)
>>> 3 / 2.4
1.25
>>> 3 * 9
27
- 변수에 문자 대입하고 출력
-
- 파이썬은 대소문자 구별
-
>>> a = "Python"
>>> print(a)
Python
>>> a
'Python'
- 조건문 if
- 인터프리터 창에서 프롬프트(>>>) 자리에 대신 나타나는 '...'은 아직 입력 중인 문장이 끝나지 않았음을 의미
- if ___: 다음 문장은 [spaceabr] 4개 또는 [Tab]을 이용해 반드시 들여쓰기 한 후 print() 작성
- 반복문 for, while도 들여쓰기 필요
>>> a = 3
>>> if a > 1:
... print("a는 1보다 큽니다.")
a는 1보다 큽니다.
- 반복문 for
- [1,2,3] 리스트의 앞에서부터 하나씩 꺼내 a 변수에 대입한 후 print(a)를 수행
>>> for a in [ 1, 2, 3 ]:
... print(a)
1
2
3
- 반복문 while
- 일정한 조건이 만족하는 동안 문장을 반복해서 수행
- i 값이 3보다 작은 동안 i=i+1과 print(i)를 수행
- i 값이 3보다 커지면 while 문을 빠져나간다
>>> i = 0
>>> while i < 3
... i = i + 1
... print(i)
1
2
3
- 함수
- def는 파이썬에서 함수를 정의할 때 사용하는 예약어
- return(리턴)은 함수에서 값을 반환할 때 사용
>>> def add(a, b):
... return a+b
...
>>> add(3, 4)
7
1-6 파이썬과 에디터
- 여러 줄쩌리 주석을 작성하는 방법:
- 큰따옴표 3개를 연속으로 사용한 사이에 작성
- 작은따옴표 3개를 사용해도 된다
- 한 줄짜리 주석을 사용하는 방법:
- #를 사용한다
"""
이름: 홍길동
생년월일: 15691103
이 프로그램은 ....... 개발 중이다.
"""
#홍길동은 1569년 11월 3일에 태어났다.
2장 파이선 프로그래밍의 기초, 자료형
- 자료형:
- 프로그래밍을 할 때 스이는 숫자, 문자열 등과 같이 자료 형태로 사용하는 모든 것을 뜻한다
- 프로그램의 기본이자 핵심 단위
2-1 숫자형
- 숫자형(Number): 숫자 형태로 이루어진 자료형
항목 | 파이썬 사용 예 |
정수 | 123, -345, 0 |
실수 | 123.34, -1234.5, 3.4e10 |
8진수 | 0o34, 0o25 |
16진수 | 0x2A, 0xFF |
- 숫자형은 어떻게 만들고 사용할까?
- 정수형(integer)
- 양의 정수, 음의 정수, 숫자 0
-
>>> a = 123 >>> a = -178 >>> a = 0
- 실수형(floating-point)
- 소수점이 포함된 숫자
-
>>> a = 1.3 >>> a = -3.45
-
- 컴퓨터식 지수 표현 방식
-
>>> a = -4.24E10 # 4.24*(10**10) >>> a = 4.24e-10 # 4.24*(10**-10)
-
- 소수점이 포함된 숫자
- 8진수와 16진수
- 8진수(octal)
- 숫자가 0o 또는 0O(숫자 0 + 알파벳 소문자 o 또는 대문자 O)로 시작
-
>>> a = 0o177 >> print(a) 127
- 16진수(hexadecimal)
- 0x로 시작
-
>>> a = 0x8ff >>> b = 0xABC # 10*(16**2) + 11*(16**1) + 12 = 2748 # A: 10, B: 11, C: 12 >>> print(b) 2748
- 8진수(octal)
- 정수형(integer)
- 숫자형을 활용하기 위한 연산자
- 사칙 연산
- +, -, *, /
-
>>> a = 3 >>> b = 4 >>> a + b 7 >>> a - b -1 >>> a * b 12 >>> a /b 0.75
- x의 y제곱을 나타내는 **연산자
- x**y => x의 y제곱
-
>>> a = 3 >>> b = 4 >>> a ** b 81
- 나눗셈 후 나머지를 리턴하는 %연산자
- 나눗셈의 나머지 값을 리턴하는 연산자
-
>>> 7 % 3 1 >>> 3 % 7 3
- 나눗셈 후 몫을 리턴하는 //연산자
-
>>> 7 / 4 1.75 >>> 7 // 4 1
-
- 사칙 연산
2-2 문자열 자료형
- 문자열(string)이란 문자, 단어 등으로 구성된 문자들의 집합
-
"Life is too short, You need Python blyat" "a" "123"
- 따옴표로 둘러싸여 있으면 모두 문자열이다
1. 문자열은 어떻게 만들고 사용할까?
- 큰따옴표로 양쪽 둘러싸기
- 작은따옴표로 양쪽 둘러싸기
- 큰다옴표 3개를 연속으로 써서 양쪽 둘러싸기
- 작은따옴표 3개를 연속으로 써서 양쪽 둘러써기
"Hello World"
'Python is fun'
"""Life is too short"""
'''You need Python'''
2. 문자열 안에 작은따옴표나 큰따옴표를 포함시키고 싶을 때
- 문자열에 작은따옴표 포함하기
- 문자열에 큰다옴표 포함하기
- 역슬래시를 사용해서 작은따옴표와 큰따옴표를 문자열에 포함하기
>>> food = "Python's favoriite food is perl"
>>> food
"Python's favoriite food is perl"
#구문 오류(SyntaxError) 예시
#'Python'이 문자열로 인식됨
>>> food = 'Python's favorite food is perl'
File "<stdin>", line 1
food = 'Python's favorite food is perl'
^
SyntaxError: invalid syntax
----------------------------------------------------------------
>>> say = '"Python is very easy." he says.'
>>> print(say)
"Python is very easy." he says.
----------------------------------------------------------------
>>> food = 'Python\'s favorite food is perl' # \'
>>> say = "\"Python is very easy.\" he says." # \"
3. 여러 줄인 문자열을 변수에 대입하고 싶을 때
- 줄을 바꾸기 위한 이스케이프 코드(\n) 삽입하기
- 연속된 작은따옴표 3개 또는 큰따옴표 3개 사용하기
>>> multiline = "Life is too short/nYou need Python"
---------------------------------------------------------
>>> multiline='''
... Life is too short
... You need python
... '''
>>> multiline="""
... Life is too short
... You need python
... """
>>> print(multiline)
Life is too short
You need python
- 이스케이프(escape) 코드:
- 프로그래밍할 때 사용할 수 있도록 미리 정의해 둔 '문자 조합'
코드 | 설명 |
\n | 문자열 안에서 줄을 바꿀 때 사용 |
\t | 문자열 사이에 탭 간격을 줄 때 사용 |
\\ | \를 그대로 표현할 때 사용 |
\' | 작은따옴표(')를 그대로 사용 |
\" | 큰따옴표(")를 그대로 사용 |
\r | 캐리지 리턴(줄 바꿈 눈자, 커서를 현재 줄의 가장 앞으로 이동) |
\f | 폼 피드(줄 바꿈 문자, 커서를 현재 줄의 다음 줄로 이동) |
\a | 벨 소리(출력할 때 PC 스피커에서 '삑' 소리가 난다 |
\b | 백 스페이스 |
\000 | 널 문자 |
4. 문자열 연산하기
- 문자열 더하기, 곱하기 가능 - 다른 언어에서는 쉽게 찾기 힘듦
- 문자열 더해서 연결
>>> head = "Python" >>> tail = " is fun!" >>> head + tail 'Python is fun!'
- 문자열 곱하기
-
>>> a = "python" >>> a * 2 'pythonpython'
-
- 곱하기 응용
-
# multistring.py print("=" * 50) print("My Program") print("=" * 50)
-
C:\ericb312>cd D:\doit C:\doit>python multistring.py ================================================== My Program ==================================================
-
5. 문자열 길이 구하기
- len함수: 파이썬 기본 내장 함수
-
>>> a = "Life is too short" >>> len(a) 17
6. 문자열 인덱싱과 슬라이싱
- 인덱싱(indexing): (무엇인가) 가리킨다
-
>>> a = "Life is too short, You need Python" >>> a[3] 'e' >>> a[0] 'L' >>> a[-0] 'L' >>> a[-1] 'n' >>> a[-2] 'o' >>> a[-5] 'y'
-
L i f e i s t o o s h o r t , Y o u n e e d P y t h o n 0 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 26 27 28 29 30 31 32 33 - 파이썬은 0부터 숫자를 셈
- a[-1]: 뒤에서부터 셈
- a[0], a[-0]은 똑같은 것
-
- 슬라이싱(slicing): (무엇인가) 잘라 낸다
-
>>> a[0:5] 'Life ' >>> a[0:2] 'Li' >>> a[5:7] 'is' >>> a[12:17] 'short' >>> a[19:] 'You need Python' >>> a[:17] 'Life is too short' >>> a[:] 'Life is too short, You need Python' >>> a[19:-7] 'You need
- a[시작_번호:끝_번호]
- 시작 번호부터 끝 번호 전까지
- 끝 번호 생략: 시작 번호부터 문자열의 끝까지
- 시작 번호 생략: 문자열의 처음부터 끝 번호까지
- 시작 번호 & 끝 번호 생략: 처음부터 끝까지
-
>>> a = "20230331Rainy" >>> date = a[:8] >>> weather = a[8:] >>> date '20230331' >>> weather 'Rainy' >>> a = "20230331Rainy" >>> year = a[:4] >>> day = a[4:8] >>> weather = a[8:] >>> year '2023' >>> day '0331' >>> weather 'Rainy'
-
- 문자열 Pithon을 Python으로 바꿔보자
-
# 문자열에 대입하면 안 됨 >>> a = "Pithon" >>> a[1] 'i' >>> a[1] = 'y' ======================== # 슬라이싱 기법 사용 >>> a = "Pithon" >>> a[:1] 'P' >>> a[2:] 'thon' >>> a[:1] + 'y' + a[2:] 'Python'
- 문자열의 요소값은 바꿀 수 없다 => 문자열 aka 변경 불가능한(immutable) 자료형
-
7. 문자열 포매팅
- 문자열 포매팅: 문자열 안에 어떤 값을 삽입하는 방법
- 숫자 바로 대입
-
>>> "I eat %d apples." % 3 'I eat 3 apples.'
- 문자열 안에 숫자를 넣고 싶은 자리에 %d 문자 넣고 삽입할 숫자를 문자열 밖의 % 뒤에 써준다
- %d: 문자열 포맷 코드 => 숫자
-
- 문자열 바로 대입
-
>>> "I eat %s apples." % "five" 'I eat five apples.'
- 문자열 포맷 코드: %s => 문자열
- 문자열을 대입할 때는 반드시 큰따옴표나 작은따옴표 사용
-
- 숫자 값을 나타내는 변수 대입
-
>>> number = 3 >>> "I eat %d apples." % number 'I eat 3 apples.'
-
- 2개 이상의 값 넣기
-
>>> number = 10 >>> day = "three" >>> "I ate %d apples. so I was sick for %s days." % (number, day) 'I ate 10 apples. so I was sick for three days.'
- 2개 이상의 값을 넣으려면 마지막 % 다음 괄호 안에 쉼표(,)로 구분하여 각각의 값을 넣는다
-
8. 문자열 포맷 코드
코드 | 설명 |
%s | 문자열(string) |
%c | 문자 1개(character) |
%d | 정수(integer) |
%f | 부동소수(floating-point) |
%o | 8진수 |
%x | 16진수 |
%% | Literal % (문자 % wkcp) |
- %s 포맷 코드에는 어떤 형태의 값이든 넣을 수 있음
-
>>> "I have %s apples" % 3 'I have 3 apples' >>> "rate is %s" % 3.234 'rate is 3.234'
- 3 -> %d, %s
- 3.234 -> %f, %s
- 포매팅 연산자 %d를 사용하여 98%를 출력하고 싶다
-
>>> "Error is %d%." % 98 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: incomplete format #====================================== >>> "Error is %d%%." % 98 'Error is 98%.'
- 문자열 포맷 코드인 %d와 %가 같은 문자열 안에 존재하는 경우(법칙): %를 나타내려면 반드시 %%를 써야한다
- but 같은 문자열에 포매팅 연산자가 없으면 %는 홀로 쓰여도 상관없다
-
9. 포맷 코드와 숫자 함께 사용하기
- 포맷 코드를 숫자와 함께 사용하면 더 유용함
- 정렬과 공백
-
>>> "%10s" % "hi" ' hi'
-
h i -
>>> "%-10sjane." % 'hi' 'hi jane.'
-
h i j a n e
-
- 소수점 표현
-
# 3.42134234를 소수점 네 번째 자리까지만 나타낸다 >>> "%0.4f" % 3.42134234 '3.4213' >>> "%.4f" % 3.42134234 '3.4213' # 0생략 가능
- %0.4f에서 ‘.’는 소수점 포인트, 그 뒤의 숫자 4는 소수점 뒤에 나올 숫자의 개수
- 소수점 포인트 앞의 숫자는 문자열의 전체 길이를 의미: %0.4f에서 사용한 숫자 0은 길이에 상관하지 않겠다는 의미
-
>>> "%10.4f" % 3.42134234 ' 3.4213'
- 소수점 네 번째 자리까지만 표시하고 전체 길이가 10개인 문자열 공간에서 오른쪽으로 정렬
-
3 . 4 2 1 3
-
10. format 함수를 사용하 포매팅
- 문자열의 format함수를 사용 => 발전된 스타일 문자열 포맷 지정 가능
- 숫자 바로 대입
-
>>> "I eat {0} apples".format(3) 'I eat 3 apples'
- {0} => 3
-
- 문자열 바로 대입
-
>>> "I eat {0} apples".format("five") 'I eat five apples'
- {0} => five
-
- 숫자 값을 가진 변수로 대입
-
>>> number = 3 >>> "I eat {0} apples".format(number) 'I eat 3 apples
- {0} => number = 3
-
- 2개 이상의 값 넣기
-
>>> number = 10 >>> day = "three" >>> "I ate {0} apples. so I was sick for {1} days.".format(number, day) 'I ate 10 apples. so I was sick for three days.'
- {0}은 format 함수의 첫 번째 입력값; number
- {1}은 두 번째 입력값; day
-
- 이름으로 넣기
-
>>> "I ate {number} apples, so I was sick for {day} days.".format(number=10, day=3) 'I ate 10 apples, so I was sick for 3 days.'
- {0}, {1}과 같은 인덱스 항목 대신 더 편리한 {name} 형태를 사용하는 방법
- {name} 형태를 사용할 떄: 반드시 name=value 같은 형태의 입력값 있어야 함
-
- 인덱스와 이름을 혼용해서 넣기
-
>>> "I ate {0} apples. so I was sick for {day} days.".format(10, day=3) 'I ate 10 apples. so I was sick for 3 days.'
-
- 왼쪽 정렬
-
>>> "{0:<10}".format("hi") 'hi '
- :<10 표현식을 사용하면 치환되는 문자열을 왼쪽으로 정렬하고 문자열의 총 자릿수를 10으로 맞춤
-
- 오른쪽 정렬
-
>>> "{0:>10}".format("hi") ' hi'
- 오른쪽 정렬은 :< 대신 :>을 사용 -> 화살표의 방향을 생각
-
- 가운데 정렬
-
>>> "{0:^10}".format("hi") ' hi '
- :^를 사용하면 가운데 정렬
-
- 공백 채우기
-
>>> "{0:=^10}".format("hi") '====hi====' >>> "{0:!<10}".format("hi") 'hi!!!!!!!!'
- 정렬할 때 공백 문자 대신 지정한 문자 값으로 채워 넣음
- 채워 넣을 문자 값은 정렬 문자 <, >, ^ 바로 앞에 넣어야 함
-
- 소수점 표현
-
>>> y = 3.42134234 >>> "{0:0.4f}".format(y) '3.4213'
- format 함수를 사용해 소수점을 4자리까지만 표현
-
>>> "{0:10.4f}".format(y) ' 3.4213'
- 자릿수를 10으로 맞춤
-
- {또는} 문자 표현
-
>>> "{{ and }}".format() '{ and }'
- format 함수를 사용해 문자열을 포매팅할 경우, {}와 같은 중괄호 문자를 포매팅 문자가 아닌 문자 그대로 사용하고 싶은 경우에는 위 예의 {{}}처럼 2개를 연속해서 사용
-
11. f 문자열 포매팅
- 문자열 앞에 f 접두사를 붙이면 f 문자열 포매팅 기능 사용 가능
-
>>> name = '홍길동' >>> age = 30 >>> f'나의 이름은 {name}입니다. 나이는 {age}입니다.' '나의 이름은 홍길동입니다. 나이는 30입니다.'
- f 문자열 포매팅은 위와 같이 name, age와 같은 변숫값을 생성한 후에 그 값을 참조
- f 문자열 포매팅은 표현식 지원
- 표현식: 중괄호 안의 변수를 계산식과 함께 사용하는 것
-
>>> age = 30 >>> f'나는 내년이면 {age + 1}살이 된다.' '나는 내년이면 31살이 된다.'
- f 문자열 포매팅에서의 딕셔너리
- 딕셔너리: Key와 Value라는 것을 한 쌍으로 가지는 자료형
-
>>> d = {'name':'홍길동', 'age':30} >>> f'나의 이름은 {d["name"]}입니다. 나이는 {d["age"]}입니다.' '나의 이름은 홍길동입니다. 나이는 30입니다.'
- 정렬
-
>>> f'{"hi":<10}' # 왼쪽 정렬 'hi ' >>> f'{"hi":>10}' # 오른쪽 정렬 ' hi' >>> f'{"hi":^10}' # 가운데 정렬 ' hi '
-
- 공백 채우기
-
>>> f'{"hi":=^10}' # 가운데 정렬하고 '=' 문자로 공백 채우기 '====hi====' >>> f'{"hi":!<10}' # 왼쪽 정렬하고 '!' 문자로 공백 채우기 'hi!!!!!!!!'
-
- 소수점
-
>>> y = 3.42134234 >>> f'{y:0.4f}' # 소수점 4자리까지만 표현 '3.4213' >>> f'{y:10.4f}' # 소수점 4자리까지 표현하고 총 자리수를 10으로 맞춤 ' 3.4213'
-
- f 문자열에서 {}를 문자 그대로 표시
- 2개를 동시에 사용
-
>>> f'{{ and }}' '{ and }'
12. 문자열 관련 함수들
- 문자열 자료형은 자체적으로 함수를 가지고 있음 => 문자열 내장 함수
- 내장 함수를 사용하려면 문자열 변수 이름 뒤에 ‘.’를 붙인 후 함수 이름을 써 줘야 함
- 문자 개수 세기 - count
-
>>> a = "hobby" >>> a.count('b') 2
-
- 위치 알려 주기 1 - find
-
>>> a = "Python is the best choice" >>> a.find('b') 14 >>> a.find('k') -1
- find 함수로 문자열 중 문자 b가 처음으로 나온 위치를 반환
- 찾는 문자나 문자열이 존재하지 않는다면 -1을 반환
- 위치 알려 주기 2 - index
-
>>> a = "Life is too short" >>> a.index('t') 8 ====================================== >>> a.index('k') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: substring not found
- index 함수로 문자열 중 문자 t가 맨 처음으로 나온 위치를 반환
- 찾는 문자나 문자열이 존재하지 않는다면 오류가 발생
-
- 문자열 삽입 - join
-
>>> ",".join('abcd') 'a,b,c,d'
- join 함수로 abcd 문자열의 각각의 문자 사이에 ‘,’를 삽입
- join 함수는 문자열뿐만 아니라 리스트나 튜플도 입력으로 사용할 수 있음
- join 함수의 입력으로 리스트를 사용
-
>>> ",".join(['a', 'b', 'c', 'd']) 'a,b,c,d'
-
- 소문자를 대문자로 바꾸기 - upper
-
>>> a = "hi" >>> a.upper() 'HI'
-
- 대문자를 소문자로 바꾸기 - lower
-
>>> a = "HI" >>> a.lower() 'hi'
-
- 왼쪽 공백 지우기 - lstrip
-
>>> a = " hi " >>> a.lstrip() 'hi '
- lstrip 함수는 문자열 중 가장 왼쪽에 있는 한 칸 이상의 연속된 공백들을 모두 지움
-
- 오른쪽 공백 지우기 - rstrip
-
>>> a= " hi " >>> a.rstrip() ' hi'
-
- 양쪽 공백 지우기 - strip
-
>>> a = " hi " >>> a.strip() 'hi'
-
- 문자열 바꾸기 - replace
-
>>> a = "Life is too short" >>> a.replace("Life", "Your leg") 'Your leg is too short'
- replace 함수는 replace(바뀔_문자열, 바꿀_문자열)처럼 사용
- 문자열 안의 특정한 값을 다른 값으로 치환
-
- 문자열 나누기 - split
-
>>> a = "Life is too short" >>> a.split() ['Life', 'is', 'too', 'short'] >>> b = "a:b:c:d" >>> b.split(':') ['a', 'b', 'c', 'd']
- split 함수는 a.split()처럼 괄호 안에 아무 값도 넣어 주지 않으면 공백([Space]], [Tab], [Enter])을 기준으로 문자열을 나누어 줌
- b.split(':')처럼 괄호 안에 특정 값이 있을 경우에는 괄호 안의 값을 구분자로 해서 문자열을 나누어 줌
-
- 함수 사용 시 주의점
-
>>> a = 'hi' >>> a.upper() 'HI' ------------- >>> a 'hi' ------------- >>> a = a.upper() >>> a 'HI'
- a.upper()를 실행하면 upper 함수는 a 변수의 값 자체를 변경하는 것이 아니라 대문자로 바꾼 값을 리턴
- 문자열은 자체의 값을 변경할 수 없는 immutable 자료형
- a 값을 'HI' 로 바꾸고 싶다면 대입문을 사용
- 문자열 관련 함수에는 이와 같은 규칙이 적용되어 문자열 자체의 값이 변경되는 것이 아니라 변경된 값을 리턴한다는 사실에 주의해야 함
-
2-3 리스트 자료형
1. 리스트는 어떻게 만들고 사용할까?
- 리스트명 = [요소1, 요소2, 요소3, ...]
-
>>> odd = [1, 3, 5, 7, 9] >>> a = [] >>> b = [1, 2, 3] >>> c = ['Life', 'is', 'too', 'short'] >>> d = [1, 2, 'Life', 'is'] >>> e = [1, 2, ['Life', 'is']]
- a: 아무것도 포함하지 않아 비어 있는 리스트([])
- b: 숫자를 요솟값
- c: 문자열을 요솟값
- d: 숫자와 문자열을 함께 요솟값
- e: 리스트 자체를 요솟값
- 즉, 리스트 안에는 어떠한 자료형도 포함할 수 있음
2. 리스트의 인덱싱과 슬라이싱
- 리스트의 인덱싱
>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> a[0]
1
>>> a[0] + a[2]
4
>>> a[-1]
3
# 리스트 a에 숫자 1, 2, 3과 또 다른 리스트인 ['a', 'b', 'c']를 포함
>>> a = [1, 2, 3, ['a', 'b', 'c']]
>>> a[0]
1
>>> a[-1]
['a', 'b', 'c']
>>> a[3]
['a', 'b', 'c']
# a[-1]이 ['a', 'b', 'c'] 리스트, 이 리스트에서 첫 번째 요소를 불러오기 위해 [0]을 붙여 준 것
>>> a[-1][0]
'a'
>>> a[-1][1]
'b'
>>> a[-1][2]
'c'
- 삼중 리스트에서 인덱싱
>>> a = [1, 2, ['a', 'b', ['Life', 'is']]]
# 리스트 a 안에 ['a', 'b', ['Life', 'is']] 리스트가 포함되어 있고 그 리스트 안에 다시 ['Life', 'is'] 리스트가 포함되어 있음
# 'Life' 문자열만 추출하려면
>>> a[2][2][0]
'Life'
# 리스트 a의 세 번째 요소인 리스트 ['a', 'b', ['Life', 'is']]에서 세 번째 요소인 리스트 ['Life', 'is']의 첫 번째 요소
- 리스트의 슬라이싱
# 리스트에서의 슬라이싱
>>> a = [1, 2, 3, 4, 5]
>>> a[0:2]
[1, 2]
# 문자열에서의 슬라이싱
>>> a = "12345"
>>> a[0:2]
'12'
# 동일함
========================
>>> a = [1, 2, 3, 4, 5]
>>> b = a[:2]
>>> c = a[2:]
>>> b
[1, 2]
>>> c
[3, 4, 5]
# b 변수는 리스트 a의 첫 번째 요소부터 두 번째 요소인 a[1]까지 나타내는 리스트 (a[2] 값인 3은 포함되지 않음)
# c 변수는 리스트 a의 세 번째 요소부터 끝까지 나타내는 리스트
- 중첩된 리스트에서 슬라이싱하기
>>> a = [1, 2, 3, ['a', 'b', 'c'], 4, 5]
>>> a[2:5]
[3, ['a', 'b', 'c'], 4]
>>> a[3][:2]
['a', 'b']
# a[3]은 ['a', 'b', 'c']
# a[3][:2]는 ['a', 'b', 'c']의 첫 번째 요소부터 세 번째 요소 직전까지의 값, 즉 ['a', 'b']
3. 리스트 연산하기
- 리스트 역시 +를 사용해서 더할 수 있음
- 리스트 더하기(+)
- 리스트 사이에서 +는 2개의 리스트를 합치는 기능
-
>>> a = [1, 2, 3] >>> b = [4, 5, 6] >>> a + b [1, 2, 3, 4, 5, 6]
- 문자열에서 "abc" + "def" = "abcdef"가 되는 것과 같은 이치
- 리스트 반복하기
-
>>> a = [1, 2, 3] >>> a * 3 [1, 2, 3, 1, 2, 3, 1, 2, 3]
- 문자열에서 "abc" * 3 = "abcabcabc" 가 되는 것과 같은 이치
-
- 리스트 길이 구하기
-
>>> a = [1, 2, 3] >>> len(a) 3
- len은 문자열, 리스트 외에 앞으로 배울 튜플과 딕셔너리에도 사용할 수 있는 함수
-
- 리스트 연산 오류
-
>>> a = [1, 2, 3] >>> a[2] + "hi" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'str' =============================================================== >>> str(a[2]) + "hi" 3hi
- a[2]에 저장된 값은 3이라는 정수인데 "hi"는 문자열
- 정수와 문자열은 당연히 서로 더할 수 없음 => 오류
- 만약 숫자와 문자열을 더해서 '3hi'를 만들고 싶다면 다음처럼 숫자 3을 문자 '3'으로 바꾸어야 함
- str은 정수나 실수를 문자열로 바꾸어 주는 파이썬의 내장 함수
-
4. 리스트의 수정과 삭제
- 리스트의 값 수정하기
-
>>> a = [1, 2, 3] >>> a[2] = 4 >>> a [1, 2, 4]
-
- del 함수를 사용해 리스트 요소 삭제하기
-
>>> a = [1, 2, 3] >>> del a[1] >>> a [1, 3]
- del a[x]는 x번째 요솟값을 삭제
- del 함수는 파이썬이 자체적으로 가지고 있는 삭제 함수이며 다음과 같이 사용
- =============================================================
-
>>> a = [1, 2, 3, 4, 5] >>> del a[2:] >>> a [1, 2]
- 슬라이싱 기법을 사용하여 리스트의 요소 여러 개를 한꺼번에 삭제할 수 있음
- 리스트의 요소를 삭제하는 방법 2가지가 더 있음: 리스트의 remove와 pop 함수
-
5. 리스트 관련 함수
- 문자열과 마찬가지로 리스트 변수 이름 뒤에 ‘.’를 붙여 여러 가지 리스트 관련 함수를 사용
- 리스트에 요소 추가하기 - append
- append: 덧붙이다, 첨부하다
- append(x)는 리스트의 맨 마지막에 x를 추가하는 함수
-
>>> a = [1, 2, 3] >>> a.append(4) >>> a [1, 2, 3, 4]
- 리스트 안에는 어떤 자료형도 추가 가능
-
# 리스트에 다시 리스트를 추가 >>> a.append([5, 6]) >>> a [1, 2, 3, 4, [5, 6]]
- 리스트 정렬 - sort
- sort 함수는 리스트의 요소를 순서대로 정렬
-
>>> a = [1, 4, 3, 2] >>> a.sort() >>> a [1, 2, 3, 4]
-
# 문자도 알파벳 순서로 정렬 가능 >>> a = ['a', 'c', 'b'] >>> a.sort() >>> a ['a', 'b', 'c']
- 리스트 뒤집기 - reverse
- reverse 함수는 리스트를 역순으로 뒤집어 줌
- 리스트 요소들을 순서대로 정렬한 다음 다시 역순으로 정렬하는 것이 아니라 현재의 리스트를 그대로 거꾸로 뒤집는다
-
>>> a = ['a', 'c', 'b'] >>> a.reverse() >>> a ['b', 'c', 'a']
- 인덱스 반환 - index
- index(x) 함수는 리스트에 x 값이 있으면 x의 인덱스 값(위칫값)을 리턴
-
>>> a = [1, 2, 3] >>> a.index(3) 2 # 리스트 a에 있는 숫자 3의 위치는 a[2]이므로 2 리턴 >>> a.index(1) 0 # 숫자 1의 위치는 a[0]이므로 0 리턴
- 리스트에 존재하지 않는 값이면 오류 발생
- 리스트에 요소 삽입 - insert
- insert(a, b)는 리스트의 a번째 위치에 b를 삽입하는 함수
-
# 0번째 자리, 즉 첫 번째 요소인 a[0] 위치에 값 4를 삽입 >>> a = [1, 2, 3] >>> a.insert(0, 4) >>> a [4, 1, 2, 3] # 리스트 a의 a[3], 즉 네 번째 요소 위치에 값 5를 삽입 >>> a.insert(3, 5) >>> a [4, 1, 2, 5, 3]
- 리스트 요소 제거 - remove
- remove(x)는 리스트에서 첫 번째로 나오는 x를 삭제하는 함수
-
>>> a = [1, 2, 3, 1, 2, 3] >>> a.remove(3) >>> a [1, 2, 1, 2, 3] # a가 3이라는 값을 2개 가지고 있을 경우, 첫 번째 3만 제거됨 >>> a.remove(3) >>> a [1, 2, 1, 2]
- 리스트 요소 끄집어 내기 - pop
- pop()은 리스트의 맨 마지막 요소를 리턴하고 그 요소는 삭제
- pop(x) => 리스트의 x 인덱스에 있는 요소를 리턴하고 그 요소 삭제
-
# a.pop(1)은 a[1]의 값을 끄집어 내어 리턴 >>> a = [1, 2, 3] >>> a.pop(1) 2 >>> a [1, 3]
- 리스트에 포함된 요소 x의 개수 세기 - count
- count(x)는 리스트 안에 x가 몇 개 있는지 조사하여 그 개수를 리턴하는 함수
-
# 1이라는 값이 리스트 a에 2개 들어 있으므로 2를 리턴 >>> a = [1, 2, 3, 1] >>> a.count(1) 2
- 리스트 확장 - extend
- extend(x)에서 x에는 리스트만 올 수 있으며 원래의 a 리스트에 x 리스트를 더함
-
>>> a = [1, 2, 3] >>> a.extend([4, 5]) >>> a [1, 2, 3, 4, 5] >>> b = [6, 7] >>> a.extend(b) >>> a [1, 2, 3, 4, 5, 6, 7]
- a.extend([4, 5])는 a += [4, 5]와 동일
- a += [4, 5]는 a = a + [4, 5]와 동일한 표현식
2-4 튜플은 어떻게 만들까?
t1 = ()
t2 = (1,)
t3 = (1, 2, 3)
t4 = 1, 2, 3
t5 = ('a', 'b', ('ab', 'cd'))
- 모습은 리스트와 거의 비슷하지만, 튜플에서는 리스트와 다른 2가지 차이점
- t2 = (1,)처럼 단지 1개의 요소만을 가질 때는 요소 뒤에 쉼표(,)를 반드시 붙여야 함
- t4 = 1, 2, 3처럼 소괄호(())를 생략해도 됨
- 튜플과 리스트는 비슷한 역할 but 프로그래밍을 할 때 튜플과 리스트는 구별해서 사용하는 것이 유리
- 튜플과 리스트의 가장 큰 차이는 요솟값을 변화시킬 수 있는지의 여부
- 즉, 리스트의 요솟값은 변화가 가능하고 튜플의 요솟값은 변화가 불가능
- 따라서 프로그램이 실행되는 동안 요솟값이 항상 변하지 않기를 바란다거나 값이 바뀔까 걱정하고 싶지 않다면 주저하지 말고 튜플을 사용
- 이와 반대로 수시로 그 값을 변화시켜야할 경우라면 리스트를 사용
- 실제 프로그램에서는 값이 변경되는 형태의 변수가 훨씬 많기 때문에 평균적으로 튜플보다 리스트를 더 많이 사용
1. 튜플의 요솟값을 지우거나 변경하려고 하면 어떻게 될까?
- 튜플의 요솟값은 한 번 정하면 지우거나 변경할 수 없음
- 튜플 요소값을 삭제하려고 할 때
- 튜플의 요소를 리스트처럼 del 함수로 지우려고 한 예 => 오류
-
>>> t1 = (1, 2, 'a', 'b') >>> del t1[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object doesn't support item deletion
- 튜플 요솟값을 변경하려고 할 때
- 오류
-
>>> t1 = (1, 2, 'a', 'b') >>> t1[0] = 'c' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
2. 튜플 다루기
- 튜플은 요솟값을 변화시킬 수 없다는 점만 제외하면 리스트와 완전히 동일
- 인덱싱
-
>>> t1 = (1, 2, 'a', 'b') >>> t1[0] 1 >>> t1[3] 'b'
-
- 슬라이싱
-
>>> t1 = (1, 2, 'a', 'b') >>> t1[1:] (2, 'a', 'b')
-
- 튜플 더하기
- t1, t2 튜플의 요솟값이 바뀌는 것 아님 => t1, t2 튜플을 더하여 새로운 튜플 t3를 생성
-
>>> t1 = (1, 2, 'a', 'b') >>> t2 = (3, 4) >>> t3 = t1 + t2 >>> t3 (1, 2, 'a', 'b', 3, 4)
- 튜플 곱하기
-
>>> t2 = (3, 4) >>> t3 = t2 * 3 >>> t3 (3, 4, 3, 4, 3, 4)
-
- 튜플 길이 구하기
-
>>> t1 = (1, 2, 'a', 'b') >>> len(t1) 4
-
- 튜플은 요솟값을 변경할수 없기 때문에 sort, insert, remove, pop과 같은 내장 함수가 없다
2-5 딕셔너리 자료형
- "이름" = "홍길동", "생일" = "몇 월 며칠"
- 파이썬은 대응 관계를 나타낼 수 있는 딕셔너리(dictionary) 자료형을 가지고 있음
- 딕셔너리 aka 연관 배열(associative array), 해시(hash)
1. 딕셔너리란?
- 딕셔너리: 사전
- "people" => "사람", "baseball" => "야구"
- Key => Value
- 딕셔너리는 튜플처럼 순차적(sequential)으로 해당 요솟값을 구하지 않고 Key를 통해 Value를 얻는다
- baseball이라는 단어의 뜻을 찾기 위해 사전의 내용을 순차적으로 모두 검색하는 것이 아니라 baseball이라는 단어가 있는 곳만 펼쳐 보는 것
2. 딕셔너리는 어떻게 만들까?
-
>>> dic = {'name' : 'pey', 'phone' : '010-9999-1234', 'birth' : '1118' }
- Key, 'name', 'phone', 'birth'
- Value: 'pey', '010-9999-1234', '1118'
key | vlaue |
name | pey |
phone | 010-9999-1234 |
birth | 1118 |
-
# Key로 정숫값 1, Value로 문자열 'hi' >>> a = {1: 'hi'}
-
# Value에 리스트도 넣을 수 있음 >>> a = {'a': [1, 2, 3]}
2. 딕셔너리 쌍 추가, 삭제하기
- 딕셔너리 쌍 추가하기
-
# 딕셔너리 a에 Key와 Value가 각각 2와 'b'인 {2: 'b'} 딕셔너리 쌍이 추가 >>> a = {1: 'a'} >>> a[2] = 'b' >>> a {1: 'a', 2: 'b'} ======================= >>> a['name'] = 'pey' >>> a {1: 'a', 2: 'b', 'name': 'pey'} ================================ >>> a[3] = [1, 2, 3] >>> a {1: 'a', 2: 'b', 'name': 'pey', 3: [1, 2, 3]} ============================================== >>> a[-1] = 'x' {1: 'a', 2: 'b', 'name': 'pey', 3: [1, 2, 3], -1: 'x'}
-
- 딕셔너리 요소 삭제하기
-
>>> del a[1] >>> a {2: 'b', 'name': 'pey', 3: [1, 2, 3], -1: 'x'}
-
3. 딕셔너리를 사용하는 방법
- 예) 4명의 사람의 특기를 표현할 수 있는 방법
-
# 사람 이름과 특기를 한 쌍으로 묶은 딕셔너리 {"김연아": "피겨스케이팅", "류현진": "야구", "손흥민": "축구", "귀도": "파이썬"}
-
- 딕셔너리에서 Key를 사용해 Value 얻기
- 리스트나 튜플, 문자열은 요솟값을 얻고자 할 때 인덱싱이나 슬라이싱 기법 중 하나를 사용
- 딕셔너리는 단 1가지 방법: Key를 사용해서 Value를 구하는 방법
- Key의 Value를 얻기 위해서는 '딕셔너리_변수_이름[Key]'를 사용
-
>>> grade = {'pey': 10, 'julliet': 99} # 'pey'라는 Key의 Value를 얻기 위해 grade['pey']를 사용 >>> grade['pey'] 10 >>> grade['julliet'] 99
-
>>> a = {1:'a', 2:'b'} >>> a[1] 'a' >>> a[2] 'b' ========================= >>> dic = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'} >>> dic['name'] 'pey' >>> dic['phone'] '010-9999-1234' >>> dic['birth'] '1118'
- 딕셔러니 만들 때 주의할 사항
- 딕셔너리에서 Key는 고유한 값: 중복되는 Key 값을 설정해 놓으면 하나를 제외한 나머지 것들이 모두 무시됨
- 딕셔너리에는 동일한 Key가 중복으로 존재할 수 없음
-
>>> a = {1:'a', 1:'b'} >>> a {1: 'b'}
- Key에 리스트는 쓸 수 없다; 리스트는 그 값이 변할 수 있기 때문에 Key로 쓸 수 없다
- 하지만 튜플은 Key로 쓸 수 있다
- 딕셔너리의 Key로 쓸 수 있느냐, 없느냐는 Key가 변하는(mutable) 값인지, 변하지 않는(immutable) 값인지에 달려 있다
-
# 리스트를 Key로 설정 => 리스트를 키 값으로 사용할 수 없다는 오류 >>> a = {[1,2] : 'hi'} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' # 딕셔너리 = 해시(hash)
- Value에는 변하는 값이든, 변하지 않는 값이든 아무 값이나 넣을 수 있다
4. 딕셔너리 관련 함수
- Key 리스트 만들기 = keys
-
# a.keys()는 딕셔너리 a의 Key만을 모아 dict_keys 객체를 리턴 >>> a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'} >>> a.keys() dict_keys(['name', 'phone', 'birth']) # 리턴값으로 리스트가 필요한 경우 >>> list(a.keys()) ['name', 'phone', 'birth']
- 리스트 고유의 append, insert, pop, remove, sort 함수는 수행할 수 없음
-
>>> for k in a.keys(): >>> print(k) ... name phone birth
-
- Value 리스트 만들기 - values
-
# values 함수를 호출하면 dict_values 객체를 리턴 >>> a.values() dict_values(['pey', '010-9999-1234', '1118'])
-
- Key, Value 쌍 얻기 - items
-
# items 함수는 Key와 Value의 쌍을 튜플로 묶은 값을 dict_items 객체로 리턴 >>> a.items() dict_items([('name', 'pey'), ('phone', '010-9999-1234'), ('birth', '1118')])
-
- Key: Value 쌍 모두 지우기 - clear
-
# clear 함수는 딕셔너리 안의 모든 요소를 삭제 # 빈 리스트를 [], 빈 튜플을 ()로 표현하는 것과 마찬가지로 빈 딕셔너리도 {}로 표현 >>> a.clear() >>> a {}
-
- Key로 Value 얻기 - get
-
# get(x) 함수는 x라는 Key에 대응되는 Value를 리턴 # a.get('name')은 a['name']을 사용했을 때와 동일한 결괏값을 리턴 >>> a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'} >>> a.get('name') 'pey' >>> a.get('phone') '010-9999-1234'
- 차이점: a['nokey']처럼 딕셔너리에 존재하지 않는 키로 값을 가져오려고 할 경우
- a['nokey'] 방식은 오류를 발생
- a.get('nokey') 방식은 None을 리턴
-
>>> a = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'} >>> print(a.get('nokey')) None ================================================= >>> print(a['nokey’]) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'nokey'
- 딕셔너리 안에 찾으려는 Key가 없을 경우, 미리 정해 둔 디폴트 값을 대신 가져오게 하고 싶을 때는 get(x, '디폴트 값')을 사용
- 그냥 '디폴트 값'을 출력한다
-
# 딕셔너리 a에는 'nokey'에 해당하는 Key가 없다 => 따라서 디폴트 값인 'foo'를 리턴 >>> a.get('nokey', 'foo') 'foo'
-
- 해당 Key가 딕셔너리 안에 있는지 조사하기 - in
-
>>> a = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'} >>> 'name' in a True # 'name' 문자열은 a 딕셔너리의 Key 중 하나이다. 따라서 'name' in a를 호출하면 참(True)을 리턴 >>> 'email' in a False # 'email'은 a 딕셔너리 안에 존재하지 않는 Key이므로 거짓(False)을 리턴
-
2-6 집합 자료형
- 집합(set)은 집합에 관련된 것을 쉽게 처리하기 위해 만든 자료형
1. 집합 자료형은 어떻게 만들까?
- set 키워드를 사용
-
# set()의 괄호 안에 리스트를 입력 >>> s1 = set([1, 2, 3]) >>> s1 {1, 2, 3} # 문자열을 입력 >>> s2 = set("Hello") >>> s2 {'e', 'H', 'l', 'o'} # 출력 순서가 이상하다 => 바로 밑에서 설명할 예정 # 비어 있는 집합 자료형 s = set()
2. 집합 자료형의 특징
- 그런데 위에서 살펴본 set("Hello")의 결과가 좀 이상하지 않은가?
분명 "Hello" 문자열로 set 자료형을 만들었는데
생성된 자료형에는 l 문자가 하나 빠져 있고
순서도 뒤죽박죽이다.
그 이유는 set에 다음과 같은 2가지 특징이 있기 때문이다.- 중복을 허용하지 않는다
- set은 데이터의 중복을 제거하기 위한 필터로 종종 사용된다
- 순서가 없다(Unordered)
- 중복을 허용하지 않는다
- 리스트나 튜플은 순서가 있기(ordered) 때문에 인덱싱을 통해 요솟값을 얻을 수 있지만, set 자료형은 딕셔너리와 같이 순서가 없기(unordered) 때문에 인덱싱을 통해 요솟값을 얻을 수 없다
- 만약 set 자료형에 저장된 값을 인덱싱으로 접근하려면 다음과 같이 리스트나 튜플로 변환한 후에 해야 한다.
-
>>> s1 = set([1, 2, 3]) >>> l1 = list(s1) >>> l1 [1, 2, 3] >>> l1[0] 1 >>> t1 = tuple(s1) >>> t1 (1, 2, 3) >>> t1[0] 1
-
3. 교집합, 합집합, 차집합 구하기
- set 자료형을 정말 유용하게 사용하는 경우는 교집합, 합집합, 차집합을 구할 때
>>> s1 = set([1, 2, 3, 4, 5, 6])
>>> s2 = set([4, 5, 6, 7, 8, 9])
- 교집합 구하기
- '&'를 사용
- intersection 함수 사용
-
>>> s1 & s2 {4, 5, 6} >>> s1.intersection(s2) {4, 5, 6} >>> s2.intersection(s1) {4, 5, 6}
- 합집합 구하기
- '|'를 사용
- union 함수 사용
-
>>> s1 | s2 {1, 2, 3, 4, 5, 6, 7, 8, 9} >>> s1.union(s2) # s2.union(s1) {1, 2, 3, 4, 5, 6, 7, 8, 9}
- 차집합 구하기
- -(빼기) 사용
- differnce 함수 사용
-
>>> s1 - s2 {1, 2, 3} >>> s2 - s1 {8, 9, 7} >>> s1.difference(s2) {1, 2, 3} >>> s2.difference(s1) {8, 9, 7}
4. 집합 자료형 관련 함수
- 값 1개 추가하기 - add
- 만들어진 set 자료형에 값 1개 추가
-
>>> s1 = set([1, 2, 3]) >>> s1.add(4) >>> s1 {1, 2, 3, 4}
- 값 여러 개 추가하기 - update
- 여러 개의 값을 한꺼번에 추가(update)
-
>>> s1 = set([1, 2, 3]) >>> s1.update([4, 5, 6]) >>> s1 {1, 2, 3, 4, 5, 6}
- 특정 값 제거하기 - remove
- remove(x)에서 x는 인덱스 번호가 아닌 제거하려는 set 안의 값
-
>>> s1 = set([1, 2, 3]) >>> s1.remove(2) >>> s1 {1, 3}
2-7 불 자료형
- 불(bool) 자료형: 참(Ture)과 거짓(False)을 나타냄
- True: 참을 의미
- False: 거짓을 의미
- True나 False는 파이썬의 예약어로, true, false와 같이 작성하면 안 되고 첫 문자를 항상 대문자로 작성해야 함
1. 불 자료형은 어떻게 사용할까?
- type(x)는 x의 자료형을 확인하는 파이썬의 내장 함수
-
>>> a = True >>> b = False >>> type(a) <class 'bool'> >>> type(b) <class 'bool'> >>> >>> 1 == 1 True >>> 2 < 1 False
2. 자료형의 참과 거짓
- 자료형의 참과 거짓을 구분하는 기준
값 | 참 or 거짓 |
"pyhon" | 참 |
"" | 거짓 |
[1, 2, 3] | 참 |
[] | 거짓 |
(1, 2, 3) | 참 |
() | 거짓 |
{'a': 1} | 참(딕셔너리) |
{} | 거짓 |
1 | 참 |
0 | 거짓 |
None | 거짓 |
- 문자열, 리스트, 튜플, 딕셔너리 등의 값이 비어있으면 거짓
- 숫자는 값이 0일 때 거짓
- None 또한 거짓
-
# a.pop() 함수는 리스트 a의 마지막 요소를 끄집어 내는 함수 # 리스트 안에 요소가 존재하는 한(a가 참인 동안) 마지막 요소를 계속 끄집어 냄 # 결국 a가 빈 리스트([])가 되어 거짓 >>> a = [1, 2, 3, 4] >>> while a: ... print(a.pop()) ... 4 3 2 1 >>> if [1, 2, 3]: ... print("참") ... else: ... print("거짓") ... 참
- a.pop() 함수는 리스트 a의 마지막 요소를 끄집어 내는 함수
3. 불 연산
# bool 함수를 사용하면 자료형의 참과 거짓을 보다 정확하게 식별 가능
>>> bool('python')
True
>>> bool('')
False
>>> bool([1, 2, 3])
True
>>> bool([])
False
>>> bool(0)
False
>>> bool(3)
True
2-8 자료형의 값을 저장하는 공간, 변수
1. 변수는 어떻게 만들까?
# a, b, c를 ‘변수’
>>> a = 1
>>> b = "python"
>>> c = [1, 2, 3]
# 변수를 만들 때, =(assignment) 기호 사용
- 다른 프로그래밍 언어인 C나 JAVA에서는 변수를 만들 때 자료형의 타입을 직접 지정해야 함
- 하지만 파이썬은 변수에 저장된 값을 스스로 판단하여 자료형의 타입을 지정하기 때문에 더 편리
2. 변수란?
'웹해킹' 카테고리의 다른 글
웹해킹 스터디 2: 도커 (0) | 2023.11.26 |
---|---|
웹해킹 스터디 3: 점프 투 플라스크 (0) | 2023.11.26 |
XSS(Cross Site Scripting)를 알아보자 (0) | 2023.08.08 |