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 |
댓글