파이썬 아나콘다 자동실행 Batch 만들기

파이썬 아나콘다 자동실행 Batch 만들기

아나콘다 자동실행 Batch 를 왜 만들려 하시나요?

저같은 경우엔 무언가 자동화 프로그램을 만들고 싶어 파이썬을 공부하기 시작했습니다
그런데 파이썬으로 프로그래밍을 한 뒤 만들어진 코드를 매일 반복 작업을 하려니
아무것도 모르는 상태에서는 어지간히 번거로운 게 아닙니다.
자동화를 하고 싶어서 프로그래밍을 하는데
그 자동화를 매일 수작업으로 돌려줘야 한다는 슬픈 현실

아나콘다 자동실행 Batch

기존에 파이썬으로 프로그래밍을 할 때 아나콘다를 설치하고 가상환경을 설정한 뒤에
그 가상환경에서 진행하는 것에 대해서 알아봤었습니다.
가상환경에서 진행하는 이유에 대해서는 이전 포스팅을 참고하시면 됩니다.

아나콘다 환경에서 내가 만든 코드를 자동실행 Batch 로 만드는 방법에 대해 알아보겠습니다.
기본 구성은 아래처럼 구성하시면 됩니다.
아래의 코드를 메모장 같은 문서편집기에서 작성하신후
배치파일이름.bat 이런식으로 저장해주시면 됩니다.

set root=[아나콘다 설치 경로]
call %root%\Scripts\activate.bat %root%

call conda activate [설정할 가상환경 이름]
call cd [아나콘다 자동실행 Batch 로 실행할 파이썬 파일이 있는 경로]
call python [실행할 파이썬 파일이름].py

pause

아나콘다 설치 경로

윈도우 10 이나 윈도우 11 이전에는 프로그램을 설치를 하게 되면 거의 대부분이
C:\Program Files 이나 C:\Program Files (x86) 에 설치가 되었습니다.
윈도우가 32비트냐 64비트냐 구분지어서 위처럼 경로가 지정이 되었습니다.
물론 더 그 이전에는 C:\Program Files (x86) 라는 폴더는 필요가 없었죠
어쨌든 지금은 C:\Program Files 이나 C:\Program Files (x86) 도 아닌 다른 폴더에 프로그램이 설치되는 경우가 많습니다.
예를 들면 C:\Users\사용자명\ 처럼 사용자 폴더 밑에 있는 사용자명 폴더에 설치되는 경우가 많습니다.
그래서 설치된 프로그램 경로를 찾으려면 헤매는 경우도 종종 생기기도 합니다.

이럴 때 고민하지 말고 시작메뉴를 눌러봅니다

파이썬 아나콘다 자동실행 Batch 만들기

저 같은 경우는 윈도우 11 이기 때문에 위 화면 처럼 나옵니다.
윈도우 10이라고 하더라도 별반 다르지 않으니 자세한 설명은 생략하겠습니다.
모든 앱 에서 내가 찾고자 하는 아나콘다 프로그램을 찾기 위해 스크롤을 내려 줍니다.
알파벳 순이라 앞쪽에 있네요
아나콘다 네비게이터든 프롬프트든 상관이 없습니다.
어차피 같은 폴더에 있을테니깐요
파일을 선택에 마우스 우클릭을 해줍니다.
그리고 나오는 메뉴에서 기타 를 클릭한뒤
다시 나오는 메뉴에서 파일 위치 열기 를 클릭 해 줍니다.

파이썬 아나콘다 자동실행 Batch 만들기

아래처럼 폴더가 열렸습니다.
그런데 여기서 주의할 점은 지금 열린 폴더는 실제 프로그램이 설치된 폴더가 아니라
아래 동그라미 안에 파일 유형 처럼 바로가기가 만들어진 경로 입니다.

파이썬 아나콘다 자동실행 Batch 만들기

그래서 한번 더 아이콘에서 우클릭을 한번 더 해서 파일 위치 열기를 해줍니다

파이썬 아나콘다 자동실행 Batch 만들기

이제 실제로 아나콘다가 설치 된 경로가 열렸습니다.

파이썬 아나콘다 자동실행 Batch 만들기

위에 빨간 박스로 표시해둔 주소표시줄을 클릭 해줍니다.
그럼 아래 처럼 실제 경로가 선택이 됩니다.
컨트롤+C (Ctrl + c) 로 복사해 주시면 됩니다.

파이썬 아나콘다 자동실행 Batch 만들기

이제 아나콘다 경로를 몰라서 못하시는 없어야 합니다

가상환경 이름 설정(conda env list)

다음은 가상환경 이름 설정입니다.
가상환경 이름 설정은 간단합니다
명령프롬프트를 열어서 아래 명령어를 입력하면 가상환경 리스트가 나오게 됩니다

conda env list

파이썬 아나콘다 자동실행 Batch 만들기

저의 경우에는 ‘py_study_3110’ 이라는 가상환경으로 작업을 진행하기에 py_study_3110 으로 설정했습니다.

파이썬 아나콘다 자동실행 Batch 파일 실행

이제 만들어진 ㅇㅇㅇㅇ.bat 파일을 더블클릭해서 실행시키시면 됩니다.

  • 위 내용은 매직블럭 님의 블로그를 참조했습니다.

35. 파이썬 – 파일 읽고 쓰기(내용 쓰기.파일 읽기)

35. 파이썬 – 파일 읽고 쓰기(내용 쓰기.파일 읽기)

이전 공부 내용에서는 파일을 생성하는 것 까지 진행을 해보았습니다.

이번에는 생성된 파일을 쓰기 모드로 열어 내용 쓰기에 대해 공부해 보겠습니다

파이썬 입출력

파일 읽고 쓰기

쓰기 모드로 파일을 열고 내용 쓰기

이전 포스팅에서는 파일을 쓰기 모드로 열어보는 것을 해봤습니다. 그 안에 내용은 쓰지 않았죠.
이번에는 문자열을 파일에 쓰는 것을 해보겠습니다.

Python
# write_test.py
file = open(r"d:\test\신규파일.txt", 'w')
for i in range(1, 11):
    text = "%d 번째 줄 입니다.\n" % i
    file.write(text)
file.close()

위에 코드를 실행하고 해당 경로로 가서 파일을 열어보면 아래처럼 결과가 나옵니다.

Python
1 번째 줄 입니다.
2 번째 줄 입니다.
3 번째 줄 입니다.
4 번째 줄 입니다.
5 번째 줄 입니다.
6 번째 줄 입니다.
7 번째 줄 입니다.
8 번째 줄 입니다.
9 번째 줄 입니다.
10 번째 줄 입니다.

다른 코드를 살펴보겠습니다.

Python
for i in range(1, 11):
    data = "%d 번째 줄 입니다.\n" % i
    print(data)

위 코드의 결과는 아래와 같습니다.

Python
1 번째 줄 입니다.

2 번째 줄 입니다.

3 번째 줄 입니다.

4 번째 줄 입니다.

5 번째 줄 입니다.

6 번째 줄 입니다.

7 번째 줄 입니다.

8 번째 줄 입니다.

9 번째 줄 입니다.

10 번째 줄 입니다.

앞서 open을 사용해 쓰기모드에서 내용을 쓴 코드와 그 다음 print 문으로 출력한 코드의 차이점은 data 를 출력하는 방식입니다.
두 번째 방식은 이전에 계속 진행했었던 모니터 화면에 출력하는 방식이고,
첫 번째 방식은 모니터 화면대신 생성한 파일에 쓰기모드로 열어 데이터를 입력하는 방식입니다.
print 대신 파일 객체인 file 의 write 함수를 사용한 것 말고는 차이가 거의 없습니다.

그리고 똑같이 줄바꿈을 해줬는데 write 함수를 썼을 때는 정상적으로 한번의 줄바꿈으로 표현이 되어 있는데 print 문을 썼을 때는 for 문으로 반복해서 진행을 하다 보니 줄바꿈이 한번 더 표현이 된 듯 합니다.

파일 읽기의 여러 가지 방법

파일을 읽는 방법에는 여러가지가 있습니다.

readline 함수 이용

먼저 reading 함수를 사용하는 방법에 대해 알아보겠습니다.

Python
# reading_test.py
file = open(r"d:\test\신규파일.txt", 'r')
line = file.readline()
print(line)
file.close()

위 코드를 보면 신규파일.txt 를 읽기모드 ‘r’ 로 파일을 열고 readline() 명령을 사용해서 해당 파일의 첫 번째 줄을 읽어 화면에 보여주는 기능을 하고 있습니다.
기존에 만들어 놨던 신규 파일이 그대로 있으면 그 파일의 첫 번째 줄을 화면에 출력합니다.

Python
1 번째 줄 입니다.
readlines 함수 이용

여기서 만약 첫 번째 줄만이 아니라 전체 줄을 화면에 출력하려면 어떻게 할까요?

Python
# reading_all_test.py
file = open(r"d:\test\신규파일.txt", 'r')
while True:
    line = file.readlines()
    if not line: break
    print(line)
file.close()

위 코드를 실행해 보면 이전에 print 문으로 출력 했던 것과 동일하게 나오는 것을 확인 할 수 있습니다.

Python
['1 번째 줄 입니다.\n', '2 번째 줄 입니다.\n', '3 번째 줄 입니다.\n', '4 번째 줄 입니다.\n', '5 번째 줄 입니다.\n', '6 번째 줄 입니다.\n', '7 번째 줄 입니다.\n', '8 번째 줄 입니다.\n', '9 번째 줄 입니다.\n', '10 번째 줄 입니다.\n']

readlines 함수를 사용하면 파일의 모든 줄을 읽어서 하나의 줄 씩 리스트 요소로 가지고 있게 됩니다.
직전에 사용했던 readline 함수와 차이점은 끝에 ‘s’ 가 하나 더 붙어 있다는 걸 유의해야 할 듯 합니다.

다음 포스팅에서는 파일 읽기의 여러가지 방법에 대해 좀 더 알아보겠습니다.

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.

34. 파이썬 – 파일 읽고 쓰기(파일 생성)

34. 파이썬 – 파일 읽고 쓰기(파일 생성)

여태까지 공부한 내용들에서 입력을 받을 때는 사용자가 직접 입력하는 방식을 사용하고, 출력 할 때는 화면에 출력을 했습니다.


그러나 입출력 방식이 꼭 이렇게만 있는 것은 아닙니다.
이번 시간에는 파일을 통해서 입출력 하는 방식에 대해 공부해 보겠습니다.
파일을 새로 만들고 프로그램에서 나온 결과값을 역시 새 파일로 출력해 보겠습니다.
또한 파일에 기록된 내용을 읽고, 새로운 내용을 추가하는 방법도 공부해 보겠습니다.

파이썬 입출력

파일 읽고 쓰기

파일 생성

다음 코드를 실행해 보겠습니다.

Python
file = open("신규파일.txt", "w")
file.close()

위 코드를 실행해 보면 프로그램이 실행된 디렉토리에 파일이 하나 생성 된 것을 확인 할 수 있습니다.

34. 파이썬 - 파일 읽고 쓰기

위 코드에서 사용된 open 은 내장함수로 파일을 생성하기 위해 사용되었습니다.
open 함수는 아래 형식처럼 ‘파일 이름’과 ‘파일 열기 모드’를 입력받고 결과값으로 파일 객체를 리턴하게 됩니다.

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

파일 열기 모드에는 여러가지가 있습니다.

  • r – 읽기 모드 : 파일을 읽기만 할때 사용됩니다.
  • w – 쓰기 모드 : 파일에 내용을 기록하고자 할 때 사용됩니다.
  • a – 추가 모드 : 파일의 마지막에 새로운 내용을 추가 하고자 할 때 사용됩니다.

주의 해야 할 건 파일을 쓰기 모드로 열게 되면 이미 파일이 존재할 경우에 원래의 내용은 모두 없어지고, 파일이 존재하지 않는다면 새로운 파일이 생성된다는 것입니다.
위 예제로 나온 코드는 해당 폴더에 파일이 없는 상태에서 신규파일.txt 를 쓰기 모드 ‘w’로 열었기 때문에 신규파일.txt 라는 이름의 새로운 파일이 현재 폴더에 생성된 것입니다.
만일 신규파일.txt 를 다른 폴더에 생성하려 한다면 아래처럼 하시면 됩니다.

Python
file = open("D:/test/신규파일.txt", "w")
file.close()

하지만 위처럼 다른 폴더를 선택해서 파일을 만들려고 한다면 해당 경로에 폴더는 이미 생성이 되어있어야 오류가 안날겁니다.
그리고 위 코드에서 사용되는 file.close() 명령은 열려 있는 파일의 객체를 닫아 주라는 의미입니다.
이 문장은 생략해도 되긴 합니다.
왜냐면 파이썬에서는 프로그램을 종료할 때 파이썬 프로그램이 열려있는 파일의 객체를 자동을 닫아주기 때문입니다.
그러나 그렇다고 해도 close()를 사용해서 직접 열려있는 파일을 닫아 주는 것이 좋습니다.
이유는 쓰기모드로 열었던 파일을 닫지 않고 다시 사용하려고 한다면 오류가 발생할 수 있기 때문입니다.

파일 경로와 슬래시(/)

보통 윈도우에서 파일 경로를 표현 할 때는 경로에 역슬래시(\) 를 사용해 D:\ 식으로 표현을 합니다.(실제 화면상에서는 \ 로 보이기도 합니다.)
하지만 위 코드에서는 슬래시(/)를 사용해 D:/test/신규파일.txt 라고 표현 했습니다.
만약 역슬래시를 사용해 경로를 표현하고자 한다면 D:\\test\\신규파일.txt 처럼 역슬래시 2개를 연달아 붙여서 사용합니다.
또 다른 방법으로는 r”D:\test\신규파일.txt” 이라고 표현을 해주면 문자열 앞에 위치한 r 문자(Raw String)와 문자열이 만나 경로를 표현해 주게 됩니다.
이런식으로 표현을 안 해주면 “D:\new\test\신규파일.txt” 처럼 \n 이스케이프 문자가 있을 경우에 줄바꿈 문자로 잘못 판단 되어 엉뚱한 파일 경로로 판단할수 있기 때문입니다.

이번 시간에는 파일 입출력 중 파일 읽고 쓰기의 첫번째 시간으로
파일을 생성하는 방법에 대해 공부해 봤습니다.
다음 시간에는 파일을 쓰기 모드로 열어서 내용을 쓰는 방법에 대해 공부해 보도록 하겠습니다.

이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.

34. 파이썬 - 파일 읽고 쓰기(파일 생성)

33. 파이썬 사용자 입출력

33. 파이썬 사용자 입출력

지난 시간까지 파이썬 함수에 대해서 공부해 봤습니다.
이번 포스팅에서는 파이썬 사용자 입출력(입력과 출력)에 대해 공부해 보도록 하겠습니다.

사용자 입출력

대부분의 프로그램들은 사용하는 사람의 입력을 받아 그에 따른 결과를 출력하게 됩니다.
인터넷 게시판에 글을 쓴 다음에 확인 버튼을 클릭해야만 글이 정상적으로 게시판에 올라가는 것이 대표적인 예가 되겠습니다.
앞서 입출력이 어떤 의미인지 공부 했었습니다.
이제 더 다양한 입력과 출력 방법에 대해 공부 해 보겠습니다.

사용자 입력

항상 변수에 값을 먼저 대입해 놓고 프로그램이 동작하는것은 아닙니다
사용자에게서 값을 입력받아 변수에 대입을 해야 하는 경우가 더 많을수 있습니다.

input 사용하기

Python
>>> i = input()
Python's favorite food is perl
>>> i
"Python's favorite food is perl"

위 코드처럼 input 은 사용자에게서 키보드로 입력 받아서 문자열로 저장을 하게 됩니다.

프롬프트를 띄워서 입력받기

프로그램을 실행 시켜서 사용자에게 “숫자를 입력하세요”, “이름을 입력하세요” 라고 하는 안내 문구나 질문이 나오도록 할 때 input() 안 괄호 안에 안내문구를 입력하여 프롬프트를 띄워줄 수 있습니다.

input("안내문구")
Python
>>> number = input("정수를 입력하세요: ")
정수를 입력하세요: 

위 코드를 실행 해 보면 프롬프트에 숫자 5을 입력하면 변수 number 에 숫자 5가 대입이 됩니다.
이후에 print(number)로 출력을 해볼 수 있습니다.

Python
>>> number = input("정수를 입력하세요: ")
정수를 입력하세요: 5
>>> print(number)
5
>>>

그런데 여기서 확인 해 봐야 할 것이 있습니다.
숫자 5를 입력해서 숫자가 나오는 걸 봤습니다.
그럼 print 되어 나온 5는 정말 숫자 일까요?

Python
>>> type(number)
<class 'str'>
>>>

type 명령어를 통해 변수 number 를 확인해 보면 문자열이라고 나옵니다.
input 명령은 입력되는 모든 것을 문자열로 취급 한다는 것을 알고 있어야 할 것 입니다.

print 에 대하여

print 라고 하면 그냥 딱 봐도. 그리고 우리가 알고 있는 것도 데이터를 출력하라는 용도로 알고 있습니다.
print 문을 통해 데이터를 출력하는 사용 예를 보겠습니다.

Python
>>> i = 456
>>> print(i)
456
>>> r = "rainbow"
>>> print(r)
rainbow
>>> l = [4, 5, 6]
>>> print(l)
[4, 5, 6]
큰 따옴표(“)로 둘러싸인 문자열은 + 연산과 동일
Python
>>> print("Python's " "favorite " "food " "is" " perl") # 1. 큰 따옴표로 둘러싼 문자열
Python's favorite food is perl
>>> print("Python's " + "favorite " + "food " + "is" + " perl") # 2. + 문자열 + 연산
Python's favorite food is perl

1번 코드와 2번 코드의 결과값이 동일한 것을 알 수 있습니다.

문자열 띄어쓰기는 콤마 사용
Python
>>> print("Python's", "favorite", "food", "is", "perl")
Python's favorite food is perl

이전 큰 따옴표로 둘러싼 문자열과 + 연산을 한 코드에서는 띄어쓰기를 위해 “” 안에 띄어쓰기를 해주었습니다.
그런데 콤마(,)를 사용하면 큰따옴표(“”) 안에 띄어쓰기가 되어 있지 않아도 콤마로 인해 띄어쓰기가 되어 있는 걸 볼 수 있습니다.

한 줄에 결과값 출력

예전 구구단 을 만들기 위하여 for 문을 사용했을 때 보았듯이 한 줄에 결과값을 계속해서 출력하게 하려면 매개변수 end 를 사용해서 끝문자를 지정해 준 적이 있습니다.

Python
>>> for i in range(30):
...     print(i, end=' ')
...
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 >>>

위의 코드를 보는 것처럼 end 매개변수의 초기값은 줄바꿈 문자(\n) 입니다.

이렇게 파이썬 사용자 입출력에 대해 공부해 봤습니다.

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
33. 파이썬 사용자 입출력

32. 파이썬 함수 – 함수와 변수

32. 파이썬 함수 – 함수와 변수

파이썬 함수에 대해 공부 하고 있습니다.
정말 공부해야 할 양이 어마무시 한 거 같습니다.

함수와 변수

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

함수 안에서 사용할 변수의 효력 범위에 알아보겠습니다.
함수 안에서 사용할 변수의 이름을 함수 외부에서도 똑같이 사용하면 어떻게 될까요?

Python
>>> # chrtest.py
>>> a = 10
>>> def chartest(a):
... a = a + 1
...
>>> chartest(a)
>>> print(a)
10

위의 코드를 살펴보겠습니다.
a 라는 변수를 먼저 선언한 뒤 10 이라는 숫자를 대입했습니다.
그런 다음에 chartest 라는 함수를 만들었는데 이 함수의 내용은 a 라는 입력 값을 받아서 1을 더해준뒤 결과는 리턴하지 않는 것입니다.
그리고 함수에 입력값으로 a 를 주었습니다. 그리고 print 문을 사용해 a 를 출력해 보았습니다.

얼핏 보기에는 매개변수 a 의 값에 1을 더했으니 당연히 11 이 출력될 것만 같았습니다.
하지만 실제로 실행을 해보니 그냥 원래 a 에 대입되었던 10 이 출력이 됩니다.

이렇게 되는 이유는 함수 안에서 사용하는 매개변수는 함수 안에서만 사용되기 때문입니다.
즉 함수만의 변수라고 할 수 있습니다.
def chartest(a) 라는 함수 선언에서 입력값을 전달받게 되는 a라는 매개변수는 함수 안에서 사용 되어지는 변수이므로 함수 밖의 a 라는 변수와는 상관이 없다는 의미입니다.

매개변수의 이름을 바꿔보아도 이전의 함수 chartest 함수와 동일하게 동작을 합니다.

Python
>>> def chartest(hi):
...     hi = hi + 1

한번 더 확인 해 보겠습니다.

Python
>>> # chartest_err.py
>>> def chartest(a):
...    a = a + 1
...
>>> chartest(30)
>>> print(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

얼핏 보기엔 chartest 함수의 입력값으로 30을 받고 30 + 1 을 해서 31 을 출력할것 같지만
실제로는 오류가 발생하게 됩니다.
함수안에서는 31 이 되겠죠. 하지만 a 라는 변수를 어디에서도 찾을 수가 없기에 오류가 발생하게 됩니다.
함수 안에서 선언한 매개변수는 함수 안에서만 사용되기 때문입니다.
함수 밖에서는 사용되지 않는다는 걸 다시 확인 할 수 있습니다.

이 부분은 상당히 중요한 부분으로 꼭 이해하고 넘어가야 할 듯 합니다.

함수 안에서 함수 외부의 변수 변경하기

return 사용

비주얼스튜디오 코드를 사용해 코드를 입력해 보겠습니다.

Python
# chartest_return.py
a = 10
def chartest(a):
   a = a + 10
   return a
 
 a = chartest(a)
 print(a)

먼저 return 을 사용 해 보겠습니다. chartest 함수에 입력으로 들어오는 값에 10을 더한 값을 리턴하게끔 되어 있습니다.
a = chartest(a) 라고 하면 a 에 chartest 함수의 리턴값이 대입되게 됩니다.
여기서도 chartest 함수의 매개변수 a 와 함수 외부에 a = 10 의 a 와는 별개의 것이라고 보시면 됩니다.

Python
20

global 명령어 사용

globa 이라는 명령어를 사용해서도 함수 안에서 함수 외부의 변수 변경하기 가 가능합니다.

Python
# chartest_global.py
a = 30
def chartest():
    global a
    a = a + 10

chartest()
print(a)

위 코드에서 보이듯이 chartest 함수 안에서 global a 명령은 함수 안에서 함수 밖의 a 라는 변수를 직접 사용하겠다는 의미 입니다.
그러나 실제로 프로그래밍을 진행을 할때는 global 명령어를 사용하는 것 보단 함수를 독립적으로 존재하게끔 유지하는 것이 좋다고 합니다.
외부 변수에 휘둘리는 함수가 되기 때문에 그닥 좋지가 않다는 걸 알고 있어야겠습니다.

예약어 lambda

함수를 생성할 때 사용 되는 예약어로 lambda 가 있습니다.
lambda 는 def 와 같은 역할을 합니다.
일반적으로 함수를 한 줄로 간결하게 만들려고 한다면 lambda 즉 람다를 사용해 볼 수 있습니다.
프로그래밍을 하는 중 def 를 사용 안 해도 될만큼 간단하거나 def 를 사용할 수 없는 상황에 사용되기도 합니다.

lambda 사용법

lambda의 사용법은 아래와 같습니다.

함수명 = lambda 매개변수 1, 매개변수 2,.....: 매개변수를 이용한 표현식

lambda 예제 코드

lambda 를 사용해 코딩을 해보겠습니다.

Python
>>> mmm = lambda a, b: a * b
>>> result = mmm(10, 30)
>>> print(result)
300

lambda 의 경우를 보면 위 처럼 return 명령어가 없어도 결과를 리턴 하는 것을 볼 수 있습니다.
위 예제 코드는 아래 def 를 사용한 코드와 완전히 동일합니다

Python
>>> def mmm(a, b):
...     return a * b
...
>>> result = mmm(10, 30)
>>> print(result)
300
  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
32. 파이썬 함수 변수의 효력 범위

31. 파이썬 입출력값에 따른 함수의 형태 – 다섯번째

31. 파이썬 입출력값에 따른 함수의 형태 – 다섯번째

파이썬 입출력값에 따른 함수의 형태에 대해 계속 공부해 나가겠습니다.

파이썬 입출력값에 따른 함수의 형태

지난 포스팅에 함수는 return 문을 만나면 리턴값을 돌려주고 함수를 빠져나간다고 했습니다
이번 포스팅에서는 return 문의 또 다른 쓰임새부터 매개변수에 초깃값 미리 설정하는 방법까지 공부해 보겠습니다

return 문의 또 다른 쓰임새

상황에 따라 함수를 빠져나가고 싶다면 return 을 단독으로 사용해 함수에서 바로 빠져나갈 수 있습니다.

Python
>>> def say_nicknm(nicknm):
...     if nicknm == "바보":
...         return
...     print("당신의 별명은 %s 입니다." % nicknm)
...
>>>

위에 예로 든 코드는 ‘별명’을 입력 받아서 출력 하는 함수 입니다. 여기서 생성한 say_nicknm 함수 역시 리턴값은 없습니다(전에 진행했던 포스팅에서 문자열을 출력한다는 것과 리턴값이 있다는 것은 다른 의미인 걸 공부했었습니다.
28. 파이썬 입출력값에 따른 함수의 형태 – 두번째 시간
헷갈리지 말아야 할게 함수의 리턴값은 무조건 return 문에 의해서만 생긴다는 것을 명심해야 합니다.

위 코드에서는 “바보”라는 문자열이 들어오면 문자열을 출력하지 않고 함수를 바로 빠져나가게 됩니다.

Python
>>> say_nicknm('천재')
당신의 별명은 천재 입니다.
>>> say_nicknm('바보')
>>>

위 코드 실행결과 처럼 nicknm 에 ‘바보’라는 문자열이 들어오는 순간 바로 종료하게 됩니다.
이렇게 return 을 이용해 함수를 빠져나가는 구현방식은 실제 프로그래밍을 할때 자주 사용됩니다.

매개변수에 초기값 설정해 놓기

이번에는 좀 다른 형태의 함수 인수 전달 하는 방법입니다.
매개변수에 초기값을 미리 설정해 놓는 경우입니다.

Python
>>> def say_myinfo(name, age, man=True):
...     print("저의 이름은 %s 입니다." % name)
...     print("저의 나이는 %d 살 입니다." % age)
...     if man:
...         print("저는 남자입니다.")
...     else:
...         print("저는 여자입니다.")
...

위 코드를 보면 say_myinfo 함수의 매개변수가 name, age, man=True 으로 3개가 설정이 됩니다. 그런데 man=True 처럼 매개변수에 미리 값을 넣어줬습니다.
이 방법이 매개변수에 초기값을 미리 설정하는 방법입니다.
위 코드를 해석하면 say_myinfo 함수가 3개의 매개변수를 받아서 마지막 인수인 man 이 True 인 경우에는 “저는 남자입니다.” False 이면 “저는 여자입니다.” 를 출력하게 되어 있습니다.
실제로 say_myinfo 를 사용해 보겠습니다.

Python
>>> say_myinfo('파이썬', 15)
저의 이름은 파이썬 입니다.
저의 나이는 15 살 입니다.
저는 남자입니다.

위 실행 결과처럼 매개변수에 2개를 주면 name 에는 ‘파이썬’, age 에는 15 숫자가 대입됩니다. 그리고 man 이라는 변수에는 아무 입력이 없었기에 초기값 True 를 가지게 되는 것입니다.

Python
>>> say_myinfo('파이썬', 15, False)
저의 이름은 파이썬 입니다.
저의 나이는 15 살 입니다.
저는 여자입니다.

똑같이 진행 해 보되 man 매개변수 값에 False 값을 대입해 봤습니다. man = False 가 되기에 else 문을 만나 ‘나는 여자입니다’ 문장이 출력 되는 걸 확인 할 수 있습니다.

매개변수에 초기값 설정할 때 주의할 점

Python
>>> def say_myinfo(name, man=True, age):
  File "<stdin>", line 1
    def say_myinfo(name, man=True, age):
                                   ^^^
SyntaxError: non-default argument follows default argument

위 코드 처럼 age 와 man 의 매개변수 위치를 바꿔보았습니다.
함수의 다음 부분은 입력도 못하고 오류가 발생했습니다.
위처럼 코드를 작성하게 되면 name 다음에 나이를 입력 하려고 할 때 파이썬 인터프리터가 어디에 대입해야 할지 판단하기가 어려워 오류를 발생시키게 되는 것입니다.

오류메세지 내용 ‘SyntaxError: non-default argument follows default argument’ 은 초기값 없는 매개변수(age)는 초기값이 있는 매개변수(man) 뒤에 사용할 수 없다는 의미입니다.
결론적으로 (name, age, man=True)는 허용되지만 (name, man=True, age) 는 허용이 안된다는 것입니다.
초기값을 설정하고 싶은 매개변수는 항상 뒤쪽에 위치해야 하는 걸 명심해야 겠습니다.

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
31. 파이썬 입출력값에 따른 함수의 형태 – 다섯번째

30. 파이썬 입출력값에 따른 함수의 형태 – 네번째

30. 파이썬 입출력값에 따른 함수의 형태 – 네번째

파이썬 입출력값에 따른 함수의 형태는 알아야 할게 많네요
벌써 네번째 시간입니다.
지난 시간에 이어서 이번에는 키워드 매개변수 kwargs 에 대해 공부해 보겠습니다.

파이썬 입출력값에 따른 함수의 형태

키워드 매개변수 kwargs

지난번 시간에는 입력값을 여러 개 받기 위해 매개변수 앞에 * 을 붙였습니다.
이번에 공부할 키워드 매개변수를 사용하기 위해서는 매개변수 앞에 별을 두개를 붙입니다(**)

키워드 매개변수 kwargs 예

Python
>>> def print_kwargs(**kwargs):
...     print(kwargs)
...

위 코드에 나오는 print_kwargs 함수는 매개변수 **kwargs 를 출력하는 단순한 함수 입니다.
print_kwargs 함수를 사용해 보겠습니다.

Python
>>> print_kwargs(a=3)
{'a': 3}
>>> print_kwargs(name='python', age=10)
{'name': 'python', 'age': 10}

위 사용된 예를 보면 print_kwargs 함수에 입력이 a=3 이라고 하면 kwargs 는 {‘a’: 3} 이라고 하는 딕셔너리가 생성이 됩니다.
그리고 name=’python’, age=10 이라고 사용을 하게 되면 {‘name’: ‘python’, ‘age’: 10} 이라는 딕셔너리가 생성이 됩니다.
이처럼 **kwargs 처럼 매개변수 앞에 별 두개(**)를 사용하게 되면 매개변수 kwargs 는 딕셔너리가 되고 모든 key=value 의 형태의 입력되는 값들이 그 딕셔너리에 저장이 되는 것입니다.

이전 포스팅에서의 args 처럼 kwargs 는 keyword arguments 의 약자로 관례적으로 사용된다는 것은 참고로만 알고 계시면 될 듯 합니다

함수의 리턴값은 언제나 하나

이게 무슨 말일까요?
다음 코드를 보겠습니다

Python
>>> def add_and_mul(a, b):
...    return a+b, a*b

위 코드는 add_and_mul 함수에서 2개의 입력 인수를 받아서 더하기와 곱셈한 결과를 리턴하는 함수입니다.
add_and_mul 함수를 아래 처럼 호출해 보겠습니다

Python
>>> result = add_and_mul(100, 200)

여기서 result 라는 리턴값은 하나만 쓰였습니다.
리턴값이 a+b, a*b 인데 문제가 생길 수도 있다고 생각들겠지만 오류는 발생하지 않습니다.
왜그러냐면 함수의 리턴값은 2개가 아니라 언제나 1개라는데 있습니다.
add_and_mul 함수의 리턴값 a+b 와 a*b 는 튜플값 하나인 (a+b, a*b) 로 리턴이 됩니다
결국 리턴값은 하나 라는 겁니다

아래처럼 result 를 print 해보겠습니다.

Python
>>> print(result)
(300, 20000)

위처럼 결과값으로 (300, 20000) 이라는 튜플 값을 가지게 됩니다.
만약에 이렇게 나오는 하나의 튜플값을 2개로 분리해서 보고 싶다면 다음처럼 하면 됩니다.

Python
>>> result1, result2 = add_and_mul(100, 200)

위 코드처럼 result1 과 result2 로 나누어서 호출을 하게되면 result1 은 100, result2 는 200 의 값을 가지게 됩니다.
다른 예를 보겠습니다.

Python
>>> def add_and_mul(a,b):
...     return a+b
...     return a*b
...
>>>

만약 위 코드 처럼 return 문을 2번 사용해서 2개의 리턴값을 돌려주지는 않을까 하는 생각이 들수도 있지만 파이썬에서는 위처럼 함수를 사용하면 어리석다고 해야 할 겁니다.
다음 코드를 보면 알 수 있습니다.

Python
>>> result = add_and_mul(100, 200)
print(result)
300

add_and_mul(100, 200) 를 실행해 보면 리턴값으로 300 만 나옵니다.
두번째 리턴문인 return a*b 는 실행이 안되었습니다.
앞서 리턴값은 언제나 하나 라는게 또 증명이 되네요
위 코드는 아래 코드랑 똑같습니다.

Python
>>> def add_and_mul(a,b):
...     return a+b
...
>>>

왜 이렇게 되냐하면 함수는 return 문을 만나는 순간 리턴값을 돌려주고 함수를 빠져나가게 되기 때문입니다.

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
30. 파이썬 입출력값에 따른 함수의 형태 – 네번째

29. 파이썬 입출력값에 따른 함수의 형태 – 세번째 시간

29. 파이썬 입출력값에 따른 함수의 형태 – 세번째 시간

지난 포스팅에 이어서 파이썬 입출력값에 따른 함수의 형태에 대해 공부해 보도록 하겠습니다.

입출력값에 따른 함수의 형태에는 일반적인 함수, 입력값이 없는 함수, 리턴값이 없는 함수, 입력값도 리턴값도 없는 함수, 그리고 매개변수를 지정하여 호출해 보는 것 까지 진행을 했습니다.

파이썬 입출력값에 따른 함수의 형태

입력값이 몇 개가 될지 모르는 함수의 형태 해결방법

프로그래밍을 하다보면 입력값이 한개가 될 때도 있지만 입력값이 여러 개일 경우도 있습니다.
이럴 때 그 입력값들을 다 더해 주는 함수가 있다고 생각해 봅시다.
그런데 여기서 문제는 입력받을 값들이 몇 개가 될지 모른다면 어떻게 해야 할까요?
당연히 프로그래밍을 할 때 상당히 난감해 지겠죠
파이썬에서는 이렇게 입력값이 몇 개가 될지 모를 때의 방법이 있습니다.

Python
def 함수이름(*매개변수):
    수행할 문장
    ...

기존에 했던 것과 차이점이 보이시나요?
위에 보시는 것 처럼 괄호 안에 매개변수를 입력하는데 앞에 * 이 붙어 있습니다.

입력값을 여러 개 받는 함수

입력값을 여러 개 받는 함수를 만들어 보겠습니다.
만약에 add_money(100, 200) 이면 300 을, add_money(100, 200, 300) 이면 600을, add_money(100, 200, 300, 400, 500, 600, 700, 800, 900, 1000) 이면 5500 을 리턴 하는 함수입니다.

Python
>>> def add_money(*money):
...     Wallets = 0
...     for i in money:
...         Wallets = Wallets + i
...     return Wallets
...
>>>

위 코드는 앞서 설명한 매개변수 앞에 * 가 붙음으로서 입력값이 몇 개가 되던 상관이 없습니다.
*money 처럼 매개변수 앞에 * 을 붙이면 입력되는 값들을 모두 모아서 튜플로 만들어 주기 때문입니다.
만약 add_money(100, 200, 300) 처럼 함수를 사용을 하게 된다면 money 는 (100, 200, 300) 이 되고, add_money(100, 200, 300, 400, 500, 600, 700, 800, 900, 1000) 처럼 함수를 사용하게 된다면 money 는 (100, 200, 300, 400, 500, 600, 700, 800, 900, 1000) 이 되는 것 입니다.
*money 는 임의로 정한 변수 이름이기 때문에 변경은 당연히 가능합니다.


보통은 이런 경우 args라는 매개변수를 사용을 합니다.
args의 의미는 인수를 뜻하는 영어 단어 arguments 의 약자로 관례적으로 많이 사용한다고 합니다.

입력값을 여러 개 받는 함수 사용

앞에서 만든 add_money 함수를 사용해 보겠습니다

Python
>>> Wallets = add_money(100, 200, 300)
>>> print(Wallets)
600
>>> Wallets = add_money(100, 200, 300, 400, 500, 600, 700, 800, 900, 1000)
>>> print(Wallets)
5500

위 코드를 사용한 것을 보면 add_money(100, 200, 300)으로 함수를 호출하면 600 을 리턴하게 되고, add_money(100, 200, 300, 400, 500, 600, 700, 800, 900, 1000) 으로 함수를 호출하면 5500 을 리턴하는 것을 확인 할 수 있습니다.

입력값을 여러 개 받는 매개변수 와 추가 변수 사용

입력값을 여러개 처리할때 앞서 def add_money(*money): 이렇게 *money 하나를 사용했었는데, 이 매개변수 하나만 사용할 수 있는 것은 아닙니다.

Python
>>> def add_money(choice, *money):
...     if choice == "add":
...         Wallets = 0
...         for i in money:
...             Wallets = Wallets + i
...     elif choice == "mul":
...         Wallets = 1
...         for i in money:
...             Wallets = Wallets * i
...     return Wallets
...
>>>

여러 개의 입력값을 받는 *money 매개변수 앞에 choice 라는 변수를 추가했습니다.

Python
>>> Wallets = add_money('add', 100, 200, 300, 400, 500)
>>> print(Wallets)
1500
>>> Wallets = add_money('mul', 100, 200, 300, 400, 500)
>>> print(Wallets)
1200000000000

choice 변수를 추가한 위의 코드 사용 결과를 보면 ‘add’ 가 입력이 되면 모든 값을 더해서 1500 을 리턴하고, ‘mul’ 이 입력되 되면 모든 값을 곱해서 1200000000000 이 리턴되는 것을 확인 할 수 있습니다.

실제로 저런 함수를 써서 돈 좀 불려봤으면 좋겠네요 ㅎ

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
29. 파이썬 입출력값에 따른 함수의 형태 – 세번째 시간

28. 파이썬 입출력값에 따른 함수의 형태 – 두번째 시간

28. 파이썬 입출력값에 따른 함수의 형태 – 두번째 시간

지난 포스팅에 파이썬 입출력값에 따른 함수의 형태에서 일반적인 함수와 입력값이 없는 함수에 대해 공부했었습니다.

이번 포스팅에서는 파이썬 입출력값에 따른 함수의 형태 – 두번째 시간으로 리턴값이 없는 함수와 입력값도 리턴값도 없는 함수, 그리고 매개변수 지정하여 호출하기 에 대해 공부해 보겟습니다.

파이썬 입출력값에 따른 함수의 형태

리턴값이 없는 함수

리턴값이 없는 함수 예

Python
>>> def mmm(a, b):
...     print("%d, %d 의 차는 %d 입니다." % (a, b, a-b))
...
>>>

위 처럼 mmm 이라는 함수를 먼저 만들고 함수를 실행시켜 보겠습니다.

Python
>>> mmm(5, 7)
5, 7 의 차는 -2 입니다.

위의 코드 예처럼 리턴값이 없는 함수의 형식은 아래와 같습니다.

함수이름(입력인수 1, 입력인수 2, …)

리턴값이 없는 함수 확인

리턴값이 진짜 있는지 없는지 확인하려면 다음과 같이 해보면 됩니다.

Python
>>> a = mmm(5, 7)
5, 7 의 차는 -2 입니다.

여기서 처음에 헷갈렸던게 ‘5, 7 의 차는 -2 입니다.’ 라는 문장을 출력을 해주었는데 리턴값이 없다는게 이상합니다.
이 부분은 이렇게 보시면 됩니다.
print 문은 함수의 구성요소의 하나인 ‘수행할 문장’에 해당하는 부분이라고 보시면 됩니다.
리턴값은 당연히 없습니다.
리턴값 이라는 건 return 명령으로만 돌려받을 수 있습니다.
이 부분을 확인해 보기 위해 예를 들어보겠습니다.

Python
>>> a = mmm(5, 7)
5, 7 의 차는 -2 입니다.
>>> print(a)
None

위 코드를 보면 a 를 print 로 출력을 해보면 None 이라는 결과가 나옵니다.
None 이라는 건 거짓을 나타내는 자료형이라고 예전에 공부했었죠
mmm 함수 처럼 리턴값이 없을 때 a = mmm(5, 7) 처럼 사용하면 mmm 함수는 리턴값으로 a 변수에 None 을 리턴하게 됩니다.
None 값을 리턴했다는 것은 리턴값이 없다는 의미 입니다.

입력값도 리턴값도 없는 함수

입력값이 없는 함수, 리턴값이 없는 함수에 이어 이번엔 입력값도 리턴값도 없는 함수에 대해 공부해 보겠습니다.

입력값도 리턴값도 없는 함수의 예

Python
>>> def say():
...     print('Hello')
...
>>>

위 코드를 보면 입력 인수를 받는 매개변수도 없고, return 문도 없습니다.
이런 함수를 입력값도 리턴값도 없는 함수라고 보시면 됩니다.
이렇게 입력값도 없고 리턴값도 없는 함수를 사용하는 방법은 한가지 뿐입니다.

Python
>>> say()
Hello

이렇게 입력값도 리턴값도 없는 함수의 형식은 아래와 같습니다

함수이름()

매개변수 지정하여 호출하기

함수를 호출할 때 매개변수를 지정할 수도 있습니다.

Python
>>> def mmm(a, b):
...     return a - b
...

a, b 두 개의 숫자를 입력받아서 먼저 입력된 a 에서 두번째 입력된 b 를 빼서 리턴하는 mmm 이라는 함수 입니다.
이 함수를 매개변수를 지정하여 사용하는 방법입니다.

Python
>>> result = mmm(a=5, b=7) # a 에 숫자 5, b 에 숫자 7 을 대입
>>> print(result)
-2

매개변수 지정하여 호출하기의 장점

Python
>>> result = mmm(b=7, a=5) # b 에 숫자 7, a 에 숫자 5 를 대입
>>> print(result)
-2

위 코드를 보면 이전 코드와 다르게 순서를 바꿨습니다.
이처럼 매개변수를 지정하여 호출하게 되면 순서에 상관없이 사용할 수 있다는 장점이 있습니다.

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
28. 파이썬 입출력값에 따른 함수의 형태 – 두번째 시간

27. 파이썬 입출력값에 따른 함수의 형태 – 첫번째

27. 파이썬 입출력값에 따른 함수의 형태 – 첫번째

지난 시간에 이어 파이썬 함수 에 대해 공부하도록 하겠습니다.

매개변수와 인수

파이썬 입출력값에 따른 함수의 형태를 알아보기 전
먼저 오늘은 파이썬 함수에 사용되는 매개변수 와 인수 에 대해 알아보겠습니다.
매개변수 와 인수는 헷갈릴 수 있는 용어이니 개념을 잘 정립 하는게 좋을 듯 합니다.
먼저 매개변수는 함수에 입력받는 값을 전달하는 변수를 의미합니다.
그리고 인수는 함수를 만들고 이후 함수를 호출할 때 전달하는 입력값을 의미 합니다.
아래 예를 보겠습니다.

Python
def mmm(a, b):   # a와 b 는 매개변수 입니다.
    return a - b
print(mmm(2, 5)  # 2와 5는 인수 입니다.
  • 매개변수 – 함수에 전달된 값을 저장하는 변수
  • 인수 – 함수에 전달하는 값

파이썬에서는 이처럼 같은 의미를 가진 용어들이 종종 등장하니 주의 해야 합니다.
용어의 혼용은 파이썬 뿐만 아니라 프로그래밍을 공부하다보면 어려운 부분 중의 하나입니다.
내가 만든 프로그램도 시간이 지나서 보면 어? 그땐 어떻게 이걸 했지 라는 생각이 드는데
다른 사람이 프로그래밍 해놓은 코드를 보거나 또 그 코드의 번역본을 보다보면 의미는 같으면서도 표현이 다른 용어들을 종종 보게 될것입니다.
예를 들어보면 입력되는 값을 함수의 인수, 파라미터 ,매개변수 등으로 표현하기도 하고 리턴값을 결과값, 출력값, 반환값 등으로 표현하기도 합니다.
이렇게 용어가 다양하게 표현되지만 의미는 같은 경우가 많습니다.
이런 용어들을 기억해 놓으면 머리 아픈일은 좀 덜 할 거 같네요

파이썬 입출력값에 따른 함수의 형태

앞서 공부한 것 처럼 함수는 입력되는 값을 처리하여 그 결과를 리턴값(출력값)으로 돌려주게 됩니다.
이처럼 함수는 입출력값이 있고 없고에 따라 4가지 유형으로 나눠지게 됩니다.

일반적인 함수

보통 입력값이 있고 출력값이 있는 함수가 일반적입니다.
앞으로 우리가 프로그래밍을 하게 되면 이런 함수들이 대부분 일 것 입니다.

Python
def 함수이름(매개변수):
    수행할 문장 1
    수행할 문장 2
    ...
    return 리턴값

앞서 만들어 봤던 함수는 일반적인 함수의 전형적인 예입니다.

Python
def mmm(a, b):
    result = a - b
    return result

위 코드를 보면 mmm 이라는 함수는 a, b 두개의 입력값을 a – b 해서 그 결과값을 result 라는 변수에 대입하고 출력하게 됩니다.
위 함수를 사용해 보겠습니다.

Python
>>> a = mmm(2, 5)
>>> print(a)
-3

입력값으로 2 와 5 를 입력받아 a 변수에 출력값을 저장하고 출력했습니다.
이와 같이 입출력값이 있는 함수의 사용법은 아래와 같습니다.

리턴값(출력값)을 받을 변수 = 함수이름(입력인수 1, 입력인수 2, …)

입력값이 없는 함수

입력값이 없는 함수는 어떻게 생겨먹었을까?
다음 예를 보겠습니다.

Python
>>> def say():
...     return 'Hello'
...
>>>

위처럼 say 라는 함수를 만들고 매개변수 부분을 나타내는 함수이름 뒤의 괄호 부분은 비어있습니다.
이렇게 만들어진 say 함수를 사용해 보겠습니다

Python
>>> h = say()
>>> print(h)
Hello

이렇게 입력값이 없이 함수 이름 뒤 괄호안의 매개변수가 비어있는 입력값이 없는 함수는 사용을 할때에도 say() 처럼 괄호안에 아무것도 넣으면 안됩니다.
위 함수를 사용하면 입력값이 따로 없어도 ‘hello’ 라는 문자열을 출력하게 됩니다.
이것은 h = say() 라고 코드를 입력하게 되면 h 라는 변수에 ‘Hello’ 라는 문자열을 대입하라는 것과 동일한 것입니다.
이렇게 입력값이 없고 리턴값(출력값)만 있는 함수의 사용법은 다음과 같습니다

리턴값(출력값)을 받을 변수 = 함수이름()

이번 시간에는 파이썬 입출력값에 따른 함수의 형태 중 일반적인 함수와 입력값이 없는 함수에 대해 알아보았습니다.
다음 포스팅에 이어서 파이썬 입출력값에 따른 함수의 형태에 대해 더 알아보는 시간을 가져보겠습니다

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
27. 파이썬 입출력값에 따른 함수의 형태