코드 분석하는데 조금 오래 걸렸다.
블로그와 gpt를 이용해서 이해가 되지 않은 부분들을
집중 분석했다. 졸리다...^^

import time
def getTime():
lt = time.localtime() #현재 시간을 가져온다.
st = time.strftime('%Y-%m-%d %H:%M:%S') #strftime()에서 사용되는 형식 지정자 %I:시간 %M:분 %S:초 %p:오전 , 오후
return st
while True:
selectNumber = int(input('1.입금,\t 2.출금, \t 3.종료'))
if selectNumber == 1:
money = int(input('입금액 입력:'))
with open('C:/pythonTxt/bank/money.txt', 'r') as f: #읽기 모드로 열고 객체를 f로 지정한다.
m = f.read()
if m == '': #파일을 읽었는데 비어있으면 0으로 초기화 한다.
m = '0'
with open('C:/pythonTxt/bank/money.txt', 'w') as f:#쓰기모드로 파일 오픈
f.write(str(int(m) + money))# 파일에 기존 금액(m)에 새로운 입금액을 더한 값을 문자열로 변환
#m money.txt파일을 읽은 후 저장도니 문자열 형태의 기존 잔액을 나타낸다.
memo = input('입금 내역 입력:')
with open('C:/pythonTxt/bank/poketMoneyRegister.txt', 'a') as f: #파일 이어쓰기 a사용해서 열고 객체를 f로 지정
f.write('------------------------------\n')
f.write(f'{getTime()}\n')#현재 시간을 가져온다 (getTime함수)
f.write(f'[입금] {memo}: {str(money)}원\n')#입금 내역과 금액을 파일에 기록
f.write(f'[잔액] {memo}: {str(int(m) + money)}원\n')#잔액 내역과 금액을 파일에 기록
print('입금 완료!!')
print(f'기존 잔액: {m}')
print(f'입금 후 잔액: {int(m) + money}')
elif selectNumber == 2:
money = int(input('출금액 입력:'))
with open('C:/pythonTxt/bank/money.txt', 'r') as f:
m = f.read()
if m == '':
m = '0'
with open('C:/pythonTxt/bank/money.txt', 'w') as f:
f.write(str(int(m) - money))
memo = input('출금 내역 입력:')
with open('C:/pythonTxt/bank/poketMoneyRegister.txt', 'a') as f:
f.write('------------------------------\n')
f.write(f'{getTime()}\n')
f.write(f'[출금] {memo}: {str(money)}원\n')
f.write(f'[잔액] {memo}: {str(int(m) - money)}원\n')
print('입금 완료!!')
print(f'기존 잔액: {m}')
print(f'출금 후 잔액: {int(m)- money}')
elif selectNumber == 3:
print('BYE~')
break
else:
print('다시 입력하세요!')

#약수 구하기
inputNumber = int(input('0보다 큰 정수 입력:'))
#약수
divisor = [] #약수 저장
for number in range(1, (inputNumber + 1)):
if inputNumber % number == 0: # 약수확인 반복문 나머지가 0이면 약수
divisor.append(number) #반복문에서 얻은 약수를 divisor 리스트에 저장
if len(divisor) > 0:
try:
with open('C:/pythonTxt/divisor.txt', 'a') as f:
f.write(f'{inputNumber}의 약수:')
f.write(f'{divisor} \n')
except Exception as e: # 문제 발생시 어떤 예외가 발생했는지 알기위해 Exception 사용
print(e)
else:
print('divisor write complete!')

# #소수
inputNumber = int(input('0보다 큰 정수 입력:'))
prime = [] #소수 저장하기 위한 리스트 생성
for number in range(2, (inputNumber + 1)):
flag = True #소수 여부를 위해 True 초기화
for n in range(2, number):
if number % n == 0:
flag = False #숫자가 나누어지면 flag를 False로 변경하고 break로 반복문 종료
break #
if flag:#True인 경우 숫자는 소수이므로 prime리스트에 append함수로 추가한다.
prime.append(number)
if len(prime) > 0: #리스트 길이가 0보다 큰경우 소수가 있으므로 파일에 소수 저장
try: #0보다 작으면 else로 간다.
with open('C:/pythonTxt/prime.txt', 'a') as f: #쓰기 a로 실행
f.write(f'{inputNumber}까지의 소수:')
f.write(f'{prime} \n')
except Exception as e: #에러 메시지 발생
print(e)
else:
print('prime write complete')

#수 두개의 공약수
num1 = int(input('1보다 큰 정수 입력: '))
num2 = int(input('1보다 큰 정수 입력: '))
common = [] #두 정수의 공약수를 저장하기 위한 공간
for i in range(1, (num1+1)):
if num1 % i ==0 and num2 % i ==0 :# i로 나누어떨어지는지 확인한다. 두 수의 공약수 판별
common.append(i) #조건문이 참이면 common 리스트에 i를 추가한다.
if len(common) > 0: # 0보다 크다는건 공약수를 찾았다는것(공약수가 존재하면 다음 작업 수행)
try:
with open('C:/pythonTxt/common.txt', 'a') as f:
f.write(f'{num1}과 {num2}의 공약수: ')
f.write(f'{common}\n')
except Exception as e:
print(e)
else:
print('common factor write complete!')

# # 수 두개의 최대공약수
num1 = int(input('1보다 큰 정수 입력: '))
num2 = int(input('1보다 큰 정수 입력: '))
maxComNum = 0
for i in range(1, (num1+ 1)):
if num1 % i ==0 and num2 % i ==0 :
maxComNum = i #위에서 얻은 i값을 maxComNum최대 공약수 변수에 초기화
try:
with open('C:/pythonTxt/maxComNum.txt', 'a') as f:
f.write(f'{num1}과 {num2}의 최대 공약수: {maxComNum}\n ')
except Exception as e:# try에서 예외 발생하면 실행
print(e)
#예외가 ZeroDivisionError 종류면 e에는 ZeroDivisionError가 들어있을것이다.
else:
print('max common factor write complete!')

inputNumber = int(input('0보다 큰 정수 입력:'))
#약수
divisor = [] #약수 저장
for number in range(1, (inputNumber + 1)):
if inputNumber % number == 0: # 약수확인 반복문 나머지가 0이면 약수
divisor.append(number) #반복문에서 얻은 약수를 divisor 리스트에 저장
if len(divisor) > 0:
try:
with open('C:/pythonTxt/divisor.txt', 'a') as f:
f.write(f'{inputNumber}의 약수:')
f.write(f'{divisor} \n')
except Exception as e: # 문제 발생시 어떤 예외가 발생했는지 알기위해 Exception 사용
print(e)
else:
print('divisor write complete!')

#수 두개의 공약수
num1 = int(input('1보다 큰 정수 입력: '))
num2 = int(input('1보다 큰 정수 입력: '))
common = [] #두 정수의 공약수를 저장하기 위한 공간
for i in range(1, (num1+1)):
if num1 % i ==0 and num2 % i ==0 :# i로 나누어떨어지는지 확인한다. 두 수의 공약수 판별
common.append(i) #조건문이 참이면 common 리스트에 i를 추가한다.
if len(common) > 0: # 0보다 크다는건 공약수를 찾았다는것(공약수가 존재하면 다음 작업 수행)
try: #예외처리
with open('C:/pythonTxt/common.txt', 'a') as f:
f.write(f'{num1}과 {num2}의 공약수: ')
f.write(f'{common}\n')
except Exception as e:
print(e)
else:
print('common factor write complete!')

#배 입항 날짜
ship1= 3
ship2 = 4
ship3 = 5
maxDay = 0 #최대 공약수 초기값
for i in range(1, (ship1 + 1)): #1번배가 들어오는날까지 최대 공약수 구하기
if ship1 % i == 0 and ship2 % i ==0: #ship1,ship2가 나누어떨어지면 maxDay변수에저장
maxDay = i #1,2번 선박의 최대 공약수이다.(maxDay 최대 공약수)
minDay = (ship1 * ship2) // maxDay #최소 공배수
newDay = minDay
for i in range(1, (newDay + 1)):
if newDay % i == 0 and ship3 % i == 0:
maxDay = i #ship1,ship2,ship3의 최대 공약수
minDay = (newDay * ship3) // maxDay #배 3개에 대한 최소 공배수
print(f'minDay: {minDay}') # 최소 공배수 출력
print(f'maxDay: {maxDay}') # 최대 공약수 출력
from datetime import datetime
from datetime import timedelta
n = 1
baseTime = datetime(2021, 1, 1, 10, 0, 0)#현시간이 아닌 21년1월1일10시0분0초 기준
#입항일 계산 위한 기준시간
with open('C:/pythonTxt/arrive.txt', 'a') as f:
f.write(f'2021년 모든 선박 입항일 \n')
f.write(f'{baseTime} \n')
nextTime = baseTime + timedelta(days=minDay) #다음 입항일을 계산하는데 사용
while True: #기록을 계속 반복
with open('C:/pythonTxt/arrive.txt', 'a') as f:
f.write(f'{nextTime}\n')
nextTime = nextTime + timedelta(days=minDay)
if nextTime.year > 2021:
break

inputNumber = int(input('0보다 큰 정수 입력: '))
for number in range(1, inputNumber + 1):
if inputNumber % number == 0: # 사용자 입력값의 나머지가 0이되면 약수가 된다.
print('{}의 약수: {}'.format(inputNumber, number))

inputNumber = int(input('0보다 큰 정수 입력: '))
for number in range(2, inputNumber+1): #1은 소수가 아님으로 범위 지정을 2부터 시작한다..
flag =True
for n in range(2, number):
if number % n ==0 :
flag =False
break
if flag:
print('{}: 소수!!'.format(number))
else:
print('{}: 합성수!!'.format(number))

소인수 구하기
inputNumber = int(input('1보다 큰 정수 입력:'))
n = 2 #소인수분해에서 가장작은수 2 (1은 제외)
while n <= inputNumber:
if inputNumber % n ==0:
print('소인수: {}'.format(n))
inputNumber /= n #12 들어가면 2*6인데2는출력되고 6은 또 반복이 돈다 6은 -->2*3 --> 즉 먼저내려간다 2, 2*3 답은 2,2,3출력
else:
n +=1

inputNumber = int(input('1보다 큰 정수 입력:'))
n = 2 #소인수분해는 2부터 시작함으로 n=2
searchNumbers = [] #x에 해당하는 정수들을 저장할 공간 리스트를 만들었다.
while n <= inputNumber: #소인수분해를 계속해서 진행하는 조건식
if inputNumber % n ==0: #n이 inpurtNumber의 소인수인지 확인
print('소인수: {}'.format(n))
if searchNumbers.count(n) == 0:#count 매개변수에 어떤 숫자를 던지면 숫자가 해당리스트에 몇개가 있는지 반환한다.
#리스트에 n이 존재하지 않은 경우 확인
#0의 의미는 n이 searchNumbers에 없다는뜻
searchNumbers.append(n)# 소인수를 저장
elif searchNumbers.count(n) == 1: #리스트에 n이 한번 등장한 경우 확인
searchNumbers.remove(n) #홀수를 구해야함으로 remove사용 예를들어 []에 2가2개있으면 제곱으로 뜨기에.. 필요한건 홀수여서
inputNumber /= n #n을 소인수로 찾았으므로 inputNumber를 해당 소인수로 나누어 다음 소인수를 찾는다.
else:
n +=1
print('searchNumbers:{}'.format(searchNumbers))

inputNumbers = input('두 개의 1보다 큰 정수 입력: ')
num1, num2 = map(int, inputNumbers.split())
maxNum = 0 #최대 공약수의 값을 받아줄 변수
for i in range(1, (num1 + 1)):
if num1 % i == 0 and num2 % i == 0:
print('공약수: {}'.format(i))
maxNum = i
print('최대공약수: {}'.format(maxNum))

num1 = int(input('1보다 큰 정수 입력:'))
num2 = int(input('1보다 큰 정수 입력:'))
maxNum = 0
for i in range(1, num1+1): #최대 공약수 먼저 구하기
if num1 % i ==0 and num2 % i ==0:
print('공약수:{}'.format(i))
maxNum = i #최대공약수 저장됨
print('최대공약수:{}'.format(maxNum))
minNum = (num1 * num2) // maxNum # 입력 값을 곱하고 최대공약수를 나눈 몫을 구하고 minNum에 초기화 한다.
print('최소공배수:{}'.format(minNum))

dNum = 20
#2진수 bin 8진수 oct 16진수 hex
print('2진수: {}'.format(type(bin(dNum))))
print('8진수: {}'.format(type(oct(dNum))))
print('16진수: {}'.format(type(hex(dNum))))
print('2진수: {}'.format(format(dNum, '#b'))) #2진수 # b
print('8진수: {}'.format(format(dNum, '#o'))) #8진수 # o
print('16진수: {}'.format(format(dNum, '#x'))) #16진수 #x
print('{0:#b}, {0:#o}. {0:#x}'.format(dNum, dNum,dNum))
#진수의 숫자만 출력하기
print('2진수: {}'.format(format(dNum, 'b')))
print('8진수: {}'.format(format(dNum, '#')))
print('16진수: {}'.format(format(dNum, 'x')))
반복문 사용하여 등차수열 구하기

#반복문으로 등차 수열 구하기
inputN1 = int(input('a1 입력: '))
inputD = int(input('공차 입력: '))
inputN = int(input('n 입력: ')) #구하고자 하는 n번째 값을 구한다.ex)7번째 :20
valueN = 0 #결과값 저장 변수
n = 1
while n <=inputN: #구하고자 하는 N항까지반복한다.
if n ==1:
valueN = inputN1 #첫항a1을 2 --> valueN = 2
print('{}번째 항의 값: {}'.format(n, valueN))
n +=1
continue
valueN += inputD #위에서 구한 valueN에 값(2)을 더한다.
#valueN=2 + 3 --> valueN =5 2번째항 5 출력
#3을 더하는 이유는 공차가 3이기 떄문
print('{}번째 항의 값: {}'.format(n, valueN))
n +=1
print('{}번째 항의 값: {}'.format(inputN, valueN))
등차수열 공식 사용

inputN1 = int(input('a1 입력:'))
inputD = int(input('공차 입력: '))
inputN = int(input('n 입력: '))
valueN = 0
# an = a1 + (n-1)d
valueN = inputN1 + (inputN - 1) * inputD
print('{}번째 항의 값: {}'.format(inputN, valueN))
정말 잘 읽었습니다, 고맙습니다!