so woon!

python_19일차 본문

Python/개념정리

python_19일차

xowoony 2022. 9. 2. 23:46

1. openpyxl 예제 04

# ### 셀에 내용 입력하기 ###
from openpyxl import load_workbook

wb = load_workbook(filename='테스트.xlsx')
ws = wb['시트1']   #시트 선택

ws['A4'] = '신사임당'       #1. 셀에 데이터를 직접 입력
ws['B4'] = '45'
ws['C4'] = '여자'

ws.append(['을지문덕', '60', '남자'])   #2. 다음 행(맨 마지막)에 데이터 입력

new_data_list = [['유관순', '16', '여자'], ['세종대왕', '60', '남자']]     #리스트 생성

for new_data in new_data_list:      #3. 반복문을 활용해 데이터 입력
    ws.append(new_data)

wb.save(filename='테스트_셀 내용 입력.xlsx')   #저장

===============실행결과===============

테스트.xlsx
테스트_셀 내용 입력.xlsx

 

 

 

 

 

### 행/열 삭제하기 ###
from openpyxl import load_workbook

wb = load_workbook(filename='테스트.xlsx')
ws = wb['시트1']   #시트 선택

ws.delete_rows(idx=2, amount=1)
ws.delete_cols(idx=2, amount=2)

wb.save(filename='테스트_행과 열의 삭제.xlsx')

===============실행결과===============

테스트.xlsx
테스트_행과 열의 삭제.xlsx

 

 

 

 

### 셀 복사하기 : 셀 하나의 값을 읽어 여러 셀에 복사해 넣기 ###
from openpyxl import load_workbook

wb = load_workbook(filename='테스트.xlsx')
ws = wb['시트1']   #시트 선택

src = ws['A2'].value     #A2셀 값을 변수에 저장    #이순신을 복사해서 src에 넣겠다
ws['A5'] = src          #A5셀에 A2 셀 값을 복사

for row in ws['A6:C6']:  #row는 변수명
    for cell in row:    #for문이 두번 쓰여야 함
        cell.value = src

wb.save(filename='테스트_셀 복사1.xlsx')

===============실행결과===============

테스트.xlsx
테스트_셀 복사1.xlsx

 


 

2. 그래프 01 - 무방향 그래프

### 무방향 그래프의 구현 ###

class Graph:
    def __init__(self, size):
        self.SIZE = size    #생성될 그래프의 크기(그래프의 정점 개수)
        self.graph = [[0 for _ in range(size)] for _ in range(size)]   #0으로 초기화된 2차원 배열
                                                        # #size번 만큼 0이 출력, 그걸 또 size번 출력


## 메인 코드 부분 ##
G1 = Graph(4)   #무방향 그래프로 사용할 G1 그래프 생성(간선없이 정점만 4개)
G1.graph[0][1] = 1; G1.graph[0][2] = 1; G1.graph[0][3] = 1   #정점 A 출발 #여러줄을 옆으로 쓸때 세미콜론을 붙인다.
G1.graph[1][0] = 1; G1.graph[1][2] = 1  #정점 B 출발
G1.graph[2][0] = 1; G1.graph[2][1] = 1; G1.graph[2][3] = 1   #정점 C출발
G1.graph[3][0] = 1; G1.graph[3][2] = 1  #정점 D 출발

print('** G1 무방향 그래프 **')
for row in range(4):    #4 X 4 인접행렬 출력
    for col in range(4):
        print(G1.graph[row][col], end=' ')
    print()    #00 01 02 03 끝나고 Enter 10 11 12 13 Enter...

===========실행결과===========

** G1 무방향 그래프 **
0 1 1 1 
1 0 1 0 
1 1 0 1 
1 0 1 0 

 

3. 그래프 02 - 방향 그래프

### 방향 그래프의 구현 ###
class Graph:
    def __init__(self, size):
        self.SIZE = size
        self.graph = [[0 for _ in range(size)] for _ in range(size)]



## 메인 코드 부분 ##
G3 = Graph(4)       #방향 그래프로 사용할 G3 그래프 생성(간선 없이 정점만 4개)
G3.graph[0][1] = 1; G3.graph[0][2] = 1  #정점 A 출발
G3.graph[3][0] = 1; G3.graph[3][2] = 1  #정점 D 출발

print('** G3 방향 그래프 **')
for row in range(4):  #4개 정점이라서 4로 지정
    for col in range(4):
        print(G3.graph[row][col], end=' ')
    print()

===========실행결과===========

** G3 방향 그래프 **
0 1 1 0 
0 0 0 0 
0 0 0 0 
1 0 1 0 

 


4. 이진트리 02 - 이진탐색트리

### 이진 탐색 트리 구현 ###
class TreeNode:
    def __init__(self):
        self.left = None
        self.data = None
        self.right = None
memory = []
root = None   #전역 변수  #제일 위에 있는 녀석을 가리킴
nameAry = ['블랙핑크', '레드벨벳', '마마무', '에이핑크', '걸스데이', '트와이스']




### 메인 코드 부분###
node = TreeNode()   #노드 생성
node.data = nameAry[0]   #블랙핑크가 들어가게 되고 블랙핑크가 루트가 됨
root = node             #첫번째 노드를 루트 노드로 지정함.
memory.append(node)     #생성한 노드를 메모리에 저장


for name in nameAry[1:]:        #nameAry 두번 째부터 노드 처리
    node = TreeNode()           #새 노드 생성
    node.data = name            #새 노드에 데이터 입력
    current = root              #현재 작업 노드를 루트 노드로 지정
    while True:
        if name < current.data:     #입력할 값을 현재 작업 노드의 값과 비교
            if current.left == None:    #현재 작업 노드의 왼쪽이 비어있는지 확인 (비어있으면 왼쪽으로 들어갈 예정)
                current.left == node    #새 노드를 현재 작업 노드의 왼쪽 링크에 연결
                break                   #무한 반복 종료
            current = current.left      #왼쪽 서브 트리를 현재 작업 노드로 변경하고 다시 진행

        else:                           #새 작업 노드가 더 클 경우
            if current.right == None:   #오른쪽이 비어있는지 확인
                current.right = node    #새 노드를 현재 작업 노드의 오른쪽 링크에 연결
                break                   #무한 반복 종료
            current = current.right     #오른쪽 서브 트리를 현재 노드로 변경하고 다시 진행
    memory.append(node)

print('이진 탐색 트리 구성 완료!')

===========실행결과===========

이진 탐색 트리 구성 완료!

 

 

5. 이진트리 03 - 이진탐색트리의 검색

### 이진 탐색 트리 검색 ###
class TreeNode:
    def __init__(self):
        self.left = None
        self.data = None
        self.right = None
memory = []
root = None   #전역 변수  #제일 위에 있는 녀석을 가리킴
nameAry = ['블랙핑크', '레드벨벳', '마마무', '에이핑크', '걸스데이', '트와이스']




### 메인 코드 부분###
node = TreeNode()   #노드 생성
node.data = nameAry[0]   #블랙핑크가 들어가게 되고 블랙핑크가 루트가 됨
root = node             #첫번째 노드를 루트 노드로 지정함.
memory.append(node)     #생성한 노드를 메모리에 저장


for name in nameAry[1:]:        #nameAry 두번 째부터 노드 처리
    node = TreeNode()           #새 노드 생성
    node.data = name            #새 노드에 데이터 입력
    current = root              #현재 작업 노드를 루트 노드로 지정
    while True:
        if name < current.data:     #입력할 값을 현재 작업 노드의 값과 비교
            if current.left == None:    #현재 작업 노드의 왼쪽이 비어있는지 확인 (비어있으면 왼쪽으로 들어갈 예정)
                current.left = node    #새 노드를 현재 작업 노드의 왼쪽 링크에 연결
                break                   #무한 반복 종료
            current = current.left      #왼쪽 서브 트리를 현재 작업 노드로 변경하고 다시 진행

        else:                           #새 작업 노드가 더 클 경우
            if current.right == None:   #오른쪽이 비어있는지 확인
                current.right = node    #새 노드를 현재 작업 노드의 오른쪽 링크에 연결
                break                   #무한 반복 종료
            current = current.right     #오른쪽 서브 트리를 현재 노드로 변경하고 다시 진행
    memory.append(node)

print('이진 탐색 트리 구성 완료!')

findName = input('찾을 그룹 이름?? ')  #입력한 값은 findName에 담김
current = root   #current를 root로 지정
while True:     #비교해서 더 작은 값이 왼쪽, 큰 값이 오른쪽으로 가게하는 방법
    if findName == current.data:    #데이터를 찾으면 종료
        print(findName, '을(를) 찾음!')
        break
    elif findName < current.data:   #찾을 데이터가 더 작으면
        if current.left == None:    #왼쪽 링크가 비어있다면 못 찾은 것으로 하고 종료
            print(findName, '이(가) 트리에 없음!')
            break
        current = current.left      #왼쪽 서브트리를 현재 작업노드로 변경하고 다시 진행
    else:       #찾을 데이터가 더 큰 경우
        if current.right == None:   #오른쪽 링크가 비어있다면 못 찾은 것으로 하고 종료
            print(findName, '이(가) 트리에 없음!')
            break
        current = current.right   #오른쪽 서브트리를 현재 노드로 변경하고 다시 진행

===========실행결과===========

이진 탐색 트리 구성 완료!
찾을 그룹 이름?? 마마무
마마무 을(를) 찾음!

===========실행결과===========

이진 탐색 트리 구성 완료!
찾을 그룹 이름?? AOA
AOA 이(가) 트리에 없음!

 


6. 재귀호출 01

### 재귀호출 함수 기본 ##
# (반복적인 것을 호출할 때 많이 사용)
# 실무에서 선호하지는 않지만 때론 필요할 경우가 있음
# 코테에서 많이 나옴

def openbox():
    print('종이 상자를 엽니다!')
    openbox()   #함수 자신을 호출(재귀 호출) #계속 부르는 형태

openbox()       #함수를 처음 호출

===========실행결과===========

종이 상자를 엽니다!
종이 상자를 엽니다!
종이 상자를 엽니다!
종이 상자를 엽니다!
종이 상자를 엽니다!...그리고 에러가 뜬다.

 

7. 재귀호출 02

### 반환 조건을 추가한 재귀 호출 함수 ###  (종료조건을 만들어주기 - 무한으로 나오는 것 방지)
count = 10  #전역변수

def openBox():
    global count    #전역변수의 count
    print('종이 상자를 엽니다!!')
    count -= 1
    if count == 0:           #반환 조건
        print('** 반지를 넣고 반환합니다!! **') #이거 나온 후 되돌아가며 출력안됐던 닫습니다 문구가 출력됨
        return      #반환
    openBox()   #재귀 호출
    print('종이 상자를 닫습니다!!')

openBox()   #함수호출

===========실행결과===========

종이 상자를 엽니다!!
종이 상자를 엽니다!!
종이 상자를 엽니다!!
종이 상자를 엽니다!!
종이 상자를 엽니다!!
종이 상자를 엽니다!!
종이 상자를 엽니다!!
종이 상자를 엽니다!!
종이 상자를 엽니다!!
종이 상자를 엽니다!!
** 반지를 넣고 반환합니다!! **
종이 상자를 닫습니다!!
종이 상자를 닫습니다!!
종이 상자를 닫습니다!!
종이 상자를 닫습니다!!
종이 상자를 닫습니다!!
종이 상자를 닫습니다!!
종이 상자를 닫습니다!!
종이 상자를 닫습니다!!
종이 상자를 닫습니다!!

 

8. 재귀호출 03

### 10부터 1까지의 합계를 재귀 호출로 구현하기 ###
def addNumber(num):
    if num <= 1:    #num이 1이하면 1을 반환
        return 1
    #그렇지 않으면 num-1을 재귀호출하고 num과 더한 값을 반환
    return num + addNumber(num-1)
    #10 + (9+8+7...1 나오고 나머지 다 더하고 종료됨)
print(addNumber(10))

===========실행결과===========

55

 

 

9. 재귀호출 04

### 카운트 다운을 재귀 호출로 구현 ###
def countDown(n):   #매개변수n:카운트다운할 숫자
    if n == 0:
        print('발사!!')
    else:
        print(n)
        countDown(n-1)  #숫자-1 재귀 호출
    ##재귀호출 밑에 마저 처리할 코드가 없으므로 그냥 발사!!나오고 종료됨
countDown(5)

===========실행결과===========
5
4
3
2
1
발사!!

 

10. 재귀호출 05

### 구구단 출력을 재귀 호출로 구현하기 ###
def gugu(dan, num):
    print(f'{dan} X {num} = {dan * num}')
    if num < 9:   #곱할 숫자(num)가 9보다 작다면 함수를 재귀호출
        gugu(dan, num+1)   #재귀호출

for dan in range(2, 10):   #2단부터 9단까지
    print(f'##{dan}단##')
    gugu(dan, 1)

===========실행결과===========
##2단##
2 X 1 = 2
2 X 2 = 4
2 X 3 = 6
2 X 4 = 8
2 X 5 = 10
2 X 6 = 12
2 X 7 = 14
2 X 8 = 16
2 X 9 = 18
##3단##
3 X 1 = 3
3 X 2 = 6
3 X 3 = 9
3 X 4 = 12
3 X 5 = 15
3 X 6 = 18
3 X 7 = 21
3 X 8 = 24
3 X 9 = 27
##4단##
4 X 1 = 4
4 X 2 = 8
4 X 3 = 12
4 X 4 = 16
4 X 5 = 20
4 X 6 = 24
4 X 7 = 28
4 X 8 = 32
4 X 9 = 36
##5단##
5 X 1 = 5
5 X 2 = 10
5 X 3 = 15
5 X 4 = 20
5 X 5 = 25
5 X 6 = 30
5 X 7 = 35
5 X 8 = 40
5 X 9 = 45
##6단##
6 X 1 = 6
6 X 2 = 12
6 X 3 = 18
6 X 4 = 24
6 X 5 = 30
6 X 6 = 36
6 X 7 = 42
6 X 8 = 48
6 X 9 = 54
##7단##
7 X 1 = 7
7 X 2 = 14
7 X 3 = 21
7 X 4 = 28
7 X 5 = 35
7 X 6 = 42
7 X 7 = 49
7 X 8 = 56
7 X 9 = 63
##8단##
8 X 1 = 8
8 X 2 = 16
8 X 3 = 24
8 X 4 = 32
8 X 5 = 40
8 X 6 = 48
8 X 7 = 56
8 X 8 = 64
8 X 9 = 72
##9단##
9 X 1 = 9
9 X 2 = 18
9 X 3 = 27
9 X 4 = 36
9 X 5 = 45
9 X 6 = 54
9 X 7 = 63
9 X 8 = 72
9 X 9 = 81


 

11. 재귀호출 06

### 회문 여부 구별하기 ###
### 회문(Palindrome) : 앞에서부터 읽든 뒤어서부터 읽든 동일한 단어나 문장을 의미 ###
strAray = ['reaver', 'kayak', 'Borrow or rob', '주유소의 소유주',
           '야 너 이번 주 주번이 너야', '살금 살금']

def palindrome(pStr):
    if len(pStr) <= 1:  #문자열의 길이가 1 이하라면 회문으로 처리
        return True
    if pStr[0] != pStr[-1]:   #문자열의 맨 앞과 마지막 글자가 다르면
        return False            #회문이 아닌 것으로 처리
    # 회문 여부가 결정되지 않았다면, 앞뒤 한 칸씩 잘라내고 다시 재귀 함수 호출
    return palindrome(pStr[1:len(pStr)-1])

for testStr in strAray:
    print(testStr, end='-->')
    testStr = testStr.lower().replace(' ', '')   #소문자로 만든 후 사이의 공백을 제거
    if palindrome(testStr):
        print('O')
    else:
        print('X')

===========실행결과===========

reaver-->X
kayak-->O
Borrow or rob-->O
주유소의 소유주-->O
야 너 이번 주 주번이 너야-->O
살금 살금-->X






오늘의 참고사이트
visualgo.net

'Python > 개념정리' 카테고리의 다른 글

python_20일차  (0) 2022.09.05
python_18일차  (0) 2022.09.01
python_17일차  (0) 2022.08.30
python_16일차  (0) 2022.08.27
python_15일차  (1) 2022.08.24
Comments