Introduction
짧은 스크립트와 함수를 만들며, 프로그래밍을 어떻게 시작해야 하는지 감각을 익혀볼 것이다.
아래 예제는 대화형 인터프리터가 아닌 에디터로 작성이 필요하다.
- 스크립트란? 에디터로 작성한 파이썬 프로그램 파일
- 대화형 인터프리터가 아닌 에디터 예시 : Pycharm, vsCode 등
- 예제 구성
1. 구구단 2단 만들기
2. 3과 5의 배수 합하기
3. 게시판 페이징하기
4. 간단한 메모장 만들기
5. 탭을 4개의 공백으로 바꾸기
6. 하위 디렉터리 검색하기
01 구구단 2단 만들기
|
구구단 2단 프로그래밍을 위해 결정할 것 - 함수 이름: GuGu - 입력: 2 - 출력: 2단(2, 4, 6, 8, …, 18) - 저장 형태: 리스트(연속된 자료형) |
1. 변수(result)에 결괏값 넣기
result = GuGu(2) #GuGu라는 함수에 2를 입력값으로 주면 result라는 변수에 결괏값을 넣으라는 의미
2. 결괏값의 형태 결정하기
result = [2, 4, 6, 8, 10, 12, 14, 16, 18] 같은 결과를 얻고자 함 ▶ 리스트 자료형
3. 함수 만들기
def GuGu(n):
print(n)
4. 결괏값을 담을 리스트 생성하기
def GuGu(n):
result = []
5. append 내장 함수를 사용하기
- list.append(obj) : 기존 리스트에 1개의 요소를 이어 붙이기
즉, append(x)는 리스트의 맨 마지막에 x를 추가하는 함수이다.
def GuGu(n):
result = []
result.append(n*1)
result.append(n*2)
result.append(n*3)
result.append(n*4)
result.append(n*5)
result.append(n*6)
result.append(n*7)
result.append(n*8)
result.append(n*9)
return result
print(GuGu(2))
결괏값: [2, 4, 6, 8, 10, 12, 14, 16, 18]
6. 반복문으로 만들기
def GuGu(n):
result = []
i = 1
while i < 10:
result.append(n * i)
i = i + 1
return result
print(GuGu(2))
결괏값: [2, 4, 6, 8, 10, 12, 14, 16, 18]
02 3과 5의 배수 합하기
| 문제 10 미만의 자연수에서 3과 5의 배수를 구하면 3, 5, 6, 9이다. 이들의 총합은 23이다. 1000 미만의 자연수에서 3의 배수와 5의 배수의 총합을 구하라. |
|
3과 5의 배수 합하기 프로그래밍을 위해 결정할 것
|
1. 1000 미만의 자연수 구하기
(방법 1 ) 초깃값 1을 준 후 루프를 돌리기
n = 1
while n < 1000: #while: 조건문이 참인 동안에 while문 아래의 문장이 반복해서 수행
print(n)
n += 1
(방법 2) range 함수 사용
for n in range(1, 1000): #range(a, b): a 이상 b 미만의 범위
print(n)
2. 1000 미만의 자연수 중 3의 배수 구하기
for n in range(1, 1000): #
if n % 3 == 0:
print(n)
3. 1000 미만의 자연수 중 3의 배수 혹은 5의 배수 구하기
result = 0
for n in range(1, 1000):
if n % 3 == 0 or n % 5 == 0: #값이 이중으로 더해지지 않기 위해 or 연산자 사용
result += n #3과 5의 배수를 result 변수에 계속해서 더함
print(result)
03 게시판 페이징하기
|
문제 |
- 페이징: 게시판의 페이지 수를 보여 주는 것
|
게시판 페이징 프로그래밍을 위해 결정할 것
- 입력 : 게시물의 총 건수(m), 한 페이지에 보여줄 게시물 수(n) |
|
게시물의 총 건수(m) |
페이지당 보여줄 게시물 수(n) |
총 페이지 수 |
|
5 |
10 |
1 |
|
15 |
10 |
2 |
|
25 |
10 |
3 |
|
30 |
10 |
3 |
1. 총 페이지 수를 구하시는 공식 세우기
|
총 페이지 수 = (총 건수 / 한 페이지당 보여 줄 건수) + 1 |
2. 공식을 적용해 함수 만들기 (실패 사례)
def getTotalPage(m, n):
return m // n + 1 # 소수점 아래 자리를 버리기 위해 / 대신 // 연산자 사용
print(getTotalPage(5, 10)) # 1 출력
print(getTotalPage(15, 10)) # 2 출력
print(getTotalPage(25, 10)) # 3 출력
print(getTotalPage(30, 10)) # 4 출력 그러나 총 페이지수는 3이 되어야 함
3. if문 추가하여 코드 변경 (성공 사례)
def getTotalPage(m, n):
if m % n == 0: #나누었을 때 나머지가 0인 경우는 나누기의 몫만 돌려준다.
return m // n
else:
return m // n + 1 #그 이외의 경우에는 1을 더하여 돌려준다.
print(getTotalPage(5, 10))
print(getTotalPage(15, 10))
print(getTotalPage(25, 10))
print(getTotalPage(30, 10))
04 간단한 메모장 만들기
|
문제 - 원하는 메모를 파일에 저장하고 추가 및 조회가 가능한 간단한 메모장을 만들어라. |
|
메모장 프로그래밍을 위해 결정할 것 - 파이썬 프로그램 이름 : memo.py
|
1. 입력으로 받은 옵션과 메모를 출력하는 코드 작성
# C:/doit/memo.py
import sys
option = sys.argv[1] #sys.argv : 입력된 값을 읽어 들일 수 있는 라이브러리
memo = sys.argv[2] #sys.argv[0]는 입력받은 값이 memo.py이므로 필요 없는 값
print(option)
print(memo)
2. memo.py를 C:\doit 디렉터리에 저장한 뒤 명령 수행
C:\doit>python memo.py -a "Life is too short"
-a
Life is too short #입력으로 전달한 옵션과 메모 내용이 그대로 출력됨
3. 입력으로 받은 메모를 파일에 쓰도록 코드 변경
# c:/doit/memo.py
import sys
option = sys.argv[1]
if option == '-a': #옵션이 -a인 경우에만 memo 값을 읽어 memo.txt 파일에 그 값을 씀
memo = sys.argv[2]
f = open('memo.txt', 'a') #추가할 때마다 새로 작성 X, 한 줄씩 추가O > 파일열기 모드 a
f.write(memo)
f.write('\n') #메모를 추가할 때마다 다음 줄에 저장되도록 \n도 파일에 쓰게 함
f.close()
4. 정상적으로 기입되는지 확인
C:\doit>python memo.py -a "Life is too short"
C:\doit>python memo.py -a "You need python"
C:\doit>type memo.txt
Life is too short
You need python
5. 메모를 출력하는 부분 만들기
# c:/doit/memo.py
import sys
option = sys.argv[1]
if option == '-a':
memo = sys.argv[2]
f = open('memo.txt', 'a')
f.write(memo)
f.write('\n')
f.close()
elif option == '-v': #메모 출력은 –v 옵션을 사용
f = open('memo.txt') #옵션으로 –v가 들어온 경우 memo.txt 파일을 읽어서 출력
memo = f.read()
f.close()
print(memo)
6. 입력한 메모가 그대로 출력되는 것을 확인하기
C:\doit>python memo.py -v
Life is too short
You need python
05 탭을 4개의 공백으로 바꾸기
|
문제 문서 파일을 읽어서 그 문서 파일 안에 있는 탭(tab)을 공백(space) 4개로 바꾸어 주는 스크립트를 작성하라. |
|
메모장 탭 공백으로 바꾸기 프로그래밍을 위해 결정할 것 |
- 다음과 같은 형식으로 프로그램이 수행되도록 만들 것이다.
python tabto4.py src dst
1. sys.argv를 사용하여 입력값을 확인하도록 tabto4.py 파일 작성
# c:/doit/tabto4.py
import sys
src = sys.argv[1]
dst = sys.argv[2]
print(src)
print(dst)
2. 입력값이 정상적으로 출력되는지 확인
C:\doit>python tabto4.py a.txt b.txt
a.txt
b.txt #입력으로 전달한 a.txt와 b.txt가 정상적으로 출력
3. 원본 파일(탭을 포함하는 파일)인 a.txt를 각 단어는 탭(\t) 문자로 분리되도록 입력
Life is too short
You need python
4. 공백 4개로 변환할 수 있도록 코드 변경
# c:/doit/tabto4.py
import sys
src = sys.argv[1]
dst = sys.argv[2]
f = open(src)
tab_content = f.read()
f.close() #src 해당 입력 파일의 내용을 tab_content라는 변수에 저장
space_content = tab_content.replace("\t", " "*4) #replace 함수로 \t을 4개의 공백으로 변경
print(space_content)
5. 공백 4개로 변경되어 출력되는지 확인하기
C:\doit>python tabto4.py a.txt b.txt
Life is too short
You need python
6. 변경된 내용을 b.txt 파일에 저장할 수 있도록 코드 변경
# c:/doit/tabto4.py
import sys
src = sys.argv[1]
dst = sys.argv[2]
f = open(src)
tab_content = f.read()
f.close()
space_content = tab_content.replace("\t", " "*4)
f = open(dst, 'w') #탭이 공백으로 변경된 space_content를 출력 파일인 dst에 쓰도록 함
f.write(space_content)
f.close()
7. 다음 명령 수행 후 에디터로 b.txt 파일을 열어서 공백으로 변경됐는지 확인
C:\doit>python tabto4.py a.txt b.txt #b.txt 파일이 C:\doit 디렉터리에 생성
06 하위 디렉터리 검색하기
|
문제 특정 디렉터리부터 시작해서 그 하위 모든 파일 중 파이썬 파일(*.py)만 출력해 주는 프로그램을 만들어라 |
1. search 함수를 만들고 시작 디렉터리를 입력받도록 코드 작성
# C:/doit/sub_dir_search.py
def search(dirname):
print (dirname)
search("c:/")
2. 디렉터리에 있는 파일을 검색할 수 있도록 소스 변경
# C:/doit/sub_dir_search.py
import os #os 모듈에는 디렉터리와 파일 이름을 이어 주는 os.path.join 함수가 있음
#os.path.join: (디렉터리 포함) 전체 경로를 쉽게 구할 수 있음
def search(dirname): #dirname: 경로(디렉터리)
filenames = os.listdir(dirname) #os.listdir: 해당 디렉터리에 있는 파일의 (이름만 포함)리스트를 구함
for filename in filenames:
full_filename = os.path.join(dirname, filename)
print (full_filename)
search("c:/")
#디렉토리 출력 예
c:/$Recycle.Bin
c:/$WINDOWS.~BT
c:/$Windows.~WS
c:/adb
c:/AMD
c:/android
c:/bootmgr
c:/BOOTNXT
… 생략 …
3. C:/ 디렉터리에 있는 파일들 중 확장자가 .py인 파일만을 출력하도록 코드 변경
# C:/doit/sub_dir_search.py
import os
def search(dirname):
filenames = os.listdir(dirname)
for filename in filenames:
full_filename = os.path.join(dirname, filename)
ext = os.path.splitext(full_filename)[-1] #os.path.splitext1: 확장자를 기준으로 두 부분으로 나눔
if ext == '.py': #확장자 이름이 .py인 경우만을 출력
print(full_filename)
search("c:/")
4. 하위 디렉터리도 검색이 가능하도록 코드 변경
# C:/doit/sub_dir_search.py
import os
def search(dirname):
try:
filenames = os.listdir(dirname) #os.path.isdir: full_filename이 디렉터리인지 파일인지 구별
for filename in filenames:
full_filename = os.path.join(dirname, filename)
if os.path.isdir(full_filename):
search(full_filename) #디렉터리일 경우 해당 경로를 입력받아 다시 search 함수를 호출
else:
ext = os.path.splitext(full_filename)[-1]
if ext == '.py':
print(full_filename)
except PermissionError: #권한이 없는 디렉터리에 접근해도 오류로 종료되지 않고 수행되도록 하기 위함
pass
search("c:/")
- search 함수에서 다시 자기 자신인 search 함수를 호출(재귀 호출)함으로써 해당 디렉터리의 하위 파일을 다시 검색하여 결국 모든 파일들을 검색할 수 있게 된다.
- 재귀 호출 : 자기 자신을 다시 호출하는 프로그래밍 기법
출처 : 점프투 파이썬 (https://wikidocs.net/34)
'Python' 카테고리의 다른 글
| [Python 기초] 크롤링 실습 - 텔레그램 봇 만들기 (0) | 2020.05.30 |
|---|---|
| [Python 기초] 크롤링 실습 - 네이버 뉴스 기사 크롤링하기 (0) | 2020.05.23 |
| [Python 기초] 함수 (Function) (0) | 2020.04.23 |
| [Python 기초] 클래스 (Class) (0) | 2020.04.06 |
| [Python 기초] 문자열 (String) (0) | 2020.03.22 |
댓글