본문 바로가기
개발자 일지/Phython

[파이썬 기초]함수,모듈 작성법 및 활용

by 네빌링 2021. 3. 28.
반응형

-함수를 작성하는 방법과 모듈을 작성하는 방법을 학습한다.

-함수,모듈로 이전에 만든 웹어플리케이션 예제를 리팩토링 해본다.

-생활코딩 파이썬 강의를 바탕으로 학습 및 보충학습 하였다.

-파이썬은 3.9.2 ver를 사용한다.


함수 사용법

 파이썬에서 함수 작성법은 다음과 같다.

def 함수명():
	코드...

 

평균값을 구하는 함수를 작성하면 다음과 같다.

 

func.py

#평균을 구하는 함수
def average(a,b,c):
    s=a+b+c
    r=s/3
    return r

#합을 구하는 함수
def plus(a,b):
    return a+b

#pi값
pi = 3.14

#평균값 출력
print(average(10,20,30))

 

 def라는 키워드는 함수의 시작을 의미한다. average() 함수를 예로 살펴보면, 함수명은 average이고 괄호 안에는 입력받은 파라미터를 정의한다. a,b,c라는 파라미터를 받아 내부 로직을 돌린 후 평균값을 return하는 함수이다.

 

모듈 사용법

 위의 함수를 다른 곳에서 사용하려면 모듈을 사용하는 것이 효율적이다. 같은 함수를 복붙하여 사용하면 중복이 발생하기 때문이다. 모듈은 함수를 정의해둔 후 import하여 사용하면 된다. 아래와 같이 mathModule.py 파일에 함수를 정의해둔 후 module.py 파일에서 불러와서 사용해봤다.

 

 

mathModule.py

def average(a,b,c):
    s=a+b+c
    r=s/3
    return r

def plus(a,b):
    return a+b

pi = 3.14

 

module.py

import mathModule #함수들을 정의한 mathModule 모듈 파일을 불러온다

#mathModule.함수명()의 방식으로 사용
print(mathModule.average(1,2,3)) 
print(mathModule.plus(1,2))
print(mathModule.pi)

 

함수 및 모듈 활용

 이전 포스트에서 만든 웹어플리케이션 예제의 코드들을 함수와 모듈을 사용하여 정리한다. 기존 코드는 다음과 같다.

 

index.py

#!Python
print("Content-Type: text/html")
print()

#1.모듈
import cgi, os

#2.목록 리스트 셋팅하기
files = os.listdir('data') #[CSS,HTML,JavaScript]
listStr = ''
for item in files:
    listStr = listStr + '<li><a href="index.py?id={name}">{name}</a></li>'.format(name=item)


#3.a태그 클릭시 id값에 따른 pageId 분기처리
form = cgi.FieldStorage()
if 'id' in form:
    pageId = form["id"].value
    description = open('data/'+pageId,'r').read() #open함수로 내용 불러오기
    update_link = '<a href="update.py?id={}">update</a>'.format(pageId)
    delete_action= '''
        <form action="process_delete.py" method="post">
            <input type="hidden" name="pageId" value="{}">
            <input type="submit" value="delete">
        </form>
    '''.format(pageId)  #delete버튼을 form방식으로 만든다
else :
    pageId = 'welcome'
    description = 'Welcome!'
    update_link = ''
    delete_action = ''

#4.화면 그리기
print('''<!doctype html>
<html>
<head>
  <title>WEB1 - Welcome</title>
  <meta charset="utf-8">
</head>
<body>
  <h1><a href="index.py">WEB</a></h1>
  <ol>
    {listStr}
  </ol>
  <a href="create.py">create</a>
  {update_link}
  {delete_action}
  <h2>{title}</h2>
  <p>{desc}
  </p>
</body>
</html>
'''.format(
    title=pageId,
    desc=description,
    listStr=listStr,
    update_link=update_link,
    delete_action=delete_action))

 

create.py

#!Python
print("Content-Type: text/html")
print()

#1.모듈
import cgi, os

#2.목록 리스트 셋팅하기
files = os.listdir('data') #[CSS,HTML,JavaScript]
listStr = ''
for item in files:
    listStr = listStr + '<li><a href="index.py?id={name}">{name}</a></li>'.format(name=item)

#3.a태그 클릭시 id값에 따른 pageId 분기처리
form = cgi.FieldStorage()
if 'id' in form:
    pageId = form["id"].value
    description = open('data/'+pageId,'r').read() #open함수로 내용 불러오기
else :
    pageId = 'welcome'
    description = 'Welcome!'

#4.화면 그리기
print('''<!doctype html>
<html>
<head>
  <title>WEB1 - Welcome</title>
  <meta charset="utf-8">
</head>
<body>
  <h1><a href="index.py">WEB</a></h1>
  <ol>
    {listStr}
  </ol>
  <a href="create.py">create</a>
  <form action="process_create.py" method="post">
    <p><input type="text" name="title" placeholder="title"></p>
    <p><textarea rows="4" name="description" placeholder="description"></textarea></p>
    <p><input type="submit"></p>
  </form>
  <h2>{title}</h2>
  <p>{desc}
  </p>
</body>
</html>
'''.format(
    title=pageId,
    desc=description,
    listStr=listStr))

 

update.py

#!Python
print("Content-Type: text/html")
print()

#1.모듈
import cgi, os

#2.목록 리스트 셋팅하기
files = os.listdir('data') #[CSS,HTML,JavaScript]
listStr = ''
for item in files:
    listStr = listStr + '<li><a href="index.py?id={name}">{name}</a></li>'.format(name=item)

#3.a태그 클릭시 id값에 따른 pageId 분기처리
form = cgi.FieldStorage()
if 'id' in form:
    pageId = form["id"].value
    description = open('data/'+pageId,'r').read() #open함수로 내용 불러오기
else :
    pageId = 'welcome'
    description = 'Welcome!'

#4.화면 그리기
print('''<!doctype html>
<html>
<head>
  <title>WEB1 - Welcome</title>
  <meta charset="utf-8">
</head>
<body>
  <h1><a href="index.py">WEB</a></h1>
  <ol>
    {listStr}
  </ol>
  <a href="create.py">create</a>
  <form action="process_update.py" method="post">
    <input type="hidden" name="pageId" value="{form_default_title}">
    <p><input type="text" name="title" placeholder="title" value="{form_default_title}"></p>
    <p><textarea rows="4" name="description" placeholder="description">{form_default_description}</textarea></p>
    <p><input type="submit"></p>
  </form>
  <h2>{title}</h2>
  <p>{desc}
  </p>
</body>
</html>
'''.format(
    title=pageId,
    desc=description,
    listStr=listStr,
    form_default_title=pageId, form_default_description=description))

 

예제 웹어플리케이션 화면은 아래와 같다.

 

 

 

 

 위의 코드로 작성된 화면을 함수 및 모듈을 사용하여 정리하려고 한다. index.py와 create.py, update.py 모두 작성법이 같으므로 index.py만 예시로 정리한다. 우선 index.py에서 목록 리스트를 불러오는 함수를 아래와 같이 함수화한 후, format을 수정한다.

 

index.py 일부

#2.목록 리스트 셋팅하기(함수화)
def getList():
    files = os.listdir('data') #[CSS,HTML,JavaScript]
    listStr = ''
    for item in files:
        listStr = listStr + '<li><a href="index.py?id={name}">{name}</a></li>'.format(name=item)
    return listStr

#4.화면 그리기(format 수정)
print('''<!doctype html>
<html>
<head>
  <title>WEB1 - Welcome</title>
  <meta charset="utf-8">
</head>
<body>
  <h1><a href="index.py">WEB</a></h1>
  <ol>
    {listStr}
  </ol>
  <a href="create.py">create</a>
  {update_link}
  {delete_action}
  <h2>{title}</h2>
  <p>{desc}
  </p>
</body>
</html>
'''.format(
    title=pageId,
    desc=description,
    listStr=getList(),	#listStr에 위에서 정의한 getList()함수를 넣어준다
    update_link=update_link,
    delete_action=delete_action))

 

 위와같이 함수를 통하여 정리가 가능하다. 그러나 update.py 등에서도 위와 같이 똑같이 정의해야하는데 중복이 발생하기 때문에 모듈을 만들어 모듈에 함수를 정의한 후 import해서 사용하는 것이 좋을 것이다. 아래와 같이 view.py라는 모듈 파일을 만든 후 getList()함수를 정의한다. 이후 view 모듈을 불러와 사용한다.

 

view.py

import os

#2.목록 리스트 셋팅하기(모듈에서 불러오기)
def getList():
    files = os.listdir('data') #[CSS,HTML,JavaScript]
    listStr = ''
    for item in files:
        listStr = listStr + '<li><a href="index.py?id={name}">{name}</a></li>'.format(name=item)
    return listStr

 

모듈화를 하여 완성된 index.py는 아래와 같다.

 

index.py

#!Python
print("Content-Type: text/html")
print()

#1.모듈
import cgi, os, view #우리가 만든 view 모듈을 import

#3.a태그 클릭시 id값에 따른 pageId 분기처리
form = cgi.FieldStorage()
if 'id' in form:
    pageId = form["id"].value
    description = open('data/'+pageId,'r').read() #open함수로 내용 불러오기
    update_link = '<a href="update.py?id={}">update</a>'.format(pageId)
    delete_action= '''
        <form action="process_delete.py" method="post">
            <input type="hidden" name="pageId" value="{}">
            <input type="submit" value="delete">
        </form>
    '''.format(pageId)  #delete버튼을 form방식으로 만든다
else :
    pageId = 'welcome'
    description = 'Welcome!'
    update_link = ''
    delete_action = ''

#4.화면 그리기
print('''<!doctype html>
<html>
<head>
  <title>WEB1 - Welcome</title>
  <meta charset="utf-8">
</head>
<body>
  <h1><a href="index.py">WEB</a></h1>
  <ol>
    {listStr}
  </ol>
  <a href="create.py">create</a>
  {update_link}
  {delete_action}
  <h2>{title}</h2>
  <p>{desc}
  </p>
</body>
</html>
'''.format(
    title=pageId,
    desc=description,
    listStr=view.getList(), #view모듈에서 getList() 호출
    update_link=update_link,
    delete_action=delete_action))

 

 index.py에서 작성한 getList()함수를 view.py로 옮겨서 import하여 사용한다. format을 보면 veiw.getList()로 호출하여 사용하는 것을 확인할 수 있다. 127.0.0.1/index.py를 실행하면 위와 같이 똑같은 화면이 나옴을 확인할 수 있다.

반응형