티스토리 뷰
6.12 사례 연구: 랜덤 ASCII 문자 생성하기(Generating Random ASCII Characters)
- 문자는 정수로 작성이 가능하다. 랜덤 문자 생성은 정수를 생성하는 것과 같다.
- 아스키 문자는 0부터 127 까지의 정수로 이루어진 아스키코드를 가지고 있다.
- 랜덤 아스키 문자를 생성하기 위해서, 0부터 127까지 정수를 랜덤으로 발생시켜야 한다.
- 그 후 chr 함수를 이용하여 정수로 부터 문자를 얻을 수 있다.
chr(randint(0, 127))
- 소문자의 아스키코드를 랜덤으로 생성하기 위해서 ord 함수를 이용할 수 도 있다.
ord('a')
- 그래서 소문자 a 부터 z까지의 아스키 코드를 얻기 위해선 ord('a') 와 ord('z')를 이용해 아래와 같이 코드를 얻을 수 있다.
randint(ord('a'), ord('z'))
- 그 다음, 소문자를 얻기 위해서 다시 chr 함수를 이용하면 된다.
chr(randint(ord('a'), ord('z')))
*랜덤 문자 출력 프로그램
*RandomCharacter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
from random import randint
def getRandomCharacter(ch1, ch2):
return chr(randint(ord(ch1), ord(ch2)))
def getRadomLowerCaseLetter() :
return getRandomCharacter('a', 'z')
def getRandomUpperCaseLetter():
return getRandomCharacter('A', 'Z')
def getRandomDigitCharacter():
return getRandomCharacter('0', '9')
def getRandomASCIICharacter():
return chr(randint(0,127)) |
cs |
*TestRandomCharacter.py
1
2
3
4
5
6
7
8
9 |
import RandomCharacter
NUMBER_OF_CHARS = 175 #출력할 문자 수
CHARS_PER_LINE = 25# 한 줄에 표현 될 문자 수
for i in range(NUMBER_OF_CHARS):
print(RandomCharacter.getRadomLowerCaseLetter(), end = " ")
if(i + 1) % CHARS_PER_LINE == 0:
print() |
cs |
6.13 함수 추상화와 단계적 개선(Function Abstraction and Stepwise Refinement)
- 함수의 추상화(function abstraction)는 함수의 구현정보(implement)와 사용을 따로 분리시키는 것이다.
- 소프트웨어를 개발할 때는 추상화가 핵심이다.
- 클라이언트 프로그램이 함수를 사용 할 때, 굳이 클라이언트 프로그램은 함수가 어떻게 구현되어 있는지 알 필요가 없다.
- 구현에 관한 상세한 정보는 함수 내에서 캡슐화(encapsulated)되어 있고, 함수를 사용하는 클라이언트 프로그램으로 부터 구현에 관한 정보는 숨겨져 있다.
- 이를 우리는 정보 은닉(information hiding) 또는 캡슐화(encapsulation) 이라고 부른다.
- 함수의 구현정보(implement)는 아래의 그림처럼 블랙박스(black box)에 숨겨져 있다.
- 함수의 추상화는 프로그램 개발 과정에 적용 될 수 있다.
- 대형 프로그램을 작성 할 때, 우리는 분할 정복(divide-ande-conquer) 기법을 사용 할 수 있다. 분할 정복 기법은 단계적 개선(stepwise refinement)이라고 알려져 있기도 하다.
- 이 기법은 하나의 문제를 해결하여 작은 문제(subproblem)로 만들고, 작은 문제를 또 더 작은 문제로 만들어, 다루기 쉬운 문제로 만드는 것이 특징이다.
- 달력 프로그램을 예로 들어보자.
6.13.1 탑-다운 디자인(Top-Down Design)
- 프로그램을 만들 때 초반부터 디테일하게 접근하면 오히려 문제해결이 힘들어 질 수 있다.
- 최대한 문제를 물흐르듯이 하는게 바람직 한데, 이의 좋은 예가 함수를 추상화(abstraction)를 이용해 함수의 디테일한 내용은 잠시 접어두고, 나중에 디테일한 내용을 구현하는 것이다.
- 예를 들어, 달력 프로그램으로 부터 두가지 작은 문제(subproblem)로 분리가 된다. 하나는 (1)사용자로 부터 입력을 받는 문제와 그 입력 받은 (2)달의 출력으로 나뉜다.
- 여기서 주의해야 할 점은, 우리가 지금 배우는 파트가 함수의 구현은 잠시 접어두고, 어떤 작은 문제들이 발생하는지를 고려해야하는 것이 핵심이다. 함수의 구현은 나중 일이다.
- 그래프를 그려 문제를 시각화 하면 아래와 같다.
- 입력은 input 함수를 이용해 년도와 달을 입력 받을 수 있다.
- 개월 출력 문제는 아래의 그림과 같이 다시 두 가지 작은 문제로(subproblem)으로 나뉜다. 하나는 (1)달의 이름출력이고, 다른 하나는 (2)그 달의 body 출력이다.
- 여기서 달 이름 출력은 (1) 달의 이름을 얻어야 하는 작은 문제(subproblem)가 발생하고, 개월 출력 body에서는 (1) 무슨 요일이 한 주의 시작(getStartDay)인지 각 각 알아내야하고, (2) 그 달이 총 몇 일로 이루어져 있는지(getNumberOfDaysInMonth)도 알아야 한다.
- 이런 형식으로 분할하다보면, 윤년에 대한 문제도 발생하고, 윤년이 발생했을 떄 출력도 따로 생각해야 한다.
- 이렇게 분할-정복 기법으로 달력프로그램의 문제를 모두 나눈 모습을 그래프화 시키면 아래와 같다.
참고 문헌 : Introduction to Programming Using Python / Y.DANIEL LIANG
※
본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.
교재 영어 원서를 직접 번역하여 정리한 게시물이므로 일부 오타, 의역이 존재할 수 있습니다. 틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다.
※
'파이썬 > 이론' 카테고리의 다른 글
[파이썬]객체와 클래스(Objects and Classes),생성자(initializer) (2) | 2017.07.31 |
---|---|
[파이썬]함수 추상화와 단계적 개선 (2) (0) | 2017.07.30 |
[파이썬]변수의 범위, 기본 인자, 다중값 반환, 10진수를 16진수로 변환 (0) | 2017.07.27 |
[파이썬]레퍼런스값에 의한 인자 전달, 모듈화 (0) | 2017.07.26 |
[파이썬]반환값이 있는/없는 함수, 위치인자와 키워드 인자 (2) | 2017.07.24 |
- Total
- Today
- Yesterday
- css 박스
- 파이썬 선택문
- 파이썬 객체
- 파이썬 리스트
- 파이썬 단계적 개선
- 백준
- 백준 11501
- 파이썬 for
- 파이썬 while
- 버츄어박스
- 자바스크립트 그래프
- css 그리드
- 자료구조
- 파이썬 터틀
- 파이썬 if문
- 백준 10451
- 파이썬 예제
- 웹
- 자바 에센셜 실습문제
- 자바스크립트 자료구조
- 파이썬 문자열
- 자바
- 파이썬 진수 변환
- 파이썬 클래스
- 파이썬
- 백준 1874
- 파이썬 연산자
- css
- 명품 c++ 실습
- 파이썬 함수
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |