In [ ]:
'''
변수(variable) : 데이터를 담는 그릇 (숫자로 시작 불가, 특수문자 _ , $ 허용됨)
- 예약어는 변수로 사용할 수 없다.
Python Built-In Types
- Numeric (int, float)
- Sequence (list , tuple)
- Text Sequence (str)
- Set (set)
- Mapping (dict)
- Bool
다양한 변수 선언 방식
- Camel Case : numberOfColleageGraduates - 변수, 함수
- Pascal Case : NumberOfColleageGraduates - 클래스
- Snake Case : number_of_colleage_graduates - 비추천
'''
In [23]:
# 예약어 확인
import keyword
keywordList = keyword.kwlist
print('키워드 = ' , keywordList)
print()
print('type - ' , type(keywordList))
키워드 = ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] type - <class 'list'>
In [16]:
# 기본 변수 바인딩
year = "2025"
month = 10
# 함수 호출
print(year, month)
# 변수타입 확인을 위한 함수 - type()
print('year type - ', type(year))
2025 10 year type - <class 'str'>
In [22]:
# 문자열
name = "임정섭"
print(name, type(name))
print('010' , '1234' , '5678' , sep = "-")
print('jslim9413', 'naver.com' , sep="@")
임정섭 <class 'str'> 010-1234-5678 jslim9413@naver.com
In [36]:
# Sequence - List type
# [] - 순서가 있는 열거형 (파이썬에서는 Array가 아님, 파이썬에서는 배열이 존재하지 않음)
# indexing, slicing을 포함함
print('list - ' , keywordList)
print()
print('indexing - ' , keywordList[0])
print()
print('slicing - ' , keywordList[0:5])
list - ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] indexing - False slicing - ['False', 'None', 'True', 'and', 'as']
In [47]:
#text sequence
print(name)
print('indexing - ' , name[0] , type(name[0]))
print('indexing - ' , name[-1])
print('slicing - ' , name[0:2])
임정섭 indexing - 임 <class 'str'> indexing - 섭 slicing - 임정
In [66]:
# Mapping(key, value)
# dict , {}
# 인덱싱이 불가하고 key를 통해 데이터에 접근
log = {
"SQL Injection" : {
"정의" : "사용자 입력을 적절히 검증하지않고 데이터베이스 쿼리에 직접 포함하는 것",
"용어" : [
"입력검증", "파라미터화", "블라인드", "에러기반"
],
"취약코드 예시" : "query = select * from table",
"공격예시" : "user = admin or 1=1",
"탐지" : [
"웹 취약점 스캐너 사용", "비정상적인 쿼리", "오류 모니터링"
]
}
}
print(log)
print()
print('type - ' , type(log))
print()
print(log["SQL Injection"]["용어"], type(log["SQL Injection"]["용어"]))
print()
# --error
# print(log[0][1], type(log[0][1]))
{'SQL Injection': {'정의': '사용자 입력을 적절히 검증하지않고 데이터베이스 쿼리에 직접 포함하는 것', '용어': ['입력검증', '파라미터화', '블라인드', '에러기반'], '취약코드 예시': 'query = select * from table', '공격예시': 'user = admin or 1=1', '탐지': ['웹 취약점 스캐너 사용', '비정상적인 쿼리', '오류 모니터링']}}
type - <class 'dict'>
['입력검증', '파라미터화', '블라인드', '에러기반'] <class 'list'>
In [78]:
# 집합 (tuple)
# () 소괄호 사용
# indexing, slicing 가능
# 불변성(immutable)을 가진다
tupleTemp = (1)
print('type - ', type(tupleTemp)) #type - <class 'int'> int가 나온다 요소가 한개여서 정수로 봄
tupleTemp = (1,)
print('type - ', type(tupleTemp)) # ,를 사용해서 집합으로 만들어줘야한다
tupleTemp = "a", "b", "c", "d", "e"
print('data - ', tupleTemp)
print('type - ', type(tupleTemp)) # 소괄호에 대한 생략도 가능하다 (packing)
a, b, c, *d = tupleTemp
print('unpacking - ', a, b, c)
print()
print('indexing - ', tupleTemp[0])
print('slicing - ', tupleTemp[0:]) # start index : end index : step
print('slicing - ', tupleTemp[0::2])
# --error
# 불변성으로 데이터를 변경할 수 없다
# tupleTemp[0] = 23
type - <class 'int'>
type - <class 'tuple'>
data - ('a', 'b', 'c', 'd', 'e')
type - <class 'tuple'>
unpacking - a b c
indexing - a
slicing - ('a', 'b', 'c', 'd', 'e')
slicing - ('a', 'c', 'e')
In [86]:
# Text Sequence
# 문자열
# 인덱싱 슬라이싱 가능
strTemp = 'Talk is cheap. show me the code'
print(strTemp, type(strTemp))
print()
print('indexing - ', strTemp[0])
# --error
# strTemp[0] = 'L'
Talk is cheap. show me the code <class 'str'> indexing - T
In [97]:
print('Quiz - 마지막 문자열(code) 추출한다면 ?')
print(strTemp[-4:])
listTemp = strTemp.split() # 공백을 기준으로 나눔
print(listTemp)
print(type(listTemp))
print('result - ', listTemp[-1])
Quiz - 마지막 문자열(code) 추출한다면 ? code ['Talk', 'is', 'cheap.', 'show', 'me', 'the', 'code'] <class 'list'> result - code
In [104]:
strEx = '홀짝홀짝홀짝홀짝홀짝홀짝홀짝홀짝홀짝홀짝'
print('Quiz - 주어진 변수에 홀 만 추출하여 출력하고 싶다면 ?')
print('result 홀 - ', strEx[::2])
print('result 짝 - ', strEx[1::2])
Quiz - 주어진 변수에 홀 만 추출하여 출력하고 싶다면 ? result 홀 - 홀홀홀홀홀홀홀홀홀홀 result 짝 - 짝짝짝짝짝짝짝짝짝짝
In [117]:
# 집합(set) : 연산 (합집합, 교집합, 차집합, etc...)
# {}
# 순서가 보장되지 않는다.
# 중복을 보장하지 않는다.
# 인덱싱 슬라이싱 불가
# 변경가능
# {} 비어있는 중괄호는 dict로 인식 비어두고 싶다면 set()을 사용
userRoles = {"admin", "user", "user", "guest"}
print('data - ', userRoles)
print('type - ', type(userRoles))
data - {'guest', 'admin', 'user'}
type - <class 'set'>
In [119]:
empSet = {}
print('type - ', type(empSet))
empSet = set()
print(dir(empSet)) # magic method, 일반 method
print()
print('type - ', type(empSet))
# add method 데이터 추가
empSet.add("user")
empSet.add("admin")
empSet.add("guest")
print('data - ', empSet)
empSet.discard('guest')
print()
print('data - ', empSet)
type - <class 'dict'>
['__and__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__iand__', '__init__', '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
type - <class 'set'>
data - {'guest', 'admin', 'user'}
data - {'admin', 'user'}
In [124]:
# 연산 (| , & , -, ^)
adminRoles = {"read", "write", "delete", "update"}
userRoles = {"read", "comment"}
print('type - ', type(adminRoles), type(userRoles))
print()
print('합집합 - ', adminRoles | userRoles)
print('교집합 - ', adminRoles & userRoles)
print('차집합 - ', adminRoles - userRoles)
print('대칭차집합 - ', adminRoles ^ userRoles)
type - <class 'set'> <class 'set'>
합집합 - {'comment', 'delete', 'update', 'write', 'read'}
교집합 - {'read'}
차집합 - {'write', 'delete', 'update'}
대칭차집합 - {'comment', 'delete', 'update', 'write'}
In [128]:
# 보안관점에서 set() 활용 방안을 생각해 본다면?
# 중복로그인 감지 (토큰 또는 세션을 관리)
userTokens = set()
def login(token):
if token in userTokens:
raise ValueError(f"[보안경고] 이미 로그인 중 : {token}")
userTokens.add(token)
print(f"{token}로그인 성공")
login('jslim')
login('sk')
login('jslim')
jslim로그인 성공 sk로그인 성공
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) Cell In[128], line 14 12 login('jslim') 13 login('sk') ---> 14 login('jslim') Cell In[128], line 8, in login(token) 6 def login(token): 7 if token in userTokens: ----> 8 raise ValueError(f"[보안경고] 이미 로그인 중 : {token}") 9 userTokens.add(token) 10 print(f"{token}로그인 성공") ValueError: [보안경고] 이미 로그인 중 : jslim
In [126]:
# 연산자(operator) : in , not in
fruits = ['apple', 'banana', 'durian', 'orange']
print('data - ', fruits)
print('type - ', type(fruits))
print('orange' in fruits)
data - ['apple', 'banana', 'durian', 'orange'] type - <class 'list'> True
출력형식 정리¶
In [139]:
userInfo = {
'name' : 'jslim',
'age' : 20
}
print('name ', userInfo['name'])
print('age ', userInfo['age'])
name jslim age 20
In [141]:
role = "admin"
print('문자열 연결(+)', "Hello "+role+" !!")
문자열 연결(+) Hello admin !!
In [149]:
# f-string(3.6~)
# {} 안에 변수나 표현식을 넣을 수 있음
name = "sk"
score = 95.1234
print('data - ', score)
print('type - ', type(score))
print(f" name : {name} , score : {score:.2f}")
data - 95.1234 type - <class 'float'> name : sk , score : 95.12
In [154]:
# str.format()
lang = 'python'
version = 3.13
print("language : {} , version : {} ".format(lang, version))
print("language : {0} , version : {1} ".format(lang, version))
print("language : {a} , version : {b} ".format(a=lang, b=version))
language : python , version : 3.13 language : python , version : 3.13 language : python , version : 3.13
In [157]:
# 서식 지정 연산자
# c 스타일 포맷 : %s, %d, %f, %.2f
# %.2fcm 단위 붙이기도 가능
print('language : %s , version : %.2fcm' % (lang, version))
language : python , version : 3.13cm
In [1]:
data = "Hello\nPython"
print(data)
print()
print(str(data))
print()
print(repr(data))
Hello Python Hello Python 'Hello\nPython'
In [2]:
# 형변환 함수
strTemp = '100'
print('type - ', type(int(strTemp)))
type - <class 'int'>
In [6]:
# 다중라인 출력
query = f"""select *
from table
where id = admin or 1 = 1"""
print(query)
msg = f"""
[user login Report]
===================
ID : sk
Time : 2025-10-27
STATUS : success
"""
print(msg)
select *
from table
where id = admin or 1 = 1
[user login Report]
===================
ID : sk
Time : 2025-10-27
STATUS : success
In [10]:
# 숫자 포맷
num = 1234567.8912
# Quiz : 천단위로 구분하고 싶다면
print(f"{num:,}")
# Quiz : 정렬
print(f"{num:>20.2f}") #오른쪽 정력 -> 20은 길이의 폭
print(f"{num:<20.2f}") #왼쪽 정렬
print(f"{num:020.2f}") #앞을 0으로 채워라
1,234,567.8912
1234567.89
1234567.89
00000000001234567.89
In [12]:
# 보안 관점에서 로그를 적용
# 이벤트로 수집된 데이터의 파싱을 용이하게 하기 위해서
# 탐지를 위한 규칙을 생성
# 변조된 데이터 식별을 쉽게하기 위함
loginUser = {
'type' : 'guest',
'ip' : '192.168.0.10',
'event': 'LOGIN_SUCCESS'
}
logMsg = f"[ALTER] User={loginUser["type"]} , IP = {loginUser["ip"]} , event = {loginUser["event"]}"
print(logMsg)
[ALTER] User=guest , IP = 192.168.0.10 , event = LOGIN_SUCCESS
In [15]:
logLst = []
print('type - ', type(logLst))
print()
print('dir - ', dir(logLst))
logLst.append(loginUser)
logLst.append(loginUser)
print()
print(logLst)
type - <class 'list'>
dir - ['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
[{'type': 'guest', 'ip': '192.168.0.10', 'event': 'LOGIN_SUCCESS'}, {'type': 'guest', 'ip': '192.168.0.10', 'event': 'LOGIN_SUCCESS'}]
In [17]:
logMsg = f"[ALTER] User={logLst[0]["type"]} , IP = {logLst[0]["ip"]} , event = {logLst[0]["event"]}"
print(logMsg)
logMsg = f"[ALTER] User={logLst[1]["type"]} , IP = {logLst[1]["ip"]} , event = {logLst[1]["event"]}"
print(logMsg)
[ALTER] User=guest , IP = 192.168.0.10 , event = LOGIN_SUCCESS [ALTER] User=guest , IP = 192.168.0.10 , event = LOGIN_SUCCESS
In [1]:
# bool : 참(True) / 거짓(False)
# 조건문, 비교, 논리 연산자에서 사용됨
# semi bool : 1 / 0
isLoggedIn = True
hasPermission = False
print('castring - ', int(isLoggedIn), type(isLoggedIn))
print('castring - ', int(hasPermission))
print('Trusy, Falsy')
print('castring - ', bool(1))
print('castring - ', bool(0))
print('castring - ', bool('')) # '' 비어있으면 False
print('castring - ', bool('a')) # '' 들어있으면 True
print('castring - ', bool([]))
print('castring - ', bool([1,2,3]))
castring - 1 <class 'bool'> castring - 0 Trusy, Falsy castring - True castring - False castring - False castring - True castring - False castring - True
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]: