봉지라면의 봉지 속 이야기

BongjiNoodle's Packet Inside Story

나의 진솔담백한 이야기

컴퓨터공학/데이터분석기초실습

데이터분석기초실습] 3. 파이썬 되짚기② (자료구조, 제어 및 반복문, 함수)

봉지라면 2022. 11. 3. 20:42
반응형

파이썬 되짚기②

  • 자료구조
    튜플, 세트(집합), 딕셔너리
  • 제어 및 반복문
    if, while, for 문
  • 함수
    객체, 함수

 

 

 

 

 

 

 

 

 


자료구조

튜플(Tuple)이란?

리스트와 유사한 구조를 가진 자료구조

 

리스트에 비해 구조가 단순하고 접근 속도가 빠름

  • 튜플은 불변속성(속성의 내용을 변경할 수 없는) 객체

직접 변경할 수 없으며 리스트와 같이 append, insert 등의 함수 사용 불가 (read-only)

tuple=(1,2,3,4,5)
print(tuple)

print(type(tuple))
print(tuple[0])

'''
출력 결과
(1, 2, 3, 4, 5)
<class 'tuple'>
1
'''

 

불변속성 객체(immutable object)이므로 튜플의 요소를 변경하게 되면 에러 발생

 

튜플을 사용하는 주요 이유 (Comparison with Python List)

  • 리스트는 C언어에서 배열(array)과 비슷함, 튜플은 구조체와 비슷함
    (즉, 리스트를 선언할 때 Python에서는 동적으로 메모리를 설정하여 리스트 공간을 설정하며, 할당된 리스트 공간이 꽉 찬 경우 데이터를 추가하려고 하면 메모리 공간 사이즈를 더블링(doubling)해서 설정)
  • 불변속성
    자료가 변하지 않는 특성으로 인해 Dictionary의 키 값으로 활용 가능
    (데이터가 변하지 않는 형태라면 튜플 구조 사용)
  • iteration 연산 시 tuple이 List보다 더 빠름 (복잡도가 높을 경우)

튜플(Tuple)의 기본 연산

튜플 전체 데이터 수 검색

  • Count: 해당하는 데이터 수 검색
  • Index: 해당하는 데이터 인덱스 번호 검색

 

Count 함수

tuple=(100,200,300,400,500,100,300,500)
print(tuple)

print(tuple.count(300))

'''
출력 결과
(100,200,300,400,500,100,300,500)
2
'''

 

Index 함수

tuple=(100,200,300,400,500)
print(tuple)

print(tuple.index(300))

'''
출력 결과
(100,200,300,400,500)
2
'''

 


튜플 슬라이싱(Tuple Slicing)

투플은 리스트와 같이 데이터 슬라이싱이 가능

 

data 변수에 저장되었을 경우 data[start:end:step]까지의 값을 표현

tuple=(0,1,2,3,4,5,6,7,8)
print(tuple)		#(0,1,2,3,4,5,6,7,8)

print(tuple[1:4])	#(1,2,3)
print(tuple[1:-1])	#(1,2,3,4,5,6)
print(tuple[:2])	#(0,1)
print(tuple[2:])	#(2,3,4,5,6,7)
print(tuple[0::3])	#(0,3,6)
tuple=(0,1,(2,3),(4,5))

print(tuple[3])		#(4,5)
print(tuple[3][1])	#(5)

print(tuple[-1])	#(4,5)
print(tuple[-2])	#(2,3)

 

튜플 데이터 병합 : 덧셈 연산자 이용

tuple1=(1,2,3,4)
tuple2=(5,6,7,8)

tuple=tuple1+tuple2
print(tuple)

'''
출력 결과
(1,2,3,4,5,6,7,8)
'''

 

튜플 데이터 반복 : 곱셈 연산자 이용

tuple=(1,2,3,4)
print(tuple)

print(tuple*2)

'''
출력 결과
(1,2,3,4)
(1,2,3,4,1,2,3,4)
'''

 


Multiple Value에 대한 함수 리턴 값 활용

함수로부터 튜플 형태의 결과 값으로 리턴 받을 수 있음

def sum_and_product(x,y):
	return (x+y),(x*y)
    
sp=sum_and_product(2,3)
s,p=sum_and_product(5,10)

print(sp)
print(s,p)

'''
출력 결과
(5,6)
15 50
'''

 


데이터 교환(Swapping) 연산에 활용

변수의 값을 서로 교환하고자 할 때 튜플 기본 연산 활용 가능

x,y=1,2
print(x,y)

x,y=y,x
print(x,y)

'''
출력 결과
1, 2
2, 1
'''

 


세트(Set)란?

수학에서 배웠던 집합을 세트(set)라고 함

 

세트는 순서에 상관없고 중복을 허용하지 않는 자료구조

 

세트는 중괄호 기호 안에 항목들을 쉼표로 분리

set = {1,2,3}
print(set)
print(type(set))

'''
출력 결과

{2,3,1}
<class 'set'>
'''

 

세트 자동 정렬 및 중복 제거가 가능

set={2,1,3,3}

print(set)	#중복 제거 (print 함수로 출력하면 정렬이 안되어있음)
set		#중복 제거, 자동 정렬된 상태로 출력

'''
출력 결과
{2,1,3}
{1,2,3}
'''

 

세트의 경우 가변속성(변경가능한) 객체

  • 데이터 추가 및 삭제 가능

* 하지만 리스트와 튜플과는 다르게 세트는 인덱스가 없으므로 인덱싱이나 연산 불가

 

세트(set)를 사용하는 주요 이유(사용상 장점)

  • 검색의 효율성: 중복 허용X , 내부적 자동 정렬 때문에 item들에 대한 검색이 빠름
  • 중복이 제거된 Item Collection 생성

 


세트(Set)의 기본 연산

  • Set() 함수: 빈 세트 생성
  • Add 함수: 데이터 추가
  • Update 함수: 데이터 갱신
  • Remove 함수: 데이터 삭제
  • Clear 함수: 데이터 초기화

 

세트(Set) 생성

리스트로부터 세트 생성(중복된 요소 제거됨)

set([1,2,3,1,2])
#출력 결과: {1,2,3}

 

문자열로부터 세트 생성(각 문자는 하나의 요소가 됨)

set("abcdefa")
#출력 결과: {'f','a','b','e','c','d'}

 

Set() 함수 : 비어있는 세트 생성

number=set()

Add 함수 : 데이터 추가

data = {1,2,3,4,5,6}
print(data)

data.add(7)
print(data)

'''
출력 결과
{1,2,3,4,5,6}
{1,2,3,4,5,6,7}
'''

 

Update 함수 : 데이터 업데이트

data={1}
print(data)

data.update([2,3,4,5,6,7])
print(data)

'''
출력 결과
{1}
{1,2,3,4,5,6,7}
'''

 

Remove 함수 : 데이터 삭제

data={1,2,3,4,5,6}
print(data)

data.remove(6)
print(data)

'''
출력 결과
{1,2,3,4,5,6}
{1,2,3,4,5}
'''

 

Clear 함수 : 데이터 초기화

data={1,2,3,4,5,6}
print(data)

data.clear()
print(data)

'''
출력 결과
{1,2,3,4,5,6}
set()
'''

교집합(Intersection)

교집합의 경우 '&' 연산자 또는 intersection() 함수 사용

data1={1,2,3,4,5}
data2={1,3,5,7,9}

print(data1.intersection(data2))

'''
출력 결과
{1,3,5}
'''

 

차집합(Difference)

차집합의 경우 '-' 연산자 또는 difference() 함수 사용

data1={1,2,3,4,5}
data2={1,3,5,7,9}

print(data1.difference(data2))

'''
출력 결과
{2, 4}
'''

 

합집합(Union)

합집합의 경우 '|' 연산자 또는 union() 함수 사용

data1={1,2,3,4,5}
data2={1,3,5,7,9}

print(data1.union(data2))

'''
출력 결과
{1, 2, 3, 4, 5, 7, 9}
'''

 

대칭차집합(Symmetric Difference)

대칭차집합은 합집합에서 교집합을 뺀 집합

대칭차집합의 경우 '^'연산자 또는 symmetric_difference() 함수 사용

data1={1,2,3,4,5}
data2={1,3,5,7,9}

print(data1.symmetric_difference(data2))

'''
출력 결과
{2,4,7,9}
'''

 

부분집합(Issubset, Issuperset)

issubset() 함수: 상위 포함 관계

a={1,2,3,4,5}
b={1,2,3}

print(a.issubset(b))
print(b.issubset(a))

'''
출력 결과
False
True
'''

 

issuperset() 함수: 하위 포함 관계 

a={1,2,3,4,5}
b={1,2,3}

print(a.issuperset(b))
print(b.issuperset(a))

'''
출력 결과
True
False
'''

 

서로소(Isdisjoint)

isdisjoint 함수: 공통으로 포함하는 원소가 없는 집합

a={1,2,3}
b={4,5,6}

a.isdisjoint(b)

'''
출력 결과
True
'''
c={1,2,3}
d={3,4,5}

c.isdisjoint(d)

'''
출력 결과
False
'''

 


딕셔너리(Dictionary)란?

딕셔너리는 자료를 저장하는 자료구조로써, 키(Key)와 쌍(pair)인 값(value)을 사용하여 데이터를 저장

 

딕셔너리는 중괄호 안에 항목을 쉼표 분리시켜 나열

 

키를 이용한 검색(mapping) 및 정수 이외의 index를 사용할 수 있음

data={"사과":300, "배":200, "포도":500, "딸기":700}
print(data)
print(type(data))

'''
출력 결과
{'포도':500, '딸기':700, '사과':300, '배':200}
<class 'dict'>
'''

 


딕셔너리(Dictionary)의 기본 연산

항목 검색

대괄호 [] 또는 get(키 값) 함수 이용 (키에 대한 값을 반환)

* 만약 키가 없는 경우는 None을 반환

* 딕셔너리명 [ 밸류 값 ] 형태는 사용 불가

data={"사과":300, "배":200, "포도":500, "딸기":700}

print(data["사과"])
print(data.get("사과"))

'''
출력 결과
300
300
'''

 

항목 추가

[] 대괄호 내부 키 값을 지정하고, 추가할 항목 저장

* 주의] 딕셔너리 데이터 생성: {} / 딕셔너리 데이터 추가: []

* 주의] 딕셔너리에서 key값은 정해지면 변경 불가, value값은 변경 가능

data={"사과":300, "배":200, "포도":500, "딸기":700}
print(data)

data["메론"]=1000
print(data)

'''
출력 결과
{'포도':500, '딸기':700, '사과':300, '배':200}
{'포도':500, '딸기':700, '사과':300, '배':200, '메론':1000}
'''

 

항목 삭제

Pop()함수 내부에 삭제하고자 하는 Key값을 지정 후 삭제

data={"사과":300, "배":200, "포도":500, "딸기":700}
print(data)

data.pop("사과")
print(data)

'''
출력 결과
{'사과': 300, '배': 200, '포도': 500, '딸기': 700}
{'배': 200, '포도': 500, '딸기': 700}
'''

 

항목 정렬

Sorted 함수 사용

 

key값, values값 별로 정렬

data={"사과":300, "배":200, "포도":500, "딸기":700}
print(data)

print(sorted(data))
print(sorted(data.values()))

'''
출력 결과
{'사과': 300, '배': 200, '포도': 500, '딸기': 700}
['딸기', '배', '사과', '포도']
[200, 300, 500, 700]
'''

딕셔너리의 주요 함수

함수(메소드) 하는 일
keys() 딕셔너리 내의 모든 키 반환
values() 딕셔너리 내의 모든 값 반환
items() 딕셔너리 내의 모든 항목을 [키]:[값] 쌍으로 반환
get(key) 키에 대한 값을 반환
키가 없을 경우 None 반환
pop(key) 키에 대한 값을 반환, 그 항목 삭제
키가 없을 경우 KeyError 예외 발생
popitem() 제일 마지막에 입력된 항목을 반환, 그 항목 삭제
clear() 딕셔너리 내의 모든 항목 삭제

 


제어문 및 반복문

if문

if문은 데이터에서 조건이 일치하는 경우 실행되고 일치하지 않을 시 else 문이 실행

 

if문을 실행하기 위해서는 아래 코드와 같이 블록을 생성함

 

해당 조건이 맞을 때 첫 번째 블록에 해당하는 명령문1이 실행

 

맞지 않을 때 두 번째 블록 명령문2가 실행

 

if문을 구성할 때에는 항상 4개의 공백 후 블록문을 들여 쓰기 함

if 조건1:
	들여쓰기한 명령문
else :
	들여쓰기한 명령문

 

if문 예제

str=("문자열")	#str= ""로 대치해 볼 것
if bool(str):
	print("문자열 값이 있으면 True")
else:
	print("문자열 값이 빈 값이면 False, 실행 안 됨")
if h>50:
	print("50보다 크면 실행")
elif h<20:
	print("20보다 작으면 실행")
else:
	print("50보다 같거나 작고, 20과 같거나 크면 실행")
if (a*a + b*b > c*c):
	print("예각삼각형")
elif (a*a + b*b) < c*c:
	print("둔각삼각형")
else:
	print("직각삼각형")

 


while문

while문은 조건에 만족하는 값이 나올 때까지 명령문을 반복 수행

 

while문이 시작한 행은 반복문의 헤더라고 칭함

 

헤더의 조건문을 비교해 while문의 몸통 부분에 대해 코드의 조건에 만족하는 값이 나올 때까지 반복적으로 수행

 

무한루프가 되었을 경우

  • Ctrl+C(강제종료)로 벗어날 수 있음
  • break 문을 만나도 벗어날 수 있음
  • continue문을 만나면 skip 함
while 조건문:
	들여쓰기 한 명령문1

 

while문 예제

while True:
	response=input('숫자를 입력하세요: ')
    if int(response)%10==0:
    	print('10으로 나누었을 때 나머지가 0입니다.')
    	break
        
'''
출력 결과
숫자를 입력하세요: 2
숫자를 입력하세요: 5
숫자를 입력하세요: 7
숫자를 입력하세요: 9
숫자를 입력하세요: 10
10으로 나누었을 때 나머지가 0입니다.
'''
c=3
while c>0:
	response=input('숫자를 입력하세요: ')
    result=int(response)%10
    if result==0:
    	continue
    print("10으로 나눈 나머지는 {}입니다.".format(result))
    c -= 1 #c=c-1
    
'''
출력 결과
숫자를 입력하세요: 5
10으로 나눈 나머지는 5입니다.
숫자를 입력하세요: 3
10으로 나눈 나머지는 3입니다.
숫자를 입력하세요: 10
숫자를 입력하세요: 2
10으로 나눈 나머지는 2입니다.
'''

 


for문 (for-in)

for문은 리스트, 튜플, 문자열 등을 사용해 반복문 수행 가능

 

while문과는 비슷하지만 반복의 횟수를 정해놓고 반복 수행 가능

  • while문의 경우는 특정한 조건이 만족되면 계속 반복
for [할당하는 변수] in [데이터의 범위(리스트, 튜플, 문자열) 또는 정수]:
	들여쓰기 한 명령문1

 

range() 함수: 반복의 횟수

  • Iterable(반복가능)이 될 수 있는 것: list, set, tuple, dict, string, bytes, range
  • Iterable(반복가능)이 될 수 없는 것: float
for i in range(3):				#(1)
    print('봉지라면의 봉지 속 이야기')		#(2)
    print('방문을 환영합니다!')			#(2)
    
#range(3) 함수는 0,1,2까지의 숫자열을 반환

 


range (범위 / start, end, step)

  • for 문은 종료숫자와 같거나 크면 벗어남
  • 다음 숫자 = 현재 숫자 + step
  • step이 생략되면 default 값은 1
  • range(n) = range(0,n)

enumerate

  • 몇 번째 반복문인지 확인이 필요할 때 사용
  • Index와 collection 원소가 tuple로 출력됨

for문 예제 (continue vs. break)

st='I love Python Programming'

for ch in st:
	if ch in ['a','e','i','o','u', 'A','E','I','O','U']:
    	continue
    print(ch, end='')
    
'''
출력 결과
Iv Pythn Prgrmmng
'''

 


함수

함수란?

함수는 재사용 가능한 프로그램을 의미

 

def를 통해 함수를 정의하여 사용

 

return을 사용하여 최종적으로 사용할 값을 반환 (경우에 따라 생략 가능)

 

함수구조

  • 함수에 mutable한 인자를 전달하고 함수 내에서 객체를 변형하면, 함수 밖에서도 그 변화가 유지
def 함수명 (입력값):
	수행문1
    수행문2
    return 출력값
#위를 적용

def f(x):
	return x+10
f(2)

'''
출력 결과
12
'''

 

함수 전달인자(매개변수) 정의

  • def funtion_name(a,b=value):
        실행될 함수 내부 코드
  • Default 값이 정의된 전달 인자들은 Default 값이 정의되지 않은 전달 인자들 뒤에 써야 함
  • 전달 인자의 이름을 사용하면, 함수의 전달 인자 순서를 맞출 필요가 없음
#default 값을 정하지 않은 함수의 정의

def abc(a,b,c=0):
	return b,a,c
...

#이하 출력 결과
>>> abc(1,2,3)
(2,1,3)
>>> abc(1,3,c=4)
(3,1,4)
>>> abc(1,c=3,b=2)
(2,1,3)
>>>def abc(x, y=2,z):
#위와 같이 정의되지 않은 전달인자 앞에 쓰게 될 경우 오류 발생

'''
출력 결과 (오류)
File"<stdin>", line 1
SyntaxError: positional argument
follows keyword argument
'''

 

함수 예제

def weeklyPay(rate, hour):
    if (hour > 30):
        money = rate*30 + 1.5*rate*(hour-30)
    else:
        money = rate*hour
    return money
    
r = int(input("시급을 입력하시오: "))
h = int(input("근무 시간을 입력하시오: "))
print("주급은 " + str(weeklyPay(rate = r, hour = h)))

'''
실행 결과 ( 근무 시간이 30시간 미만일 경우 )
시급을 입력하시오: 10000
근무 시간을 입력하시오: 10
주급은 100000

실행 결과 ( 근무 시간이 30시간 이상일 경우 )
시급을 입력하시오: 10000
근무 시간을 입력하시오: 100
주급은 1350000.0
'''

 


람다(Lambda)함수란?

람다 함수는 이름이 없는 함수로 간단한 1회용 작업에 유용한 함수

  • 즉 복잡한 함수의 기능 및 명령어(def, return)을 쓰지 않고 한 줄로 만들 수 있는 함수

함수를 만들지 않고 함수화된 기능만 불러 사용하고자 할 경우가 있기에 람다 표현식(Lambda Expression)이라고도 함

 

일반함수와 람다함수의 차이

#일반 함수
def add(x,y):
	return x+y
    
#람다 함수
lambda x,y : x+y

 

만일 특정한 튜플에서 첫 항목만을 추출하는 람다 함수를 정의하려면 다음과 같이 할 수 있음

>>> t = (1,2,3)

>>> (lambda x: x[0])(t)
#실행결과 : 1

>>> (lambda x: x[1])(t)
#실행결과 : 2

위의 lambda x : x[0] 표현식은 임의의 항목을 가진 객체에 대하여 그 첫 번째 항목을 반환하는 기능

 

만일 x[1]을 반환하도록 하면, 아래와 같이 두 번째 항목인 전화번호를 가지고 정렬을 수행

>>> print(phone_book.items())
dict_items([('홍길동','010,1234-5678'),('강감찬','010,1234-5679'),('이순신','010-1234-5680')])

>>> 항목의 첫 인자인 이름을 기준으로 정렬: 한글 사전순
>>> sorted_phone_book1=sorted(phone_book.items(),key=lambda x: x[0])
>>> print(sorted_phone_book1)
([('강감찬','010,1234-5679'),('이순신','010-1234-5680'),('홍길동','010,1234-5678')]

>>> sorted_phone_book2=sorted(phone_book.items(),key=lambda x: x[1])
>>> print(sorted_phone_book2)
[('홍길동','010,1234-5678'),('강감찬','010,1234-5679'),('이순신','010-1234-5680')]

본 데이터분석기초실습은 [지능형 데이터 공학 및 응용 연구실 - 경상국립대학교 컴퓨터과학부]에서 수업한 자료를 토대로 정리하여 작성하였습니다.



반응형