> 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 파이썬의 특징

  1. 파이썬은 인간다운 언어 
    1. 프로그래밍: 인간이 생각하는 것을 컴퓨터에 지시하는 행위를 말한다
    2. 파이썬은 사람이 생각하는 방식을 그대로 표현할 수 있다
    3. 직관적
    4. if 4 in [1,2,3,4]: print("4가 있습니다")
      
      #만약 4가 1, 2, 3, 4 중에 있으면 "4가 있습니다"를 출력해라
  2. 문법 쉬움 => 빠르게 배움
    1. 자료형, 함수, 클래스 만드는 법, 라이브러리 및 내장 함수 사용 방법을 익히는데 일주일이면 충분하다 - Eric Raymond
  3. 무료 but 강력
    1. open source(오픈 소스) = 무료
    2. 만들고자 하는 대부분의 프로그램을 파이썬으로 만들 수 있다 
    3. 물론 시스템 프로그래밍이나 하드웨어 제어와 같은 매우 복잡하고 반복 연산이 많은 프로그램은 파이썬과 어울리지 않는다 
    4. 하지만 파이썬은 이러한 약점을 극복할 수 있도록 다른 언어로 만든 프로그램을 파이썬 프로그램에 포함시킬 수 있다
    5. 파이썬과 C는 찰떡궁합: 뼈대 => 파이썬 & 빠른 실행 속도 필요한 부분 => C
    6. 파이썬 라이브러리 중 C로 만든 것도 많다 => 속도가 빠르다
    7. 파이썬 라이브러리: 파이썬 프로그램을 작성할 때 불러와 사용할 수 있도록 미리 만들어 놓은 파이썬 파일의 모음
  4. 간결하다; simple as fuck boiii
    1. 다른 언어 like Perl(펄) => 100가지 방법으로 1가지 일을 처리 할 수 있음
    2. but 파이썬은 가장 좋은 방법 1가지만 사용하는 것을 선호 => 코드 이해 쉬움 => 공동 작업 & 유지 보수 편리 
    3. 단락을 구분하는 괄호({}) 없음
    4. but 파이썬은 줄을 잘 맞춰야 한다 => 안 맞추면 프로그램 실행 안 됨
  5. 프로그래밍을 즐기게 해 줌
  6. 개발 속도가 빠름

1-3 파이썬으로 무엇을 할 수 있을까?

파이썬으로 할 수 있는 일

  1. 웹 프로그래밍
    1. 구글 크롬이나 마이크로소프트 엣지와 갗은 웹 브라우저에 있는 게시판, 방명록 => 웹 프로그래밍
  2. 인공지능과 머신러닝
    1. 인공지능(Artificial Inteligence): 기계가 인간처럼 생각하고 행동할 수 있는 능력을 제공하는 기술
    2. 파이썬을 활용하여 저연어 처리, 음성 인식, 이미지 인식 등 인공지능 기술 구현 가능
    3. 머신러닝(Machine Learning): 인공지능의 한 분야; 경험을 통해 자동으로 발전하는 컴퓨터 알고리즘을 연구하는 분야
    4. 파이썬은 인공지능과 머신러닝 프로그래밍을 쉽게 할 수 있도록 사이킷런(scikit-learn), 텐서플로(Tensorflow), 파이토치(PyTorch), 케라스(Keras) 등 다양한 라이브러리 제공
  3. 수치 연산 프로그래밍
    1. in fact, 파이썬은 수치 연산 프로그래밍에 적합안 언어 아님
    2. 수치가 복잡하고 연산이 많다면 C와 같은 언어가 더 빠름
    3. but 파이싼은 넘파이(NumPy)라는 수치 모듈을 제공 => C로 작성된 모듈이기 때문에 파이썬에서도 빠른 수치 연산 수행 가능
  4. 데이터 분석
    1. 파이썬은 데이터 분석에 이상적인 언어
      1. 넘파이(NumPy)
      2. 판다스(Pandas)
      3. 맷플롯립(Matplotlib) 등 과 같은 라이브러리들을 활용하여 데이터 처리, 통계 분석, 시각화를 손쉽게 수행
    2. 기존에는 데이터 분석을 위해 R 많이 사용 but 판다스 등장 이후 파이썬 사용 추세 증가
  5. 데이터베이스 프로그래밍
    1. 파이썬은
      1. 사이베이스(Sybase),
      2. 인포믹스(Infomix),
      3. 오라클(Oracle),
      4. 마이에스큐엘(MySQL),
      5. 포스트그레스큐엘(PostgreSQL) 등의 데이터베이스에 접근하기 위한 도구 제공
    2. 위의 굵직한 DB를 직접 사용하는 것 말고도 파이썬에 피클(pickle)이라는 모듈 존재 => 파이썬에서 사용하는 자료를 변형 없이 파일에 저장하거나 불러오는 일 수행
  6. 시스템 유틸리티 제작
    1. 파이썬은 운영체제(윈도우, 리눅스 등)의 시스템 명령어를 사용할 수 있는 도구를 갖추고 있음
    2. 파일 관리, 로그 분석, 시스템 모니터링 등 여러 가지 시스템 등을   유틸리티를 만드는 데 유라함
    3. 실제로 시스템에서 사용 중인 서로 다른 유틸리티성 프로그램을 하나로 합쳐 보다 유용한 프로그램 만들 수 있음
  7. GUI 프로그래밍
    1. GUI(graphic user interface) 프로그래밍: 윈도우에 창을 만들고 그 창에 프로그램을 동작시킬 수 있는 메뉴나 버튼 등을 추가하는 것
    2. GUI 프로그래밍을 위한 도구들이 잘 갖춰져 있음 => 쉽게 만들 수 있음
      1. Tkinter(티케이인터) -> 5줄의 소스 코드로 윈도우 창을 뛰울 수 있음
  8. C/C++와 결합
    1. 파이썬은 접착(glue) 언어라고도 불림
    2. b/c 다른 언어와 결합해서 사용가능
    3. C/C++에서 만든 프로그램 <=> 파이썬에서 만든 프로그램
  9. 사물 인터넷
    1. 사물 인터넷(Intenet od things) 분야에서도 황용도 높음
      1. 라즈베이파이(Rasberry pi)는 리눅스 기반의 매우 작은 컴퓨터
        1. 홈시어터나 매우 작은 게임기 등 여러 재미있는 것들 만들 수 있음
        2. 라즈베리파이를 제어할 떄 파이썬 사용
          1. 라즈베리파이에 연결된 모터 작동, LED 불 켜기 등

파이썬으로 할 수 없는 일

 

  1. 시스템과 밀접한 프로그래밍 영역
    1. 파이썬으로 리눅스와 같은 운영체제 또는 엄청난 횟수의 반복과 연산이 필요한 프로그램을 만드는 것이 어려움
    2. 매우 빠른 속도를 요구하는 프로그램 & 하드웨어를 직접 건드려야 하는 프로그램에는 부적합함
  2. 모바일 프로그래밍
    1. 파이썬은 구글이 애용하는 언어
    2. but 파이썬으로 안드로이드 네이티브 앱(android native app)을 개발하는 것은 어려움
    3. 아이폰 앱도 파이썬으로 개발할 수 없다

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
  1. 숫자형은 어떻게 만들고 사용할까?
    1. 정수형(integer)
      1. 양의 정수, 음의 정수, 숫자 0
      2. >>> a = 123
        >>> a = -178
        >>> a = 0​
    2. 실수형(floating-point)
      1. 소수점이 포함된 숫자
        1. >>> a = 1.3
          >>> a = -3.45
      2. 컴퓨터식 지수 표현 방식
        1. >>> a = -4.24E10 # 4.24*(10**10)
          >>> a = 4.24e-10 # 4.24*(10**-10)
    3. 8진수와 16진수
      1. 8진수(octal)
        1. 숫자가 0o 또는 0O(숫자 0 + 알파벳 소문자 o 또는 대문자 O)로 시작
        2. >>> a = 0o177
          >> print(a)
          127
      2. 16진수(hexadecimal)
        1. 0x로 시작
        2. >>> a = 0x8ff
          >>> b = 0xABC 
          # 10*(16**2) + 11*(16**1) + 12 = 2748 
          # A: 10, B: 11,  C: 12
          >>> print(b)
          2748
  2. 숫자형을 활용하기 위한 연산자
    1. 사칙 연산
      1. +, -, *, /
      2. >>> a = 3
        >>> b = 4
        >>> a + b
        7
        >>> a - b
        -1
        >>> a * b
        12
        >>> a /b
        0.75
    2. x의 y제곱을 나타내는 **연산자
      1. x**y => x의 y제곱
      2. >>> a = 3
        >>> b = 4
        >>> a ** b
        81
    3. 나눗셈 후 나머지를 리턴하는 %연산자
      1. 나눗셈의 나머지 값을 리턴하는 연산자
      2. >>> 7 % 3
        1
        >>> 3 % 7
        3
    4. 나눗셈 후 몫을 리턴하는 //연산자
      1. >>> 7 / 4
        1.75
        >>> 7 // 4
        1

2-2 문자열 자료형

  • 문자열(string)이란 문자, 단어 등으로 구성된 문자들의 집합
  • "Life is too short, You need Python blyat"
    "a"
    "123"

  • 따옴표로 둘러싸여 있으면 모두 문자열이다

1. 문자열은 어떻게 만들고 사용할까?

  1. 큰따옴표로 양쪽 둘러싸기
  2. 작은따옴표로 양쪽 둘러싸기
  3. 큰다옴표 3개를 연속으로 써서 양쪽 둘러싸기
  4. 작은따옴표 3개를 연속으로 써서 양쪽 둘러써기
"Hello World"
'Python is fun'
"""Life is too short"""
'''You need Python'''

 

 

2.  문자열 안에 작은따옴표나 큰따옴표를 포함시키고 싶을 때

  1. 문자열에 작은따옴표 포함하기
  2. 문자열에 큰다옴표 포함하기
  3. 역슬래시를 사용해서 작은따옴표와 큰따옴표를 문자열에 포함하기
>>> 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. 여러 줄인 문자열을 변수에 대입하고 싶을 때

  1. 줄을 바꾸기 위한 이스케이프 코드(\n) 삽입하기
  2. 연속된 작은따옴표 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. 문자열 연산하기

  • 문자열 더하기, 곱하기 가능 - 다른 언어에서는 쉽게 찾기 힘듦
  1. 문자열 더해서 연결
    1.  
    2. >>> head = "Python" >>> tail = " is fun!" >>> head + tail 'Python is fun!'
  2. 문자열 곱하기
    1. >>> a = "python"
      >>> a * 2
      'pythonpython'


  3. 곱하기 응용
    1. # multistring.py
      
      print("=" * 50)
      print("My Program")
      print("=" * 50)
    2. 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. 문자열 포매팅

  • 문자열 포매팅: 문자열 안에 어떤 값을 삽입하는 방법
  1. 숫자 바로 대입
    1. >>> "I eat %d apples." % 3
      'I eat 3 apples.'
    2. 문자열 안에 숫자를 넣고 싶은 자리에 %d 문자 넣고 삽입할 숫자를 문자열 밖의 % 뒤에 써준다
    3. %d: 문자열 포맷 코드 => 숫자
  2. 문자열 바로 대입
    1. >>> "I eat %s apples." % "five"
      'I eat five apples.'
    2. 문자열 포맷 코드: %s => 문자열
    3. 문자열을 대입할 때는 반드시 큰따옴표나 작은따옴표 사용
  3. 숫자 값을 나타내는 변수 대입
    1. >>> number = 3
      >>> "I eat %d apples." % number
      'I eat 3 apples.'
  4. 2개 이상의 값 넣기
    1. >>> 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. 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. 포맷 코드와 숫자 함께 사용하기

  • 포맷 코드를 숫자와 함께 사용하면 더 유용함
  1. 정렬과 공백 
    1. >>> "%10s" % "hi"
      '        hi'
    2.                 i
    3. >>> "%-10sjane." % 'hi'
      'hi        jane.'
    4. h i         j a n e
  2. 소수점 표현
    1. # 3.42134234를 소수점 네 번째 자리까지만 나타낸다
      >>> "%0.4f" % 3.42134234
      '3.4213'
      >>> "%.4f" % 3.42134234
      '3.4213'
      # 0생략 가능
    2. %0.4f에서 ‘.’는 소수점 포인트, 그 뒤의 숫자 4는 소수점 뒤에 나올 숫자의 개수
    3. 소수점 포인트 앞의 숫자는 문자열의 전체 길이를 의미: %0.4f에서 사용한 숫자 0은 길이에 상관하지 않겠다는 의미
    4. >>> "%10.4f" % 3.42134234
      '    3.4213'
    5. 소수점 네 번째 자리까지만 표시하고 전체 길이가 10개인 문자열 공간에서 오른쪽으로 정렬
    6.         3 4 2 1 3

10. format 함수를 사용하 포매팅

  •  문자열의 format함수를 사용 => 발전된 스타일 문자열 포맷 지정 가능
  1. 숫자 바로 대입
    1. >>> "I eat {0} apples".format(3)
      'I eat 3 apples'
    2. {0} => 3
  2. 문자열 바로 대입
    1. >>> "I eat {0} apples".format("five")
      'I eat five apples'
    2. {0} => five
  3. 숫자 값을 가진 변수로 대입
    1. >>> number = 3
      >>> "I eat {0} apples".format(number)
      'I eat 3 apples
    2. {0} => number = 3
  4. 2개 이상의 값 넣기
    1. >>> 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.'
    2. {0}은 format 함수의 첫 번째 입력값; number
    3. {1}은 두 번째 입력값; day
  5. 이름으로 넣기
    1. >>> "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.'
    2. {0}, {1}과 같은 인덱스 항목 대신 더 편리한 {name} 형태를 사용하는 방법
    3. {name} 형태를 사용할 떄: 반드시 name=value 같은 형태의 입력값 있어야 함
  6. 인덱스와 이름을 혼용해서 넣기
    1. >>> "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.'
  7. 왼쪽 정렬
    1. >>> "{0:<10}".format("hi")
      'hi        '
    2. :<10 표현식을 사용하면 치환되는 문자열을 왼쪽으로 정렬하고 문자열의 총 자릿수를 10으로 맞춤
  8. 오른쪽 정렬
    1. >>> "{0:>10}".format("hi")
      '        hi'
    2. 오른쪽 정렬은 :< 대신 :>을 사용 -> 화살표의 방향을 생각
  9. 가운데 정렬
    1. >>> "{0:^10}".format("hi")
      '    hi    '
    2. :^를 사용하면 가운데 정렬
  10. 공백 채우기
    1. >>> "{0:=^10}".format("hi")
      '====hi===='
      >>> "{0:!<10}".format("hi")
      'hi!!!!!!!!'
    2. 정렬할 때 공백 문자 대신 지정한 문자 값으로 채워 넣음
    3. 채워 넣을 문자 값은 정렬 문자 <, >, ^ 바로 앞에 넣어야 함
  11. 소수점 표현
    1. >>> y = 3.42134234
      >>> "{0:0.4f}".format(y)
      '3.4213'
    2. format 함수를 사용해 소수점을 4자리까지만 표현
    3. >>> "{0:10.4f}".format(y)
      '    3.4213'
    4. 자릿수를 10으로 맞춤
  12. {또는} 문자 표현
    1. >>> "{{ and }}".format()
      '{ and }'
    2. 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. 리스트 연산하기 

  • 리스트 역시 +를 사용해서 더할 수 있음
  1. 리스트 더하기(+)
    1. 리스트 사이에서 +는 2개의 리스트를 합치는 기능
    2. >>> a = [1, 2, 3]
      >>> b = [4, 5, 6]
      >>> a + b
      [1, 2, 3, 4, 5, 6]
    3. 문자열에서 "abc" + "def" = "abcdef"가 되는 것과 같은 이치
  2. 리스트 반복하기
    1. >>> a = [1, 2, 3]
      >>> a * 3
      [1, 2, 3, 1, 2, 3, 1, 2, 3]
    2. 문자열에서 "abc" * 3 = "abcabcabc" 가 되는 것과 같은 이치
  3. 리스트 길이 구하기
    1. >>> a = [1, 2, 3]
      >>> len(a)
      3
    2. len은 문자열, 리스트 외에 앞으로 배울 튜플과 딕셔너리에도 사용할 수 있는 함수
  4. 리스트 연산 오류
    1. >>> 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
    2. a[2]에 저장된 값은 3이라는 정수인데 "hi"는 문자열
    3. 정수와 문자열은 당연히 서로 더할 수 없음 => 오류
    4. 만약 숫자와 문자열을 더해서 '3hi'를 만들고 싶다면 다음처럼 숫자 3을 문자 '3'으로 바꾸어야 함
    5. str은 정수나 실수를 문자열로 바꾸어 주는 파이썬의 내장 함수

4. 리스트의 수정과 삭제

 

  1. 리스트의 값 수정하기
    1. >>> a = [1, 2, 3]
      >>> a[2] = 4
      >>> a
      [1, 2, 4]
  2. del 함수를 사용해 리스트 요소 삭제하기
    1. >>> a = [1, 2, 3]
      >>> del a[1]
      >>> a
      [1, 3]
    2. del a[x]는 x번째 요솟값을 삭제
    3. del 함수는 파이썬이 자체적으로 가지고 있는 삭제 함수이며 다음과 같이 사용
    4. =============================================================
    5. >>> a = [1, 2, 3, 4, 5]
      >>> del a[2:]
      >>> a
      [1, 2]
    6. 슬라이싱 기법을 사용하여 리스트의 요소 여러 개를 한꺼번에 삭제할 수 있음
    7. 리스트의 요소를 삭제하는 방법 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. 튜플의 요솟값을 지우거나 변경하려고 하면 어떻게 될까?

  •  튜플의 요솟값은 한 번 정하면 지우거나 변경할 수 없음

 

  1. 튜플 요소값을 삭제하려고 할 때
    1. 튜플의 요소를 리스트처럼 del 함수로 지우려고 한 예 => 오류
    2. >>> 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
  2. 튜플 요솟값을 변경하려고 할 때
    1. 오류
    2. >>> 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. 튜플 다루기

  • 튜플은 요솟값을 변화시킬 수 없다는 점만 제외하면 리스트와 완전히 동일

 

  1. 인덱싱
    1. >>> t1 = (1, 2, 'a', 'b')
      >>> t1[0]
      1
      >>> t1[3]
      'b'
  2. 슬라이싱
    1. >>> t1 = (1, 2, 'a', 'b')
      >>> t1[1:]
      (2, 'a', 'b')
  3. 튜플 더하기
    1.  t1, t2 튜플의 요솟값이 바뀌는 것 아님 => t1, t2 튜플을 더하여 새로운 튜플 t3를 생성 
    2. >>> t1 = (1, 2, 'a', 'b')
      >>> t2 = (3, 4)
      >>> t3 = t1 + t2
      >>> t3
      (1, 2, 'a', 'b', 3, 4)
  4. 튜플 곱하기
    1. >>> t2 = (3, 4)
      >>> t3 = t2 * 3
      >>> t3
      (3, 4, 3, 4, 3, 4)
  5. 튜플 길이 구하기
    1. >>> t1 = (1, 2, 'a', 'b')
      >>> len(t1)
      4
  6. 튜플은 요솟값을 변경할수 없기 때문에 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. 딕셔너리 쌍 추가, 삭제하기

 

  1. 딕셔너리 쌍 추가하기
    1. # 딕셔너리 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'}
  2. 딕셔너리 요소 삭제하기
    1. >>> 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. 딕셔너리 관련 함수

 

  1. Key 리스트 만들기 = keys
    1. # 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']
    2. 리스트 고유의 append, insert, pop, remove, sort 함수는 수행할 수 없음
    3. >>> for k in a.keys():
      >>> 	print(k)
      ...
      name
      phone
      birth
  2. Value 리스트 만들기 - values
    1. # values 함수를 호출하면 dict_values 객체를 리턴
      >>> a.values()
      dict_values(['pey', '010-9999-1234', '1118'])
  3. Key, Value 쌍 얻기 - items
    1. # items 함수는 Key와 Value의 쌍을 튜플로 묶은 값을 dict_items 객체로 리턴
      >>> a.items()
      dict_items([('name', 'pey'), ('phone', '010-9999-1234'), ('birth', '1118')])
  4. Key: Value 쌍 모두 지우기 - clear
    1. # clear 함수는 딕셔너리 안의 모든 요소를 삭제
      # 빈 리스트를 [], 빈 튜플을 ()로 표현하는 것과 마찬가지로 빈 딕셔너리도 {}로 표현
      >>> a.clear()
      >>> a
      {}
  5. Key로 Value 얻기 - get
    1. # 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'
    2. 차이점: a['nokey']처럼 딕셔너리에 존재하지 않는 키로 값을 가져오려고 할 경우
      1. a['nokey'] 방식은 오류를 발생
      2. a.get('nokey') 방식은 None을 리턴
      3. >>> 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'
    3. 딕셔너리 안에 찾으려는 Key가 없을 경우, 미리 정해 둔 디폴트 값을 대신 가져오게 하고 싶을 때는 get(x, '디폴트 값')을 사용
      1. 그냥 '디폴트 값'을 출력한다 
      2. # 딕셔너리 a에는 'nokey'에 해당하는 Key가 없다 => 따라서 디폴트 값인 'foo'를 리턴
        >>> a.get('nokey', 'foo')
        'foo'
  6. 해당 Key가 딕셔너리 안에 있는지 조사하기 - in
    1. >>> 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. 집합 자료형의 특징

  1. 그런데 위에서 살펴본 set("Hello")의 결과가 좀 이상하지 않은가? 
    분명 "Hello" 문자열로 set 자료형을 만들었는데 
    생성된 자료형에는 l 문자가 하나 빠져 있고 
    순서도 뒤죽박죽이다. 
    그 이유는 set에 다음과 같은 2가지 특징이 있기 때문이다.
    1. 중복을 허용하지 않는다
      1. set은 데이터의 중복을 제거하기 위한 필터로 종종 사용된다
    2. 순서가 없다(Unordered)
  2. 리스트나 튜플은 순서가 있기(ordered) 때문에 인덱싱을 통해 요솟값을 얻을 수 있지만, set 자료형은 딕셔너리와 같이 순서가 없기(unordered) 때문에 인덱싱을 통해 요솟값을 얻을 수 없다
  3. 만약 set 자료형에 저장된 값을 인덱싱으로 접근하려면 다음과 같이 리스트나 튜플로 변환한 후에 해야 한다.
    1. >>> 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])
  1. 교집합 구하기
    1. '&'를 사용
    2. intersection 함수 사용
    3. >>> s1 & s2
      {4, 5, 6}
      
      >>> s1.intersection(s2)
      {4, 5, 6}
      >>> s2.intersection(s1)
      {4, 5, 6}
  2. 합집합 구하기
    1. '|'를 사용
    2. union 함수 사용
    3. >>> 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}
  3. 차집합 구하기
    1. -(빼기) 사용
    2. differnce 함수 사용
    3. >>> s1 - s2
      {1, 2, 3}
      >>> s2 - s1
      {8, 9, 7}
      
      >>> s1.difference(s2)
      {1, 2, 3}
      >>> s2.difference(s1)
      {8, 9, 7}

 

4. 집합 자료형 관련 함수

  1. 값 1개 추가하기 - add
    1. 만들어진 set 자료형에 값 1개 추가
    2. >>> s1 = set([1, 2, 3])
      >>> s1.add(4)
      >>> s1
      {1, 2, 3, 4}
  2. 값 여러 개 추가하기 - update
    1. 여러 개의 값을 한꺼번에 추가(update)
    2. >>> s1 = set([1, 2, 3])
      >>> s1.update([4, 5, 6])
      >>> s1
      {1, 2, 3, 4, 5, 6}
  3. 특정 값 제거하기 - remove
    1. remove(x)에서 x는 인덱스 번호가 아닌 제거하려는 set 안의 값
    2. >>> 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