1. 성적 데이터 파일을 읽어서 이름, 과목별 점수, 합계, 평균 정보 출력
출력 예시
이 름 국어 영어 수학 합계 평균
====== ==== ==== ==== ==== ====
홍길동 100 90 80 270 90
신길동 90 70 60 220 73 ⇐ 평균은 반올림
고길동 60 100 20 180 60
성적 데이터 파일을 읽기 위해서는 성적 데이터 파일이 있어야 하기 때문에 score_data.txt 파일에 이름과 성적을 적어 성적 데이터를 만들어 준다.
더보기
def calurate_sum(scores):
sum = 0
for score in scores:
sum += int(score)
return sum
def calurate_average(scores):
return int(calurate_sum(scores) / len(scores))
def print_data(name, scores, sum, average):
print(f"{name:3}", end=" ")
for score in scores:
print(f"{int(score):4}", end=" ")
print(f"{sum:4}", end=" ")
print(f"{average:4}")
with open('score_data.txt', 'r', encoding = 'utf-8') as file :
# 타이틀 출력
print('====== ==== ==== ==== ==== ====')
print('이 름 국어 영어 수학 합계 평균')
print('====== ==== ==== ==== ==== ====')
# 파일을 행 단위로 읽어서 처리
for line in file :
# 개행문자를 제거
line = line.strip()
# 공백문자를 기준으로 분리
datas = line.split()
# 이름을 추출
name = datas[0]
# 점수를 추출
scores = datas[1:]
# 합계를 계산
sum = calurate_sum(scores)
# 평균을 계산
average = calurate_average(scores)
# 이름, 점수, 합계, 평균을 출력
print_data(name, scores, sum, average)
- 기능들을 함수화 하여 코드를 단순화
2. 프로그램 실행 시 전달받은 문장에 포함된 글자의 사용 횟수를 계산해서 출력
1) 기본
출력 예시
python test.py "This is sample program"
입력 ⇒ This is sample program
T => 1
h => 1
i => 2
s => 3
:
더보기
import sys
sentence = sys.argv[1]
print(f"입력 => {sentence}")
# 글자(키)와 글자의 사용 횟수(값)를 가지는 딕셔너리
char_count = dict()
# 입력받은 문장에서 한 글자씩을 추출해서 딕셔너리에 추가
for char in sentence:
# 딕셔너리에 해당 글자가 존재하는 경우, 사용 횟수를 증가
if char in char_count:
char_count[char] = char_count[char] + 1
# 딕셔너리에 해당 글자가 존재하지 않는 경우, 사용 횟수로 1을 설정해서 추가
else:
char_count[char] = 1
# 딕셔너리를 순회하면서 출력
for char in char_count:
print(f"{char} => {char_count[char]}")
- 이 코드는 콘솔창에서 파일명과 인수를 같이 줘야 한다.
- test.py "This is an apple."
argv[0]은 파일 이름이기 때문에 argv[1]이 들어가고 다음 문장을 입력할 때는 따옴표로 묶어 줘야 argv[1]로 인식할 수 있다.
2) 위 프로그램을 대소문자를 구분하지 않은 알파벳과 그 횟수로 제한하고 알파벳 순으로 정렬해서 출력
출력 예시
C:\python> test.py "T & t is sampe char."
입력 => T & t is sampe char.
a => 2
c => 1
:
i => 1
s => 1
t => 2
더보기
import sys
sentence = sys.argv[1]
print(f"입력 => {sentence}")
char_count = dict()
for char in sentence:
# 알파벳을 소문자로 변경
char = char.lower()
# 알파벳이 아닌 경우 다음 글자를 처리
if char < 'a' or char > 'z':
continue
if char in char_count: char_count[char] = char_count[char] + 1
else: char_count[char] = 1
# 알파벳(키)을 기준으로 정렬한 결과를 출력
for key in sorted(char_count.keys()):
print(f"{key} => {char_count[key]}")
- 소문자로 변경 추가
- 공백, 특수문자 제외 추가
- 알파벳 정렬 추가
3) 위 프로그램을 가장 많이 나온 알파벳 순으로 출력
출력 예시
C:\python> test.py "T & t is same alphabet."
입력 => T & t is same alphabet.
3 => [ 'a', 't' ]
2 => [ 'e', 's' ]
1 => [ 'b', 'h', 'i', 'l', 'm' ]
더보기
import sys
sentence = sys.argv[1]
print(f"입력 => {sentence}")
char_count = dict()
for char in sentence:
char = char.lower()
if char < 'a' or char > 'z':
continue
if char in char_count: char_count[char] = char_count[char] + 1
else: char_count[char] = 1
# 횟수(숫자)를 키로 가지고, 문자 리스트를 값으로 가지는 딕셔너리를 정의
# { 3: ['a', 'b', 'c'], 2: ['x', 'y'] }
count_char = {}
for char in sorted(char_count.keys()):
count = char_count[char]
if count in count_char: count_char[count].append(char)
else: count_char[count] = [char]
# 회수(키) 내림차순으로 정렬해서 출력
for key in sorted(count_char.keys(), reverse=True):
print(f"{key} => {count_char[key]}")
3. 실습 프로그램 통합
출력 예시
=================
1. 행맨
2. 점수계산
3. 알파벳 카운터
Q. 종료
=================
실행할 프로그램의 번호를 입력 : 1
- 행맨, 시험 점수, 글자 카운터를 한 프로그램에서 이용할 수 있도록 통합
- 통합하기 위해서는 메인 페이지를 만들고 나머지 프로그램을 모듈화 한다.
- 모듈화한 프로그램을 메인 페이지에서 불러온다.
더보기
1) 행맨
import re
import random
def main() :
#words = input('여러 단어로 구성된 문장을 입력하세요. ')
words = "This is an optional feature. You can study at W3Schools without using My Learning."
print(f"입력 : {words}")
# 문장부호를 제거 ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~ \
words = re.sub(r'[!"#$%&\'()*+,-./:;<=>?@\[\]^_\`{|}~\\\\]', '', words)
# 공백문자를 기준으로 단어를 분리
words = words.split()
# 임의의 단어를 추출
rand_word = list(words[random.randrange(len(words))])
# 화면에 출력할 내용
disp_word = list('_' * len(rand_word))
print(f'힌트 >>> {''.join(disp_word)}')
try_count = 0
while True:
try_count += 1
alpha = input(f'{try_count} 시도 >>> 영어 단어를 구성하는 알파벳을 입력하세요. ')
for i, a in enumerate(rand_word):
if alpha == a:
disp_word[i] = alpha
print(f'힌트 >>> {''.join(disp_word)}')
if disp_word.count('_') == 0:
print(f'정답 "{''.join(rand_word)}"를 {try_count}번 만에 맞췄습니다.')
break
elif try_count >= 10:
print(f'10번에 기회가 모두 끝났습니다. 정답은 "{''.join(rand_word)}" 입니다.')
break
if __name__ == "__main__" :
main()
- def main()는 main() 함수를 호출해야 실행되도록 수정
- if __name__ == "__main__" : 는 모듈 import 시에는 실행되지 않도록 제한 모둘을 직접 실행했을 때만 실행
2) 점수
def calurate_sum(scores):
sum = 0
for score in scores:
sum += int(score)
return sum
def calurate_average(scores):
return int(calurate_sum(scores) / len(scores))
def print_title():
print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')
print('이 름 국어 영어 수학 합계 평균')
print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')
def print_tail():
print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')
def print_data(name, scores, sum, average):
print(f"{name:3}", end=" ")
for score in scores:
print(f"{int(score):4}", end=" ")
print(f"{sum:4}", end=" ")
print(f"{average:4}")
def main() :
with open('score_data.txt', 'r', encoding='utf-8') as file:
print_title()
for line in file:
line = line.strip()
datas = line.split()
name = datas[0]
scores = datas[1:]
sum = calurate_sum(scores)
average = calurate_average(scores)
print_data(name, scores, sum, average)
print_tail()
if __name__ == "__main__" :
main()
- def main() 실행 부분을 모듈화
3) 카운터
def main() :
sentence = input("문장을 입력하세요. ")
print(f"입력 => {sentence}")
char_count = dict()
for char in sentence:
char = char.lower()
if char < 'a' or char > 'z':
continue
if char in char_count: char_count[char] = char_count[char] + 1
else: char_count[char] = 1
# 회수(숫자)를 키로 가지고, 문자 리스트를 값으로 가지는 딕셔너리를 정의
# { 3: ['a', 'b', 'c'], 2: ['x', 'y'] }
count_char = {}
for char in sorted(char_count.keys()):
count = char_count[char]
if count in count_char: count_char[count].append(char)
else: count_char[count] = [char]
# 회수(키) 내림차순으로 정렬해서 출력
for key in sorted(count_char.keys(), reverse=True):
print(f"{key} => {count_char[key]}")
if __name__ == "__main__" :
main()
- 카운터는 import sys로 콘솔에서 인수를 받아야 하는데 통합하면 sys로 받지 않기 때문에 제거
- sys 입력을 받지 않기 때문에 사용자 입력을 받기 위해 input() 함수 추가
4) 메인
import _hangman
import _counter
import _score
def show_menu():
print("""
=================
1. 행맨
2. 점수계산
3. 알파벳 카운터
Q. 종료
=================
""")
while True :
show_menu()
menu = input('실행할 프로그램의 번호를 입력 : ')
if menu == 'Q' :
print('프로그램을 종료합니다.')
break
menu = int(menu)
if menu == 1 :
print("행맨 실행")
_hangman.main()
elif menu == 2 :
print('점수 계산 실행')
_score.main()
elif menu == 3 :
print('알파벳 카운터')
_counter.main()
else :
print('잘못된 입력 다시 입력하세요')
- 메인 페이지에서 행맨, 점수, 카운터 모듈을 사용하기 위해 각각 import 한다.
- 메뉴의 해당하는 프로그램의 번호를 입력하면 해당 프로그램의 main() 함수를 호출한다.
- 잘못된 입력 검증
'SK Shieldus Rookies 19th > 인프라 활용을 위한 파이썬' 카테고리의 다른 글
[SK shieldus Rookies 19기][Python] - 내장 함수, 표준 라이브러리, 외부 라이브러리 Faker (0) | 2024.03.18 |
---|---|
[SK shieldus Rookies 19기][Python] - 클래스, 모듈, 패키지, 오류 처리 (7) | 2024.03.18 |
[SK shieldus Rookies 19기][Python] - 함수, 파일 (1) | 2024.03.17 |
[SK shieldus Rookies 19기][Python] - 실습 1 (2) | 2024.03.17 |
[SK shieldus Rookies 19기][Python] - 조건문, 반복문 (2) | 2024.03.14 |
댓글