[점프 투 파이썬] Chapter 07 : 파이썬 프로그래밍 어떻게 시작해야할까?

iGhost·2021년 9월 5일
0

점프 투 파이썬

목록 보기
7/8
post-thumbnail

🤔 내가 프로그램을 만들 수 있을까?

프로그램을 만들때 가장 먼저 알아야할것

  • 입력
  • 출력

📌 구구단을 예시로 만들어보자

  • 함수 이름은? GuGu로 짓자
  • 입력받는 값은? 2
  • 출력하는 값은? 2단(2, 4, 6, 8, …, 18)
  • 결과는 어떤 형태로 저장하지? 연속된 자료형이니까 리스트!

기본적으로 생각할수 있는 코드

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))

반복되는 코드가 너무 많으니 반복문으로 만들어보자

>>> i = 1
>>> while i < 10:
...     print(i)
...     i = i + 1

📌 3과 5의 배수 합하기

10 미만의 자연수에서 3과 5의 배수를 구하면 3, 5, 6, 9이다. 이들의 총합은 23이다.
1000 미만의 자연수에서 3의 배수와 5의 배수의 총합을 구하라.

  • 입력 받는 값은? 1부터 999까지(1000 미만의 자연수)
  • 출력하는 값은? 3의 배수와 5의 배수의 총합
  • 생각해 볼 것은?
    1. 3의 배수와 5의 배수는 어떻게 찾지?
    2. 3의 배수와 5의 배수가 겹칠 때는 어떻게 하지?
# 자연수 100 미만의 자연수를 구하기 

n = 1
while n < 1000:
    print(n)
    n += 1

# 간단하게 구현해보면

for n in range(1, 1000):
    print(n)

# 3의 배수와 5의 배수를 둘다 만족시켜야함

result = 0
for n in range(1, 1000):
    if n % 3 == 0 or n % 5 == 0: 
        result += n
print(result)

📌 게시판 페이징 하기

A 씨는 게시판 프로그램을 작성하고 있다. 그런데 게시물의 총 건수와 한 페이지에 보여 줄 게시물 수를 입력으로 주었을 때 총 페이지 수를 출력하는 프로그램이 필요하다고 한다

  • 함수 이름은? getTotalPage
  • 입력 받는 값은? 게시물의 총 건수(m), 한 페이지에 보여줄 게시물 수(n)
  • 출력하는 값은? 총 페이지수

  1. 다음과 같이 총 건수(m)를 한 페이지에 보여 줄 게시물 수(n)로 나누고 1을 더하면 총 페이지 수를 얻을 수 있다.
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 출력 <- 이것도 30이 나와야하는데, 딱 나눠떨어질때 몫이 증가하기 때문에 생기는 문제
  1. 실패 케이스는 총 게시물 수와 한 페이지에 보여 줄 게시물 수를 나눈 나머지 값이 0이 될 때 발생함을 유추할 수 있을 것이다. 이 실패 케이스를 해결하려면 다음과 같이 코드를 변경해야 한다. (조건을 걸어주자)
def getTotalPage(m, n):
    if m % n == 0: # 딱 나눠 떨어지면 1 ㄴㄴ
        return m // n
    else:
        return m // n + 1

print(getTotalPage(5, 10))
print(getTotalPage(15, 10))
print(getTotalPage(25, 10))
print(getTotalPage(30, 10))

📌 간단한 메모장 만들기

  • 필요한 기능은? 메모 추가하기, 메모 조회하기
  • 입력 받는 값은? 메모 내용, 프로그램 실행 옵션
  • 출력하는 값은? memo.txt

가장 먼저 해야할것은 메모 추가이다

python memo.py -a "Life is too short"

# memo.py
import sys # 프로그램을 실행할 때 입력된 값을 읽어 들일 수 있는 파이썬 라이브러리이다.

option = sys.argv[1] # python memo.py -a "Life is too short"
memo = sys.argv[2] # python memo.py -a "Life is too short"

print(option)
print(memo)

그렇담 이제 옵션이 -a일때만 파일을 받아 쓰도록 하면?

# 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()

작성한 메모를 출력하는 부분을

python memo.py -v

-v 일때 출력하게 만들자면

# 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':
    f = open('memo.txt')
    memo = f.read()
    f.close()
    print(memo)

📌 탭을 4개의 공백으로 바꾸기

이번에는 문서 파일을 읽어서 그 문서 파일 안에 있는 탭(tab)을 공백(space) 4개로 바꾸어 주는 스크립트를 작성해 보자.

  • 필요한 기능은? 문서 파일 읽어 들이기, 문자열 변경하기
  • 입력 받는 값은? 탭을 포함한 문서 파일
  • 출력하는 값은? 탭이 공백으로 수정된 문서 파일

형식 : python tabto4.py src dst

실행문 : python tabto4.py a.txt b.txt

이와 같은 입력에 실행하게 만들어보자

# tabto4.py
import sys

src = sys.argv[1]
dst = sys.argv[2]

print(src)
print(dst)

이제 파일을 읽어서 탭을 교체하자면

# 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)
print(space_content)

교체한걸 다시 넣어주자

# 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')
f.write(space_content)
f.close()

📌 하위 디렉터리 검색하기

특정 디렉터리부터 시작해서 그 하위 모든 파일 중 파이썬 파일(*.py)만 출력해 주는 프로그램을 만들려면 어떻게 해야 할까?

일단 인자를 넣으면 출력을 하는 함수를 넣어보자

# sub_dir_search.py

def search(dirname):
    print(dirname)

search("c:/")

외장함수인 os를 이용해서 디렉터리에 있는 파일 리스트를 구해보자

  • OS
import os

def search(dirname):
    filenames = os.listdir(dirname) #입력받은 폴더안의 파일들을 리스트로 가져옴, 파일들 밖에 없기 때문에 앞에 경로를 붙혀주자
    for filename in filenames:
        full_filename = os.path.join(dirname, filename) # 무슨 폴더에 경로를 join할껀지 정해줌
        print(full_filename) # 이거는 일단 다출력

search("c:/")

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.splitext는 파일 이름을 확장자를 기준으로 두 부분으로 나누어 준다
        if ext == '.py': 
            print(full_filename)

search("c:/")

이거는 하나의 폴더만 알기 때문에, 해당 폴더의 하위 폴더를 다 알아야한다

import os

def search(dirname):
    try: # 에러처리, 권한이 없는 파일에 접근할수도 있기 때문
        filenames = os.listdir(dirname)
        for filename in filenames:
            full_filename = os.path.join(dirname, filename)
            if os.path.isdir(full_filename):
                search(full_filename)
            else:
                ext = os.path.splitext(full_filename)[-1]
                if ext == '.py': 
                    print(full_filename)
    except PermissionError:
        pass

search("c:/")
profile
인터벌로 가득찬

0개의 댓글

관련 채용 정보