일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- sup태그
- not 의사클래스
- 인접 형제 결합자
- iframe 태그
- 자식결합자
- html 태그
- br 태그
- RGBA
- i 태그
- tag html
- id 선택자
- 아두이노
- html
- height속성
- 일반 형제 결합자
- 임베디드
- Live Server
- go live
- RGB
- width속성
- 전체 선택자
- reveal in file explorer
- focus 의사클래스
- iframe
- Checked 의사 클래스
- css
- sub태그
- padding 속성
- html tag i
- background-color 속성
- Today
- Total
so woon!
python_19일차 본문
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') #저장
===============실행결과===============
### 행/열 삭제하기 ###
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')
===============실행결과===============
### 셀 복사하기 : 셀 하나의 값을 읽어 여러 셀에 복사해 넣기 ###
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')
===============실행결과===============
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 |