{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 04-1 함수\n", "\n", "### 파이썬 함수의 구조\n", "\n", "```\n", "def 함수명(입력 인수):\n", " <수행할 문장1>\n", " <수행할 문장2>\n", " ...\n", "```" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7\n" ] } ], "source": [ "def sum(a, b):\n", " return a+b\n", "\n", "a = 3\n", "b = 4\n", "c = sum(a, b)\n", "\n", "print(c)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 입력값과 결과값에 따른 함수의 형태\n", "\n", "- 일반적인 함수: 위 예제의 sum 함수\n", "- 입력값이 없는 함수\n", "- 결과값이 없는 함수\n", "- 입력값도 결과값도 없는 함수" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hi\n" ] } ], "source": [ "# 입력값이 없는 함수\n", "\n", "def say():\n", " return 'Hi'\n", "\n", "a = say()\n", "\n", "print(a)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3, 4의 합은 7입니다.\n" ] } ], "source": [ "# 결과값이 없는 함수\n", "\n", "def sum(a, b):\n", " print(\"%d, %d의 합은 %d입니다.\" % (a, b, a+b))\n", " \n", "sum(3, 4)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3, 4의 합은 7입니다.\n", "None\n" ] } ], "source": [ "a = sum(3, 4)\n", "\n", "print(a)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hi\n" ] } ], "source": [ "# 입력값도 결과값도 없는 함수\n", "\n", "def say():\n", " print('Hi')\n", " \n", "say()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 입력값이 몇 개가 될지 모를 때는 어떻게 해야 할까?\n", "\n", "- 괄호 안의 입력 인수 부분이 __*입력변수__ 로 바뀐다.\n", "- 입력변수 앞에 * 를 붙이면 입력값들을 전부 모아 튜플로 만들어서 전달해 준다.\n", "\n", "```\n", "def 함수이름(*입력변수):\n", " <수행할 문장>\n", " ...\n", "```" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# 여러 개의 입력값을 받는 함수 만들기\n", "\n", "def sum_many(*args):\n", " sum = 0\n", " \n", " for i in args:\n", " sum = sum + i\n", " \n", " return sum" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6\n" ] } ], "source": [ "result = sum_many(1, 2, 3)\n", "print(result)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "55\n" ] } ], "source": [ "result = sum_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n", "print(result)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# 고정 인자와 유동 인자 같이 사용하기\n", "\n", "def sum_mul(choice, *args):\n", " if choice == \"sum\":\n", " result = 0\n", " for i in args:\n", " result += i\n", " elif choice == \"mul\":\n", " result = 1\n", " for i in args:\n", " result *= i\n", " \n", " return result" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "15\n" ] } ], "source": [ "result = sum_mul(\"sum\", 1, 2, 3, 4, 5)\n", "print(result)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "120\n" ] } ], "source": [ "result = sum_mul(\"mul\", 1, 2, 3, 4, 5)\n", "print(result)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 함수의 결과값은 언제나 하나이다\n", "\n", "- return 문이 하나이다." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(7, 12)\n" ] } ], "source": [ "# 결과값을 튜플로 반환하게 된다.\n", "\n", "def sum_and_mul(a, b):\n", " return a+b, a*b\n", "\n", "result = sum_and_mul(3, 4)\n", "\n", "print(result)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7\n", "12\n" ] } ], "source": [ "# 별도의 변수로 받기\n", "\n", "sum, mul = sum_and_mul(3, 4)\n", "\n", "print(sum)\n", "print(mul)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7\n" ] } ], "source": [ "# return 문이 두개일 경우 오류는 발생하지 않고, 첫번째 return 문만 실행한다.\n", "\n", "def sum_and_mul(a, b):\n", " return a+b\n", " return a*b\n", "\n", "result = sum_and_mul(3, 4)\n", "\n", "print(result)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### 입력 인수에 초기값 미리 설정하기\n", "\n", "- 입력값을 주지 않는 경우 초기값을 설정하는 방법\n", "- 초기값을 설정해 놓은 인수 뒤에 초기값을 설정하지 않은 입력 인수는 사용할 수 없다." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "나의 이름은 박응용 입니다\n", "나이는 27 살입니다\n", "남자입니다\n" ] } ], "source": [ "def say_myself(name, old, man=True):\n", " print(\"나의 이름은 %s 입니다\" % name)\n", " print(\"나이는 %d 살입니다\" % old)\n", " \n", " if man:\n", " print(\"남자입니다\")\n", " else:\n", " print(\"여자입니다\")\n", " \n", "say_myself(\"박응용\", 27)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "나의 이름은 박응용 입니다\n", "나이는 27 살입니다\n", "남자입니다\n" ] } ], "source": [ "say_myself(\"박응용\", 27, True)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "나의 이름은 박응용 입니다\n", "나이는 27 살입니다\n", "여자입니다\n" ] } ], "source": [ "say_myself(\"박응용\", 27, False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 함수 안에서 선언된 변수의 효력 범위" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "a = 1\n", "\n", "def vartest(a):\n", " a = a + 1\n", " \n", "vartest(a)\n", "\n", "print(a) # 2가 아니고 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 함수 안에서 함수 밖의 변수를 변경하는 방법\n", "\n", "1. return 이용하기\n", "2. global 키워드 이용하기" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n" ] } ], "source": [ "# return 이용하기\n", "\n", "a = 1\n", "\n", "def vartest(a):\n", " a = a + 1\n", " return a\n", "\n", "a = vartest(a)\n", "\n", "print(a)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n" ] } ], "source": [ "# global 키워드 이용하기\n", "\n", "a = 1\n", "\n", "def vartest():\n", " global a\n", " a = a + 1\n", " \n", "vartest()\n", "\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 04-2 사용자 입력과 출력\n", "\n", "### 사용자 입력\n", "\n", "- input의 사용\n", "- 프롬프트를 띄워서 사용자 입력 받기" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Life is too short, you need Python!\n", "Life is too short, you need Python!\n" ] } ], "source": [ "# input의 사용\n", "\n", "a = input()\n", "\n", "print(a)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "숫자를 입력하세요: 3\n", "3\n" ] } ], "source": [ "# 프롬프트를 띄워서 사용자 입력 받기\n", "\n", "number = input(\"숫자를 입력하세요: \")\n", "\n", "print(number)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### print 자세히 알기\n", "\n", "- 큰 따옴표(\")로 둘러싸인 문자열은 + 연산과 동일하다." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "lifeistoo short\n", "lifeistoo short\n" ] } ], "source": [ "print(\"life\" \"is\" \"too short\")\n", "print(\"life\"+\"is\"+\"too short\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 문자열 띄어쓰기는 콤마로 한다." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "lift is too short\n" ] } ], "source": [ "print(\"lift\", \"is\", \"too short\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 한 줄에 결과값 출력하기" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 1 2 3 4 5 6 7 8 9 " ] } ], "source": [ "for i in range(10):\n", " print(i, end=' ')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 04-3 파일 읽고 쓰기\n", "\n", "### 파일 생성하기\n", "\n", "- 파일을 생성하기 위해서는 open 이라는 파이썬 내장함수를 사용한다.\n", "- open 함수는 \"파일 이름\"과 \"파일 열기 모드\"를 입력값으로 받고 파일 객체를 돌려준다.\n", "\n", "> 파일 객체 = open(파일 이름, 파일 열기 모드)\n", "\n", "- 파일 열기 모드\n", "\n", "| 파일 열기 모드 | 설명 |\n", "| :---: | :---: |\n", "| r | 읽기모드 - 파일을 읽기만 할 때 사용 |\n", "| w | 쓰기모드 - 파일에 내용을 쓸 때 사용 |\n", "| a | 추가모드 - 파일의 마지막에 새로운 내용을 추가 시킬 때 사용 |\n", "\n", "- 파일을 쓰기 모드로 열게 되면 해당 파일이 이미 존재할 경우 원래 있던 내용이 모두 사라지고, 해당 파일이 존재하지 않으면 새로운 파일이 생성된다.\n", "\n", "```\n", "f = open(\"C:/Python/새파일.txt\", 'w')\n", "f.close()\n", "```" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### 파일을 쓰기 모드로 열어 출력값 적기" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 번째 줄입니다.\n", "\n", "2 번째 줄입니다.\n", "\n", "3 번째 줄입니다.\n", "\n", "4 번째 줄입니다.\n", "\n", "5 번째 줄입니다.\n", "\n", "6 번째 줄입니다.\n", "\n", "7 번째 줄입니다.\n", "\n", "8 번째 줄입니다.\n", "\n", "9 번째 줄입니다.\n", "\n", "10 번째 줄입니다.\n", "\n" ] } ], "source": [ "for i in range(1, 11):\n", " data = \"%d 번째 줄입니다.\\n\" % i\n", " print(data)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "01장 파이썬이란 무엇인가?.ipynb\r\n", "02장 파이썬 프로그래밍의 기초, 자료형.ipynb\r\n", "03장 프로그램의 구조를 쌓는다! 제어문.ipynb\r\n", "04장 프로그램의 입력과 출력은 어떻게 해야 할까?.ipynb\r\n" ] } ], "source": [ "%ls" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# 위 프로그램을 파일로 쓰면 다음과 같다.\n", "\n", "f = open(\"04-새파일.txt\", 'w')\n", "\n", "for i in range(1, 11):\n", " data = \"%d 번째 줄입니다.\\n\" % i\n", " f.write(data)\n", "\n", "f.close()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "01장 파이썬이란 무엇인가?.ipynb\r\n", "02장 파이썬 프로그래밍의 기초, 자료형.ipynb\r\n", "03장 프로그램의 구조를 쌓는다! 제어문.ipynb\r\n", "04-새파일.txt\r\n", "04장 프로그램의 입력과 출력은 어떻게 해야 할까?.ipynb\r\n" ] } ], "source": [ "%ls" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%more 04-새파일.txt" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 번째 줄입니다.\n", "2 번째 줄입니다.\n", "3 번째 줄입니다.\n", "4 번째 줄입니다.\n", "5 번째 줄입니다.\n", "6 번째 줄입니다.\n", "7 번째 줄입니다.\n", "8 번째 줄입니다.\n", "9 번째 줄입니다.\n", "10 번째 줄입니다.\n", "\n" ] } ], "source": [ "with open(\"04-새파일.txt\", \"r\") as f:\n", " print(f.read())" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 번째 줄입니다.\r\n", "2 번째 줄입니다.\r\n", "3 번째 줄입니다.\r\n", "4 번째 줄입니다.\r\n", "5 번째 줄입니다.\r\n", "6 번째 줄입니다.\r\n", "7 번째 줄입니다.\r\n", "8 번째 줄입니다.\r\n", "9 번째 줄입니다.\r\n", "10 번째 줄입니다.\r\n" ] } ], "source": [ "!more 04-새파일.txt" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "01장 파이썬이란 무엇인가?.ipynb\r\n", "02장 파이썬 프로그래밍의 기초, 자료형.ipynb\r\n", "03장 프로그램의 구조를 쌓는다! 제어문.ipynb\r\n", "04-새파일.txt\r\n", "04장 프로그램의 입력과 출력은 어떻게 해야 할까?.ipynb\r\n" ] } ], "source": [ "!ls" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 프로그램의 외부에 저장된 파일을 읽는 여러가지 방법" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 번째 줄입니다.\n", "\n" ] } ], "source": [ "# readline() 함수 이용하기\n", "\n", "f = open(\"04-새파일.txt\", \"r\")\n", "line = f.readline()\n", "print(line)\n", "f.close()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 번째 줄입니다.\n", "2 번째 줄입니다.\n", "3 번째 줄입니다.\n", "4 번째 줄입니다.\n", "5 번째 줄입니다.\n", "6 번째 줄입니다.\n", "7 번째 줄입니다.\n", "8 번째 줄입니다.\n", "9 번째 줄입니다.\n", "10 번째 줄입니다.\n" ] } ], "source": [ "f = open(\"04-새파일.txt\", \"r\")\n", "\n", "while True:\n", " line = f.readline()\n", " if not line: break\n", " print(line, end=\"\")\n", "f.close()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 번째 줄입니다.\n", "2 번째 줄입니다.\n", "3 번째 줄입니다.\n", "4 번째 줄입니다.\n", "5 번째 줄입니다.\n", "6 번째 줄입니다.\n", "7 번째 줄입니다.\n", "8 번째 줄입니다.\n", "9 번째 줄입니다.\n", "10 번째 줄입니다.\n" ] } ], "source": [ "# readlines() 함수 이용하기\n", "\n", "f = open(\"04-새파일.txt\", \"r\")\n", "lines = f.readlines()\n", "\n", "for line in lines:\n", " print(line, end=\"\")\n", "\n", "f.close()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 번째 줄입니다.\n", "2 번째 줄입니다.\n", "3 번째 줄입니다.\n", "4 번째 줄입니다.\n", "5 번째 줄입니다.\n", "6 번째 줄입니다.\n", "7 번째 줄입니다.\n", "8 번째 줄입니다.\n", "9 번째 줄입니다.\n", "10 번째 줄입니다.\n", "\n" ] } ], "source": [ "# read() 함수 이용하기\n", "\n", "f = open(\"04-새파일.txt\", \"r\")\n", "data = f.read()\n", "print(data)\n", "f.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 파일에 새로운 내용 추가하기" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": true }, "outputs": [], "source": [ "f = open(\"04-새파일.txt\", \"a\")\n", "\n", "for i in range(11, 20):\n", " data = \"%d 번째 줄입니다.\\n\" % i\n", " f.write(data)\n", " \n", "f.close()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 번째 줄입니다.\r\n", "2 번째 줄입니다.\r\n", "3 번째 줄입니다.\r\n", "4 번째 줄입니다.\r\n", "5 번째 줄입니다.\r\n", "6 번째 줄입니다.\r\n", "7 번째 줄입니다.\r\n", "8 번째 줄입니다.\r\n", "9 번째 줄입니다.\r\n", "10 번째 줄입니다.\r\n", "11 번째 줄입니다.\r\n", "12 번째 줄입니다.\r\n", "13 번째 줄입니다.\r\n", "14 번째 줄입니다.\r\n", "15 번째 줄입니다.\r\n", "16 번째 줄입니다.\r\n", "17 번째 줄입니다.\r\n", "18 번째 줄입니다.\r\n", "19 번째 줄입니다.\r\n" ] } ], "source": [ "!more 04-새파일.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### with 문과 함께 사용하기\n", "\n", "```\n", "f = open(\"foo.txt\", 'w')\n", "f.write(\"Life is too short, you need Python\")\n", "f.close\n", "```\n", "\n", "- 파일을 열면 위와 같이 항상 close 해 주는 것이 좋다.\n", "- 아래와 같이 with 문을 사용하면 with 블록을 벗어나는 순간 자동으로 close 된다.\n", "\n", "```\n", "with open(\"foo.txt\", 'w') as f:\n", " f.write(\"Life is too short, you need Python\")\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [sys 모듈로 입력 인수 주기]" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting 04-sys1.py\n" ] } ], "source": [ "%%writefile 04-sys1.py\n", "import sys\n", "\n", "args = sys.argv[1:]\n", "\n", "for i in args:\n", " print(i)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "01장 파이썬이란 무엇인가?.ipynb\r\n", "02장 파이썬 프로그래밍의 기초, 자료형.ipynb\r\n", "03장 프로그램의 구조를 쌓는다! 제어문.ipynb\r\n", "04-sys1.py\r\n", "04-새파일.txt\r\n", "04장 프로그램의 입력과 출력은 어떻게 해야 할까?.ipynb\r\n" ] } ], "source": [ "!ls" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "aaa\n", "bbb\n", "ccc\n", "ddd\n", "eee\n" ] } ], "source": [ "%run 04-sys1.py aaa bbb ccc ddd eee" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing 04-sys2.py\n" ] } ], "source": [ "%%writefile 04-sys2.py\n", "import sys\n", "args = sys.argv[1:]\n", "for i in args:\n", " print(i.upper(), end=' ')" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "01장 파이썬이란 무엇인가?.ipynb\r\n", "02장 파이썬 프로그래밍의 기초, 자료형.ipynb\r\n", "03장 프로그램의 구조를 쌓는다! 제어문.ipynb\r\n", "04-sys1.py\r\n", "04-sys2.py\r\n", "04-새파일.txt\r\n", "04장 프로그램의 입력과 출력은 어떻게 해야 할까?.ipynb\r\n" ] } ], "source": [ "!ls" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LIFE IS TOO SHORT, YOU NEED PYTHON " ] } ], "source": [ "%run 04-sys2.py life is too short, you need Python" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.4.3" } }, "nbformat": 4, "nbformat_minor": 2 }