본문 바로가기

Etc/Python

#08 함수, 파일 입출력

함수


 역시 코딩하면 빠질 수 없는 요소인 함수이다.

파이썬의 함수 기본 구조는 다음과 같다.

def 함수명(입력 인수):

<수행할 문장1> <수행할 문장2> ...


 딱 보았을때 대강 감이 오는데 아래의 예를 보면 이해가 더 잘 될것이다.

def sum(a, b):  

return a + b

 

 이제 이용하기 나름인데 c에서 했던 바와 같이 입력이 있고 없고, 출력이 있고 없고하는 다양한 함수를 만들 수 있다.


>>> def say():

... return 'Hi' ... >>>


>>> def sum(a, b): ... print("%d, %d의 합은 %d입니다." % (a, b, a+b)) ... >>>


>>> def say(): ... print('Hi') ...  

>>>


입력값이 몇 개 인지를 모를때


 입력값이 몇 개 인지를 모르는 경우에도 이를 해결해주기위해 파이썬은 다음과 같은 방법을 제공한다.

def 함수이름(*입력변수):

<수행할 문장> ...


 역시나 예시를 보며 이해하면 편하다.

>>> def sum_many(*args):

... sum = 0 ... for i in args: ... sum = sum + i ... return sum ... >>>


 for문의 성질을 이용한 위와 같은 식으로 작성하면 놀랍게도 입력값을 변화시켜도 괜찮다.


 >>> def sum_mul(choice, *args):

... if choice == "sum": ... result = 0 ... for i in args: ... result = result + i ... elif choice == "mul": ... result = 1 ... for i in args: ... result = result * i ... return result ...  

>>>

 위 처럼 입력 인수를 정해놓아도 무리없이 생각대로 수행된다.


 하지만 함수 결과값은 항상 하나이다.


 return a+b, a*b 처럼 하면 튜플값 하나인 (a+b, a*b)로 돌려주고,

 return a+b
 return a*b 처럼 하면 위 문장 하나만 실행한다.


 만약 두 값을 받고 싶다면 다음과 같은 방식으로 사용할 수 있다.


>>> def sum_and_mul(a,b):

... return a+b, a*b
>>> sum, mul = sum_and_mul(3, 4)

 위 처럼하면 하나의 튜플값을 반환하되 이를 나눠 받기때문에 마치 두 값을 받아내듯이 할 수 있다.

 

 입력 인수에 초깃값 미리 설정하기※


def say_myself(name, old, man=True):

print("나의 이름은 %s 입니다." % name) print("나이는 %d살입니다." % old) if man: print("남자입니다.") else: print("여자입니다.")

 앞으로 >>>가 소스에 없다면 에디터 작성을 권장함을 의미합니다.

 

 위의 소스처럼 man=True라고 미리 초깃값을 설정해놓을 수 있다.


 ※ 주의할 사항

def say_myself(name, man=True, old):

print("나의 이름은 %s 입니다." % name) print("나이는 %d살입니다." % old) if man: print("남자입니다.") else:  

print("여자입니다.")

 위와 같은 형식으로 소스를 구성하게 되면 함수를 실행할 때 오류가 발생한다.


>>> say_myself("박응용", 27)

SyntaxError: non-default argument follows default argument


 27을 man변수와 old 변수 중 어느 곳에 대입해야 할지 모르게되어 문제가 생기는 것이다.


 초기화 시키고 싶은 입력 변수들을 항상 뒤쪽에 위치시키는 것을 잊으면 안된다.


함수 안에서 선언된 변수의 효력 범위


# vartest.py a = 1 def vartest(a): a = a +1 vartest(a) 

print(a)


 c와 개념은 동일하다 위의 소스코드를 실행하면 값은 1이 나온다.


+ global 명령어


# vartest_global.py

a = 1 def vartest(): global a a = a+1 vartest() print(a)


 변수 선언시 앞에 global을 붙이면 c에서의 전역변수 개념이 된다. 하지만 이 global변수는 c와 마찬가지로 사용하지 않는 편이 좋다. 굳이 값을 가져오려면 return을 이용하는 편이 현명하다.




 사용자 입력과 출력


 사용자 입력


 1) input 사용


>>> a = input() Life is too short, you need python >>> a 'Life is too short, you need python' 

>>>

 input은 입력되는 모든 것을 문자열로 취급하여 입력받는다. (2.7의 경우 raw_input을 사용)


 2) 프롬프트 띄워 입력받기


>>> number = input("숫자를 입력하세요: ")

숫자를 입력하세요:

 직관적으로 받아들일 수 있는 내용 그대로다.


 출력의 print 자세히 알기


 1) 큰따옴표로 둘러싸인 문자열은 + 연산과 동일하다.


>>> print("life" "is" "too short")

lifeistoo short >>> print("life"+"is"+"too short")

lifeistoo short

 위처럼 연속해서쓰면 +와 동일하다.


 2) 문자열 띄어쓰기는 콤마로 한다.


>>> print("life", "is", "too short")

life is too short

 콤마를 이용하면 띄어쓰기를 할 수 있다.


 3) 한 줄에 결과값 출력하기


>>> for i in range(10):

... print(i, end=' ') ... 0 1 2 3 4 5 6 7 8 9

 앞에서 미리 나왔지만 end=를 이용하면 끝 문자를 지정해 계속 이어 출력시킬 수 있다. (2.7은 print i,를 사용)




 파일 읽고 쓰기


 이번엔 프로그램이 진짜 프로그램다워지는 파일 입출력을 알아볼 것이다.


 파일 생성하기


f = open("C:/Python/새파일.txt", 'w')

f.close()

 open() 이라는 파이썬 내장 함수는 :"파일 이름", "파일 열기 모드"를 입력값으로 받고 결과값으로 파일 객체를 돌려준다.


파일 객체 = open(파일 이름, 파일 열기 모드)

 열기모드는 r : 읽기모드, w : 쓰기모드, a : 추가모드(파일 마지막에 새로운 내용을 추가시킬 때 사용)가 있다.


 파일 쓰기모드로 열게 되면 이미 해당파일이 존재시엔 원래의 내용은 모두 사라지고, 해당 파일이 없다면 새로 생성된다.

만약 새파일.txt를 특정 디렉토리에 생성하고 싶다면 C:/Python/ 처럼 적어주면 된다.

 f.close()는 파일 객체를 닫아주는 역할을 하는데 프로그램 종료시 파이썬이 자동으로 파일객체들을 닫아주기떄문에 생략해도 되는 구문이긴하다.

하지만 직접 닫아주는게 좋은데 그 이유는 쓰기모드로 열었던 파일을 닫지 않고 다시 사용하려하면 오류가 발생하기 때문이다.


 파일을 쓰기모드로 연뒤 출력값 적기


# writedata.py

f = open("C:/Python/새파일.txt", 'w') for i in range(1, 11): data = "%d번째 줄입니다.\n" % i f.write(data) f.close()

f로 새파일을 하나 만든 뒤에 for data 값을 write해주는 것을 볼 수 있다.


 실제로 소스코드를 아래와같이 실행해보면 다음과 같은 결과를 얻는다.

C:\Users> cd C:\Python

C:\Python>python writedata.py C:\Python>


1 번째 줄입니다.

2 번째 줄입니다.

...

10 번째 줄입니다.

 위와 같이 모니터에 출력하던 내용과 똑같이 고스란히 담고있는 텍스트 파일이 생겼음을 확인할 수 있다.


 프로그램 외부에 저장된 파일을 읽는 여러 방법들


 1) readline() 이용

# readline.py

f = open("C:/Python/새파일.txt", 'r') line = f.readline() print(line) f.close()

  위처럼 실행하면 이전의 텍스트 파일의 첫줄이 화면에 출력된다.


 만약 모든 줄을 전부 출력하려면 while문과 if문을 활용하면 되는데 readlin()은 더이상 읽을 라인이 없을경우 None을 출력함을 이용하면 된다.


 2) readlines() 이용

f = open("C:/Python/새파일.txt", 'r') lines = f.readlines() for line in lines: print(line) f.close()

 위와같이 사용가능하다. readlines()는 파일의 모든 라인을 읽어서 각각의 줄을 요소로 갖는 리스트로 리턴하는 함수이다.


 3) read() 이용

f = open("C:/Python/새파일.txt", 'r') data = f.read() print(data) f.close()

 readl()는 파일의 내용 전체를 문자열로 리턴하는 함수이다.


파일에 새로운 내용 추가하기


 이미 존재하는 파일의 데이터를 소멸시키지않되 내용을 추가시킬땐 w이 아닌 a(추가모드)를 사용하게 되는데 예시를 보면 이해하기 좋다.


# adddata.py

f = open("C:/Python/새파일.txt",'a') for i in range(11, 20): data = "%d번째 줄입니다.\n" % i f.write(data) f.close()

 실행해보면 원래의 내용에 덧붙여서 작성되는 것을 알수있다.


 with문과 함게 사용하기


 with문은 파일을 열고 닫는것을 자동으로 처리해준다. 어떻게 간결해지는 지를 예시로 이해하면 좋을 것같다.


f = open("foo.txt", 'w')

f.write("Life is too short, you need python") f.close()


with open("foo.txt", "w") as f:

f.write("Life is too short, you need python")

 위와 같이 with문을 이용하면 with블록을 벗어난 순간 열린 객체가 자동으로 close되어 편하다.



'Etc > Python' 카테고리의 다른 글

#10 모듈, 패키지, 예외처리  (0) 2017.01.03
#09 클래스  (0) 2016.12.29
#07 제어문 (if, while, for)  (0) 2016.11.28
#06 자료형의 참과 거짓, 변수  (0) 2016.11.27
#05 자료형-3(딕셔너리, 집합 자료형)  (0) 2016.11.27