SK Shieldus Rookies - Day 2 (Python)

YUN KI JUNG·2025년 1월 13일

SK Shieldus Rookies

목록 보기
2/3

1. 파이썬 소개 및 보안

파이썬 역사와 개발 배경

  • 파이썬은 1991년 귀도 반 로섬(Guido van Rossum)에 의해 발표
  • 연말 휴가 기간 동안 개인적인 시간을 이용해 파이썬을 개발하기 시작
  • ABC 프로그래밍 언어에서 영감을 받아 개발
  • 처음의 목표는 C와 같은 언어보다 읽기 쉽고, 짧은 코드로 더 많은 작업을 수행할 수 있는 언어를 만드는 것
  • 파이썬의 이름은 귀도의 좋아하는 TV 쇼인 "Monty Python's Flying Circus(몬티 파이썬 플라잉 서커스)"에서 가져옴

파이썬이 널리 사용되는 이유

다양한 분야의 활용

  • 유연성과 확장성 덕분에 웹 개발, 데이터 과학, 인공 지능, 과학 계산, 소프트웨어 개발 등 다양한 분야에서 활용
  • Flask와 Django 같은 웹 프레임워크를 사용한 웹 사이트 개발
  • 데이터 분석(pandas) 및 기계 학습과 딥러닝 프로젝트(TensorFlow)에 사용

직관적인 문법

  • 파이썬의 문법은 매우 간결하고 직관적
  • 프로그래밍 초보자도 쉽게 이해하고 학습할 수 있으며, 코드의 가독성이 높아 개발자가 더 적은 시간과 노력으로 프로그램을 작성 가능

강력한 커뮤니티와 라이브러리

  • 전 세계적으로 강력한 개발자 커뮤니티를 보유하고 있으며, 광범위한 오픈 소스 라이브러리와 프레임워크를 제공
  • 개발자가 어떠한 프로젝트에도 쉽게 접근할 수 있게 해주며, 필요한 도구와 지원을 쉽게 찾을 수 있도록 함

교육용 언어로의 인기

  • 학교와 대학에서 입문용 프로그래밍 언어로 파이썬을 널리 채택
  • 그 이유는 파이썬이 학습하기 쉽고, 다른 언어로의 전환도 용이하기 때문
  • 파이썬으로 기초를 닦은 후 다른 프로그래밍 언어를 배우는 것도 비교적 수월

파이썬의 주요 특징 및 장점


인터프리터 언어

  • 파이썬은 컴파일을 필요로 하지 않고 실행 시점에 코드를 해석하여 실행
  • pyinstaller… → exe

동적 타이핑

  • 변수에 대해 자료형을 사전에 선언할 필요가 없습니다. 이는 스크립트와 프로토타이핑에 유리하며 개발 속도를 높여줌

객체 지향 프로그래밍 지원

  • 파이썬은 클래스, 상속, 인스턴스 등 객체 지향 프로그래밍의 주요 개념을 지원

확장성

  • C나 C++로 작성된 코드를 파이썬 내에서 사용할 수 있어 성능이 중요한 부분에서도 효율적으로 활용 가능

플랫폼 독립성

  • 파이썬은 다양한 운영 체제에서 동일하게 작동하여 윈도우, 맥, 리눅스 등에서 개발한 코드를 별도의 수정 없이 다른 시스템에서 실행 가능

파이썬 버전별 주요 차이점


파이썬 2.x


  • 긴 역사: 2000년에 출시된 파이썬 2.0은 많은 인기를 끌었으며, 여러 하위 버전이 출시
  • 유니코드 지원: 파이썬 2.x는 유니코드 문자열을 지원하지만, 기본적으로 ASCII 문자에 대응하는 바이트 값을 사용
    • 한계: ASCII는 128개의 문자만을 표현할 수 있어, 영어 이외의 언어나 특수 문자를 충분히 다루지 못합
    • 기본적으로 ASCII로 처리되며, 유니코드 문자열을 사용하려면 문자열 앞에 u를 붙여야 함
      • 예: u"안녕하세요"
  • print 문법: print는 명령문(statement)으로 처리되며 괄호 없이 사용 가능
    • 예: print "Hello World"
    • statement로 처리된다는 것은 함수가 아닌 문법적인 구조의 일부로 취급되었다는 의미

파이썬 3.x


  • 현대적 기능: 2008년에 처음 발표된 파이썬 3.x는 파이썬 2.x의 여러 설계 결함을 해결하기 위해 만들어짐
  • 유니코드 기본: 모든 문자열이 유니코드로 처리되며, 이전의 ASCII 기본 문자열은 없어짐
  • print 함수: print가 함수로 변경되어 괄호와 함께 사용
    • 예: print("Hello World")
  • 정수 나눗셈 변경: / 연산자는 항상 부동 소수점 결과를 반환하고, // 연산자는 정수 결과를 반환
  • 비동기 프로그래밍 지원: asyncawait 키워드를 도입하여 비동기 프로그래밍을 네이티브로 지원

파이썬 2와 3의 호환성 이슈


  • 코드 변환: 많은 파이썬 2 코드는 파이썬 3에서 직접 작동하지 않으며, 변환을 위해 2to3과 같은 도구를 사용 필요
  • 라이브러리 업데이트: 대부분의 주요 라이브러리와 프레임워크는 파이썬 3으로 이전
  • 종료 일정: 파이썬 2.7은 2020년 1월에 공식적으로 지원이 종료

왜 파이썬 3.x를 사용해야 하는가?


  • 지속적인 지원과 업데이트: 파이썬 3는 계속해서 새로운 기능과 개선이 추가
  • 보안과 성능 개선: 최신 파이썬 버전은 보안 패치와 최적화가 포함되어 있어 더 안전하고 빠름
  • 향상된 라이브러리와 커뮤니티 지원: 최신 도구와 라이브러리는 파이썬 3를 기준으로 개발되고 있음

IT보안에서 활용하는 사례


  • 파이썬은 IT 보안 분야에서도 매우 유용하게 활용
  • 네트워크 보안, 웹 보안, 시스템 모니터링 및 로깅, 그리고 취약점 분석과 같은 다양한 영역

보안 자동화 도구

  • 파이썬은 다양한 보안 관련 라이브러리와 툴을 통해 반복적이고 시간 소모적인 작업을 자동화
  • 스크립트를 작성하여 정기적인 보안 업데이트를 확인하고 적용
  • 네트워크 트래픽(방화벽, IDS, IPS, 개인PC 등)을 모니터링하여 이상 징후를 탐지

취약점 스캔 및 분석

  • SQLMap과 같은 툴은 파이썬을 기반으로 하며, 웹 어플리케이션의 취약점을 자동으로 스캔하고 보고서 생성 가능

포렌식 및 사고 대응

  • 파이썬은 디지털 포렌식과 사고 대응 과정에서 중요한 데이터를 수집, 분석 및 처리하는 데 사용
  • 예를 들어, 파이썬 스크립트를 사용하여 로그 파일에서 이상 행위를 추출하거나, 멀웨어 분석을 위한 자동화된 도구를 개발

네트워크 보안

  • Nmap와 같은 네트워크 분석 도구는 파이썬으로 개발
  • 이들 도구를 사용하여 패킷을 생성, 조작, 발송 및 수신하고, 네트워크 스캔을 수행하며 보안 감사 가능

정기적 포트 스캔 결과 통보

  • 정기적으로 네트워크 포트 스캔을 실행하고, 결과를 보안 담당자의 이메일과 슬랙으로 자동 전송

보안 이슈 자동화 트위터 크롤링

  • 트위터에서 특정 키워드에 관련된 최신 보안 이슈를 정기적으로 크롤링하여 보고

엑셀 결과를 워드 파일 상세 보고서로 자동화

  • 엑셀로 작성된 데이터를 워드 문서 형태의 상세 보고서로 자동 변환

2. 파이썬 기본 문법

변수

  • 변수는 데이터를 저장하기 위한 저장 공간의 이름
  • 프로그램 내에서 데이터를 저장, 수정, 재사용하기 위해 사용

변수 선언

  • 파이썬에서는 변수를 선언할 때 특별한 키워드가 필요 없으며, 값을 할당하는 순간 변수가 생성
  • 파이썬은 변수의 데이터 타입을 자동으로 인식하며, 데이터 타입은 변수에 할당된 값에 따라 결정
  • 할당 연산자(=)를 사용하여 변수에 값을 할당
number = 10
name = "Alice"
print(number)
print(name)

데이터 타입

  • 기본 타입: 정수(int), 부동소수점(float), 문자열(str), 불리언(bool)
age = 30  # 정수
temperature = 36.5  # 부동소수점
is_valid = True  # 불리언
데이터 타입 범주데이터 타입
텍스트 타입str
숫자 타입int, float, complex
시퀀스 타입list, tuple, range
매핑 타입dict
집합 타입set, frozenset
불리언 타입bool
바이너리 타입bytes, bytearray, memoryview
None 타입NoneType (표현은 None)

정수형 (Integer, int)

  • 정수형 데이터 타입은 양수, 음수, 0을 포함한 모든 정수를 표현
age = 25
temperature = -5
print(age)
print(temperature)


부동소수점수 (Floating-point, float)

  • 부동소수점수는 실수를 표현하며, 소수점을 포함한 수를 다룰 때 사용
height = 175.5
weight = 65.3
print(height)
print(weight)


문자열 (String, str)

  • 문자열은 텍스트를 표현하기 위해 사용
  • 파이썬에서 문자열은 작은따옴표(' ') 또는 큰따옴표(" ")로 묶어서 표현
name = "John"
greeting = 'Hello, World!'
print(name)
print(greeting)


불리언 (Boolean, bool)

  • 불리언 타입은 참(True)과 거짓(False)의 두 가지 값만을 가지며, 조건문에서 많이 사용
is_student = True
is_sunny = False
print(is_student)
print(is_sunny)

리스트, 튜플, 딕셔너리 등 다양한 타입은 뒤에서 학습하면서 다룰 예정

데이터 타입 확인


  • type() 함수의 사용은 변수나 값의 데이터 타입을 확인하는 데 매우 유용
  • 이 함수는 파이썬 내장 함수로, 인자로 주어진 객체의 데이터 타입을 반환
  • type() 함수는 코드에서 예상치 못한 타입 관련 오류를 디버깅할 때 특히 유용
number = 42
print(type(number))  # 출력: <class 'int'>

text = "Hello, World!"
print(type(text))  # 출력: <class 'str'>

flag = True
print(type(flag))  # 출력: <class 'bool'>

데이터 타입 변환 함수


str()


  • str() 함수는 파이썬에서 제공하는 내장 함수로, 정수, 실수, 리스트, 튜플 등 다양한 데이터 타입을 문자열 형태로 변환
number = 100
text = str(number)
print(text)  # 출력: "100"

int()


  • int() 함수는 문자열 형태의 숫자나, 실수를 정수형으로 변환
  • 문자열이 숫자를 나타내지 않는 경우 ValueError 오류를 발생
string_number = "123"
real_number = int(string_number)
print(real_number)  # 출력: 123

float_number = 3.14
integer_number = int(float_number)
print(integer_number)  # 출력: 3

float()


  • float() 함수는 문자열이나 정수 등을 실수형(float)으로 변환
  • 문자열이 유효한 실수 형식이 아닐 경우 ValueError 오류를 발생
int_number = 10
float_from_int = float(int_number)
print(float_from_int)  # 출력: 10.0

string_number = "3.14159"
float_from_string = float(string_number)
print(float_from_string)  # 출력: 3.14159

오류 처리와 예외 처리


  • 데이터 타입 변환 시 입력 값이 변환 가능한 형태가 아닐 경우 파이썬은 ValueError를 발생
  • 이러한 오류를 처리하기 위해 try...except 구문을 사용
try:
    user_input = "a123"
    number = int(user_input)
except ValueError:
    print("입력 값이 정수로 변환될 수 없습니다.")
  • try...except 구문은 파이썬에서 예외 처리를 위해 사용되는 구문
  • 예외는 프로그램 실행 중 발생할 수 있는 오류의 일종으로, 예외적인 상황에서 프로그램이 중단되지 않고, 개발자가 지정한 방식으로 처리될 수 있도록 도와줌
try:
    # 실행할 코드
except ErrorType:
    # 에러가 발생했을 때 실행할 코드

변수 네이밍 규칙


기본 규칙


  • 문자, 숫자, 밑줄 포함 가능: 변수 이름은 문자(a-z, A-Z), 밑줄(_), 숫자(0-9)를 포함 가능
  • 숫자로 시작할 수 없음: 변수 이름은 숫자로 시작할 수 없습니다. 예를 들어, 1name은 유효하지 않지만, name1은 유효
  • 대소문자 구분: 파이썬은 대소문자를 구분합니다. 따라서, Age, age, AGE는 모두 다른 변수로 인식

예약어 사용 금지


  • 파이썬에서는 if, for, class 등의 예약어를 변수 이름으로 사용할 수 없음
  • 이러한 단어들은 파이썬의 문법에 이미 특정 의미로 사용되고 있기 때문

권장하는 네이밍 컨벤션


  • 스네이크 케이스: 파이썬에서 일반 변수와 함수 이름에는 소문자와 밑줄을 사용하는 스네이크 케이스를 권장합니다. 예: my_name, student_age
  • 카멜 케이스: 클래스 이름에는 각 단어의 첫 글자를 대문자로 시작하는 카멜 케이스를 사용하는 것이 일반적입니다. 예: MyClass, DataProcessor
  • 상수: 전역 상수는 모두 대문자와 밑줄을 사용합니다. 예: MAX_SPEED, TOTAL
# 좋은 예
username = "admin"
user_id = 1001

# 나쁜 예
2nd_user = "bob"  # 숫자로 시작할 수 없습니다.
user-name = "alice"  # 하이픈(-)은 변수명에 사용할 수 없습니다.
global = "value"  # 'global'은 파이썬의 예약어입니다.

3. 파이썬 출력 이해

print("파이썬 웰컴")
print("파이썬", "웰컴", "python")
print("파이썬 \n", "웰컴\n")
print('파이썬 "매우" 웰컴')
print(""" 굉장히 긴 문자열입니다.........
      파이썬 화이팅
      파이썬자동화
      """)
name = input("이름을 입력하세요.")
phone = input("번호를 입력하세요.")
age = input("나이를 입력하세요.")
print(name)
print(phone)

print(name, "의 전화번호는", phone, "입니다.", "나이는", age)

#print(type(name))
#print(type(phone))

아래의 + 와 , 는 다른 의미임

num1 = input("첫번째 숫자")
num2 = 2
str1 = "조정원"

print(str1 + num1)
print(str1, num2)
print(type(str1+num1))

파이썬에서 사용되는 이스케이프 코드(Escape Codes)는 문자열 내에서 특정 문자를 표시하거나 특수 문자를 삽입할 때 사용

이스케이프 코드설명예시
\\백슬래시 문자\\\
\'작은따옴표\''
\"큰따옴표\""
\n줄바꿈 (개행)Hello\nWorld → HelloWorld
\tHello\tWorld → Hello World
\r캐리지 리턴Hello\rWorld → World
\b백스페이스Hello\bWorld → HellWorld
\f폼 피드 (페이지 나누기)텍스트 페이지 나누기
\a벨 (경고음)소리 발생 (일부 환경에서만)
\v수직 탭수직으로 탭
\0널 문자문자열 끝을 표시하는 데 사용
\ooo8진수 값\101A
\xhh16진수 값\x41A

문자열 포맷팅 정의


  • Python에서 문자열 포맷팅은 데이터를 문자열 형태로 변환하고, 이를 출력하거나 다른 문자열과 결합하기 위해 사용
  • 변수나 계산 결과를 문자열에 삽입하고, 이를 원하는 형식으로 표현
  • 파이썬의 세 가지 주요 문자열 포매팅 방식인 % 연산자, .format() 메소드, 그리고 f-string에 대해 자세히 배울 예정

실습


1. % 연산자

  • % 연산자를 이용한 포맷팅
  • 파이썬 초기 버전부터 사용되어온 방식 - 가장 오래된 방식 중 하나
  • %s는 문자열, %d는 정수, %f 부동 소수점 숫자를 의미
name = "조정원"
print("내 이름은 %s입니다." % name)
  • % 연산자 뒤에 나오는 튜플 (name, age)의 각 요소로 대체
name = "조정원"
age = 20
print("내 이름은 %s이고 나이는 %d살입니다." % (name,age))

2. format() 메서드

  • format() 메서드를 이용한 포맷팅
  • 파이썬 2.6부터 도입된 방식
  • 문자열 내의 중괄호 {}를 플레이스홀더로 사용하여 이 플레이스홀더들은 .format()에 전달된 인자로 대체
name = "조정원"
age = 20
print("내 이름은 {}이고 나이는 {}살입니다.".format(name,age))
  • 인덱스 사용하여 특정 순서로 인자 삽입
name = "조정원"
age = 20
print("내 이름은 {}이고 나이는 {}살입니다.".format(age,name))
print("내 이름은 {1}이고 나이는 {0}살입니다.".format(age,name))
  • 키워드 인자 사용
name = "조정원"
age = 20
print("내 이름은 {n}이고 나이는 {a}살입니다.".format(a=age,n=name))

3. 포맷 문자열 리터럴(f-string) - 가장 최신 기능

  • 파이썬 3.6에서 도입된 f-string 방식
  • f-string은 문자열 포맷팅을 위한 가장 직관적이고 현대적인 문자열 포맷팅 방식
  • f-strings를 사용하는 이 코드에서는 문자열 앞에 f를 붙여 포맷 문자열 리터럴을 나타냄
  • {} 안에 직접 변수 name을 삽입하여, Python이 이를 name 변수의 값인 "김태영"으로 대체
name = "조정원"
age = 20
print(f"내 이름은 {name}이고 나이는 {age}살입니다.")

결론적으로 3가지 방식으로 출력이 가능하나, f-string을 사용한다.

name = input("이름을 입력")
phone = input("번호를 입력")
age = int(input("나이를 입력"))

print(name, "의 전화번호는", phone, "입니다.", "나이는", age)
print("내 이름은 {}이고 나이는 {}살입니다.".format(name,age))
print(f"내 이름은 {name}이고 나이는 {age}살입니다.")

print(type(name))
print(type(age))

구글 라이브러를 이용한 번역 프로그램

다시 설치할 때

pip uninstall googletrans==3.1.0a0 (나중에 필요 없음)

pip install deep_translator

from deep_translator import GoogleTranslator

input_text = input("한글을 입력하세요. ")
translated = GoogleTranslator(source='ko', target='en').translate(input_text)

print(f"입력한 한글 : {input_text}")
print(f"번역된 영어: {translated}")

4. 주요 데이터 구조 - 리스트

리스트(List)


  • 파이썬에서 가장 자주 사용되는 데이터 구조 중 하나
  • 여러 값들을 순서대로 저장하는데 사용
  • 리스트는 여러 원소를 순서대로 포함하며, 각 원소는 인덱스를 통해 접근
  • 인덱스는 0부터 시작하여 리스트의 각 원소에 대응

특징


  • 순서가 있는 컬렉션
  • 요소의 추가, 삭제, 수정이 자유로움
  • 동일한 요소의 중복 저장 가능
  • 다양한 데이터 타입을 하나의 리스트에 저장할 수 있음
names = ['조정원', '홍길동', '김씨']

for name in names:
    print(name)

print(len(names))  #길이

for i in range(3):
    print(i)

for i in range(len(names)):
    print(f"{i+1}번째: {names[i]}")
    

enumerate 내장 함수를 이용하여 인덱스와 값을 한번에 가져오기

for i,name in enumerate(names):
    print(f"{i+1}번째: {name}")

names = ['조정원', '홍길동', '김씨']
ages = [23, 24, 25]

for index, name in enumerate(names):
    age = ages[index]
    print(f"이름: {name}의 나이는: {age}")

zip 함수는 두 개 이상의 시퀀스(리스트, 튜플 등)를 병렬로 순회할 수 있도록 묶어주는 파이썬의 내장 함수

names = ['조정원', '홍길동', '김씨']
ages = [23, 24, 25]

for name, age in zip(names, ages):
    print(f"이름: {name}의 나이는: {age}")

리스트 요소 수정


  • 리스트의 요소를 수정하려면, 해당 요소의 인덱스를 사용하여 새 값을 할당
  • 리스트가 변경 가능(mutable)한 데이터 타입이기 때문에 가능한 작업
my_list = [10, 20, 30, 40, 50]
my_list[1] = 25  # 두 번째 요소 값을 25로 수정
print(my_list)  # 결과: [10, 25, 30, 40, 50]

my_list[4] = 100  # 다섯 번째 요소 값을 100으로 수정
print(my_list)  # 결과: [10, 25, 30, 40, 100]

리스트 결합


  • 리스트에서 + 연산자를 사용하는 것은 두 개 이상의 리스트를 결합하여 새로운 리스트를 생성하는 방법
  • 이 연산자는 기존의 리스트들은 변경하지 않고, 새로운 리스트를 반환
old_list = [5, 6, 7]
new_list = [1, 2, 3, 4]
result = a + new_list
print(result)  # 출력: [5, 6, 7, 1, 2, 3, 4]

리스트 요소 추가 및 삭제


  • 영구적인 추가를 위해 append() 사용
numbers.append(6)  # 리스트 끝에 6 추가
print(numbers)

numbers.insert(1, 9)  # 인덱스 1에 9 삽입
print(numbers)

numbers.remove(9)  # 값 9 삭제
print(numbers)

del numbers[0]  # 첫 번째 요소 삭제
print(numbers)

리스트에서 특정 요소 위치 찾기

index() 메서드는 리스트에서 특정 요소의 위치를 찾는 데 사용

list.index(element) 형태로 사용되며, 여기서 element는 리스트에서 찾고자 하는 요소

# 리스트 생성
my_list = [10, 20, 30, 40, 50]

# 특정 요소의 위치 찾기
element = 30
index = my_list.index(element)
print(f"{element}의 위치는 {index}입니다.")

수업 때 예제

scores = [80, 90, 100, 70, 50, 40]
scores.append(110)
print(scores)
scores.insert(2, 80)
print(scores)
scores.remove(90)
print(scores)

del scores[1]
함수설명예시
append(x)리스트의 끝에 요소 x를 추가lst.append(4)
extend(iterable)iterable의 모든 항목을 리스트에 추가lst.extend([4, 5])
insert(i, x)지정한 위치 i에 요소 x를 삽입lst.insert(2, 'a')
remove(x)리스트에서 첫 번째로 나오는 요소 x를 제거lst.remove(3)
pop([i])지정된 위치 i의 요소를 제거하고 반환 (기본은 마지막 요소)lst.pop() or lst.pop(1)
clear()리스트의 모든 요소를 제거lst.clear()
index(x[, start[, end]])요소 x의 첫 번째 인덱스를 반환lst.index(2)
count(x)리스트에서 요소 x의 개수를 반환lst.count(2)
sort(key=None, reverse=False)리스트를 정렬lst.sort()
reverse()리스트의 요소 순서를 반대로 변경lst.reverse()
copy()리스트의 얕은 복사본을 반환new_list = lst.copy()

리스트 인덱싱과 슬라이싱


  • 리스트의 특정 위치에 접근하려면 인덱스를 사용
  • 슬라이스를 사용하여 여러 요소를 선택
print(numbers[0])  # 첫 번째 요소

print(numbers[-1]) # 마지막 요소

print(numbers[2:4]) # 인덱스 2부터 3까지 요소

수업 때 예제 - 점수 값을 이용한 사례

scores = [80, 90, 100, 70, 50, 40, 10, 30, 60, 120]

numbers = scores[2:5]
print(numbers)

numbers = scores[2:]
print(numbers)

numbers = scores[2::2]
print(numbers)

numbers = scores[1:-1]
print(numbers)

numbers = scores[-6:-1]
print(numbers)

수업 때 예제- 아래는 학생들의 성적을 입력 받아서 최고값, 최소값, 평균값, 특정 점수 이상의 count 프로그램

#5명의 학생의 성적을 입력 받는다.
#최대 점수, 최소 점수, 성적평균 구한다.
#80점 이상의 학생수를 카운트

STUDENTS = 5
lst = []
count = 0

for i in range(STUDENTS):
    value = int(input(f"{i+1}번째 학생 성적을 입력하세요"))
    lst.append(value)


print(f"최대 점수 : {max(lst)}")
print(f"최소 점수 : {min(lst)}")
print(f"성적평균 = {sum(lst)/len(lst)}")

#80점 이상 성적의 학생수를 count
for score in lst:
    if score >= 80:
        count += 1   # couunt = counut + 1

print(f"80점 이상 {count}명이다.")

5. 주요 데이터 분석 - 딕셔너리

딕셔너리(Dictionary)


  • 딕셔너리는 키-값 쌍으로 데이터를 저장
  • 이는 JSON 형식과 유사하며, 데이터를 효율적으로 저장하고 검색할 때 유용

특징


  • 키(Key)와 값(Value)의 쌍으로 데이터 저장
  • 순서가 없음
  • 키는 변경 불가능한 타입이어야 하며 (문자열, 숫자, 튜플), 값은 어떤 타입이든 가능
    • 리스트의 인덱스(순서)에서는 정수만 가능 ex) list[0], list[-1]과 같이 접근한 것
  • 빠른 검색, 수정, 삭제를 위한 최적화된 데이터 구조

딕셔너리 키로 사용 가능한 타입


사용 가능한 타입설명
문자열 (String)파이썬에서 가장 일반적으로 사용되는 불변 타입
숫자 (Integer, Float)모든 종류의 숫자 (정수, 부동소수점)는 불변
튜플 (Tuple)튜플의 요소가 모두 불변 타입일 때만 해시 가능하고 키로 사용 가능

딕셔너리 키로 사용 불가능한 타입


사용 불가능한 타입설명
리스트 (List)리스트는 요소를 추가, 삭제, 변경할 수 있어 변경 가능(mutable)
딕셔너리 (Dictionary)딕셔너리 역시 키나 값이 변경 가능
집합 (Set)집합은 내용을 변경할 수 있어서, 딕셔너리의 키로 사용 불가

딕셔너리 생성


  • 딕셔너리는 중괄호 {}를 사용하여 생성
  • 주의사항 : Key는 고유한 값이므로 중복되는 Key 값이 생성되면 하나를 제외한
person = {"name": "John", "age": 30, "city": "New York"}
print(person)

주의사항


  1. Key 중복
  • 딕셔너리에서 키는 유일
  • 만약 동일한 키로 여러 값을 지정하려고 하면, 마지막에 지정된 값만 저장되고 이전 값들은 덮어쓰여짐
  • 이는 데이터 손실로 이어질 수 있으므로 키의 중복은 피해야 함
my_dict = {
    'name': 'John',
    'age': 25,
    'name': 'Alice'  # 'name' 키가 중복됨
}

print(my_dict)  # 출력: {'name': 'Alice', 'age': 25}
  1. Key로 사용할 수 있는 데이터 타입
    • 딕셔너리의 키로 사용될 수 있는 데이터 타입은 변경 불가능(immutable)한 타입
    • 키가 변하지 않기 때문에 딕셔너리의 성능이 유지될 수 있도록 보장하기 위함
    • 따라서 문자열, 숫자, 튜플과 같은 데이터 타입은 키로 사용할 수 있지만, 리스트나 딕셔너리 같은 변경 가능(mutable)한 타입은 사용할 수 없음
valid_dict = {
    'name': 'John',  # 문자열은 키로 사용 가능
    42: 'The answer',  # 정수도 키로 사용 가능
    (1, 2, 3): 'Coordinates'  # 튜플도 키로 사용 가능
}

# 아래 코드는 에러를 발생시킵니다.
# invalid_dict = {
#     ['name']: 'John'  # 리스트는 키로 사용 불가능
# }

딕셔너리 value 얻기


  • 딕셔너리의 값에 접근하는 두 가지 주요 방법
  • 직접 인덱싱을 사용하는 방법과 get() 메서드를 사용하는 방법
person = {"name": "John", "age": 30, "city": "New York"}
print(person["name"])
person = {"name": "John", "age": 30, "city": "New York"}
print(person.get("name",0))
  • 오류 처리: 직접 인덱싱은 키가 없을 때 KeyError를 발생시키지만, get() 메서드는 None을 반환하거나 선택적으로 다른 기본값을 반환
  • 기본값 지정: get() 메서드는 키가 없을 경우 반환할 기본값을 설정 가능
person = {"name": "John", "age": 30, "city": "New York"}

# 직접 인덱싱 사용
try:
    print("Name:", person["name"])  # 존재하는 키
    print("Salary:", person["salary"])  # 존재하지 않는 키
except KeyError:
    print("KeyError: 'salary' key does not exist.")

# get() 메서드 사용
print("\nUsing get() method:")
print("Name:", person.get("name"))  # 존재하는 키
print("Salary:", person.get("salary"))  # 존재하지 않는 키, None을 반환
**print("Salary with default:", person.get("salary", "Not Available"))  # 존재하지 않는 키,** 기본값 "Not Available" 반환

딕셔너리 요소 추가 및 수정


  • 딕셔너리의 특정 키에 대한 값을 접근하거나 수정할 때는 키를 사용
my_dict = {"name": "John", "age": 30, "city": "New York"}
my_dict["email"] = "john@example.com"  # 새로운 키와 값 추가
my_dict["age"] = 31  # 기존 키의 값 수정

print(my_dict)

딕셔너리 요소 제거


  • del 키워드, pop() 메서드, 또는 popitem() 메서드를 사용하여 딕셔너리에서 요소를 제거
# del 키워드를 사용하여 키-값 쌍 제거
del my_dict["city"]

# pop() 메서드를 사용하여 키-값 쌍 제거 및 값 반환
age = my_dict.pop("age")
print("Removed age:", age)

# popitem() 메서드는 마지막 키-값 쌍을 제거하고 반환
item = my_dict.popitem()
print("Removed item:", item)

print(my_dict)
#메뉴를 선택한다.
#현금을 넣는다.
#구매한후에 거스름돈을 받는다.

menus = {"아메리카노":4000, "카페라떼":5000, "카페모카":6000}

print("=======메뉴======")
for name, price in menus.items():
    print(f"{name}: {price}원")

selected_menu = input("주문할 메뉴를 입력하세요.")
money = int(input("돈을 넣으세요."))

price = menus.get(selected_menu,0)

if price==0:
    print("메뉴가 없습니다.")

else:
    change = money - price
    if change >= 0:
        print(f"{selected_menu} 구매. 거스름돈은 : {change}원 입니다.")
    else:
        print("돈이 모잘랍니다.")
#while 반복
#메뉴를 선택한다. (여러개의 메뉴를 선택 한다.)
#구매한 메뉴를 리스트로 보관도 해야 한다.
#현금을 넣는다.
#구매한후에 거스름돈을 받는다.
#구매했던 리스트와 총 구매가격? 출력!!!

menus = {"아메리카노":4000, "카페라떼":5000, "카페모카":6000}
order_list = []
total_price = 0

print("=======메뉴======")
for name, price in menus.items():
    print(f"{name}: {price}원")

while True:
    selected_menu = input("주문할 메뉴를 입력하세요")
    price = menus.get(selected_menu, 0)

    if price !=0:
        #메뉴를 선택한 것을 리스트화
        order_list.append(selected_menu)
        total_price = total_price + menus[selected_menu]

    elif selected_menu == "q":
        print("주문종료")
        break
    else:
        print("메뉴가 없습니다.")

print(f"선택한 메뉴 : {order_list}")

money = int(input("돈을 넣으세요"))
change = money - total_price

if change >=0:
    print(f"{len(order_list)}개 구매, 거스름돈 {change}원 입니다.")
else:
    print("돈이 부족합니다.")

faker를 이용한 가짜 데이터 생성 프로그램

from faker import Faker

fake = Faker('ko_KR')
names = []
phone_numbers = []
addresses = []

for i in range(10):
    name = fake.name()
    phone_number = fake.phone_number()
    address = fake.address()

    names.append(name)
    phone_numbers.append(phone_number)
    addresses.append(address)

for i in range(10):
    print(f"이름: {names[i]}, 전화번호: {phone_numbers[i]}, 주소:{addresses[i]}")
항목설명
fake.name()이름
fake.address()주소
fake.postcode()우편 번호
fake.country()국가명
fake.company()회사명
fake.job()직업명
fake.phone_number()휴대 전화 번호
fake.email()이메일 주소
fake.user_name()사용자명
fake.pyint(min_value=0, max_value=100)0부터 100 사이의 임의의 숫자
fake.ipv4_private()IP 주소
fake.text()임의의 문장 (※ 한글 임의의 문장은 fake.catch_phrase() 사용)
fake.color_name()색상명

profile
cyber security specialist

0개의 댓글