Python

파이썬 스터디 6장 - 파이썬 프로그래밍, 어떻게 시작해야 할까?

공대생철이 2023. 7. 6. 20:24
728x90

지금까지 문법도 어느정도 공부했고 내장 함수들도 많이 공부했다.

그럼 이걸 바탕으로 도대체 어떤 프로그램을 만들 수 있을까?

 

극히 작은 몇줄의 코드도 프로그램이 될 수 있다. 구구단을 출력해주는 코드도 프로그램이다.

 

하지만 주제만 던져준 다음에 프로그램을 짜보라고 하면 겁먹는 경우가 대부분이다. 시작도 못하는 경우도 태반.

 

그럴 때 그 프로그램의 입력과 출력이 어떻게 될지 생각해보면 좋다.

 

구구단을 만든다고 해보자.

1. 입력으로 2를 넣으면 2단이 출력되어야 한다.

2. [2,4,6,...18]이 출력되면 된다. 이런 식으로 나열 형태의 데이터는 리스트 자료형이 적합해보인다.

3. 이름은 뭘로 할 것인가? gugu라고 해보자.

4. 결괏값을 담을 리스트를 생성해놓고 거기에 결괏값을 하나씩 넘어주면 되겠네 -> append 메서드

5. 1부터 9까지 계속 곱해주니깐 반복문을 써야겠네. (for로 할까 while로 할까) -> while로 해보자

def gugu(n):
    result = []
    i = 1
    while i<10:
        result.append(n*i)
        i +=1
    return result

저 사고의 흐름을 거쳐서 만든 코드이다. 사실 굳이 글로 표현 안하고 그냥 머릿속으로 바로 떠올릴 수 있을 정도의 레벨이다.

만약 막혔다면 단계적으로 어떻게 접근해야할지 생각해보면 좋다. 

 

이번에는 1000미만의 자연수에서 3의 배수아 5의 배수의 총합을 구해볼려고 한다.

단계적 사고가 당연히 있겠지만 이 정도는 문법이 익숙해졌다면 그냥 나온다.

result = 0
i=1
while i<=1000:
    if(i%3==0 || i%5==0):
        result+=i
    i+=1
    
print(result)

while로 반복문을 돌았지만 for문으로 작성할 수도 있다. 그러면 아마 range도 같이 써야될 것이다.

 

이번에는 게시판 페이징을 해보자.

예를 들어 게시물의 총 개수가 15개인데 페이지당 보여줄 게시물이 10개라면 2페이지를 만들어줘야된다.

 

사실 이것도 안 어렵다.

def get_total_page(m,n):
    if m % n ==0:
       return m // n 
    else:
       return m // n +1

m이 총 게시물, n이 페이지당 보여줄 게시물 갯수다. 

나누어 떨어질 때만 그대로 몫을 보여주면 되고 아닐 때는 1개를 더 출력하면 된다.

 

이번에는 메모장에 메모를 추가하는 프로그램을 만들어보자.

 

일단 txt 파일에 접근을 해야되니깐 sys가 필요할 것 같다.

그 다음 명령어로 입력했을 때 메모를 추가하려고 한다.

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

이런 명령어가 있으면 memo.py를 실행하여 뒤에 추가한 문자열을 추가해주려고 하는 것이다. -a는 추가 모드의 약자이다.

 

import sys

mode = sys.argv[1]

if mode == '-a':
    memo = sys.argv[2]
    f=open('memo.txt','a')
    f.write(memo)
    f.write('\n')
    f.close()

elif mode == '-r':
    f=open('memo.txt','r')
    memos = f.read()
    print(memos)
    f.close()

추가할 때, 읽을 때를 나눠서 명령어를 실행하면 된다. 그냥 write, read만 하는 거니깐 하나도 안 어려울 거다.

 

이번에는 하위 디렉터리를 검색하는 프로그램을 만들어보자.

파일, 폴더의 이름에 접근할 수 있어야 하므로 os 라이브러리가 필요할 것 같다.

import os

def search(dirname):
    filenames = os.listdir(dirname)
    for filename in filenames:
        full_filename = os.path.join(dirname, filename)
        print(full_filename)

이 정도로 생각해볼 수 있다. 하지만 이 코드에는 단점이 있다. 하위 폴더는 읽지 못하고 파일들만 읽는다. 

그럼 수정을 해보자. 만약 filename이 파일명이 아니라 폴더라면?

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 함수를 실행할 수 있도록 재귀를 활용했다.

 

이렇게 코드를 짜긴 했지만 사실 os에는 walk이라는 메서드가 이미 있다. 이거 가지고 하면 훨씬 간단하다.

https://wikidocs.net/39

 

06-6 하위 디렉터리 검색하기

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

wikidocs.net

 

 

728x90