6 minute read

📢Key Words: 자료형, 제어문, 함수
점프 투 파이썬을 참고한 내용 정리

1. 함수

01. 함수

  • 함수란 무엇인가?
    • 입력값을 가지고 어떤 일을 수행한 다음에 그 결과물을 내어놓는 것
  • 함수를 사용하는 이유는 무엇일까?
    • 반복되는 부분이 있을 경우 “반복적으로 사용되는 가치 있는 부분”을 한 뭉치로 묶어서 “어떤 입력값을 주었을 때 어떤 결괏값을 돌려준다”라는 식의 함수로 작성하는 것이 현명하다.
    • 프로그램 흐름을 일목요연하게 볼 수 있기 때문이다.
  • 파이썬 함수의 구조
    def 함수명(매개변수):
      <수행할 문장1>
      <수행할 문장2>
      ...
    
  • 매개변수와 인수
    • 매개변수(parameter)와 인수(arguments)는 혼용해서 사용되는 헷갈리는 용어이므로 잘 기억해 두자. 매개변수는 함수에 입력으로 전달된 값을 받는 변수를 의미하고 인수는 함수를 호출할 때 전달하는 입력값을 의미한다. ```python def add(a, b): # a, b는 매개변수 return a+b

    print(add(3, 4)) # 3, 4는 인수 ```

  • 입력값과 결괏값에 따른 함수의 형태
    • 함수의 형태는 입력값과 결괏값의 존재 유무에 따라 4가지 유형으로 나뉜다.
    • 일반적인 함수: 입력값이 있고 결괏값이 있는 함수
      def 함수이름(매개변수):
      <수행할 문장>
      ...
      return 결과값
      
    • 입력값이 없는 함수
      >>> def say(): 
      ...     return 'Hi' 
      ... 
      >>>
      
    • 결괏값이 없는 함수
      >>> def add(a, b): 
      ...     print("%d, %d의 합은 %d입니다." % (a, b, a+b))
      ... 
      >>>
      
      • print문은 함수의 구성 요소 중 하나인 <수행할 문장="">에 해당하는 부분일 뿐, 결괏값은 오직 return 명령어로만 돌려받을 수 있다.
    • 입력값도 결괏값도 없는 함수
      >>> def say(): 
      ...     print('Hi')
      ... 
      >>>
      
  • 매개변수 지정하여 호출하기
    • 매개변수를 지정하면 다음과 같이 순서에 상관없이 사용할 수 있다는 장점이 있다.
      >>> def add(a, b):
      ...     return a+b
      ... 
      >>> result = add(b=5, a=3)  # b에 5, a에 3을 전달
      >>> print(result)
      8
      
  • 입력값이 몇 개가 될지 모를 때는 어떻게 해야 할까?
    def 함수이름(*매개변수): 
      <수행할 문장>
      ...
    >>> def add_many(*args): 
    ...     result = 0 
    ...     for i in args: 
    ...         result = result + i 
    ...     return result 
    ... 
    >>>
    
    • 매개변수 부분이 *매개변수로 바뀌었다.
    • 입력값을 전부 모아서 튜플로 만들어 주기 때문이다
    • args는 인수를 뜻하는 영어 단어 arguments의 약자이며 관례적으로 자주 사용한다.
      >>> def add_mul(choice, *args): 
      ...     if choice == "add": 
      ...         result = 0 
      ...         for i in args: 
      ...             result = result + i 
      ...     elif choice == "mul": 
      ...         result = 1 
      ...         for i in args: 
      ...             result = result * i 
      ...     return result 
      ... 
      >>>
      >>> result = add_mul('add', 1,2,3,4,5)
      >>> print(result)
      15
      
    • 키워드 파라미터 kwargs
      • 매개변수 앞에 별 두 개(**)를 붙인다.
      • 매개변수 kwargs는 딕셔너리가 되고 모든 key=value 형태의 결괏값이 그 딕셔너리에 저장된다.
        >>> def print_kwargs(**kwargs):
        ...     print(kwargs)
        ...
        >>> print_kwargs(a=1)
        {'a': 1}
        >>> print_kwargs(name='foo', age=3)
        {'age': 3, 'name': 'foo'}
        
  • 함수의 결괏값은 언제나 하나이다
    >>> def add_and_mul(a,b): 
    ...     return a+b, a*b
    
    >>> result = add_and_mul(3,4)
    result = (7, 12)
    
    >>> result1, result2 = add_and_mul(3, 4)
    
    • a+b와 ab는 튜플값 하나인 (a+b, ab)로 돌려준다.
    • result1, result2 = (7, 12)가 되어 result1은 7이 되고 result2는 12
    • 특별한 상황일 때 함수를 빠져나가고 싶다면 return을 단독으로 써서 함수를 즉시 빠져나갈 수 있다.
      >>> def say_nick(nick): 
      ...     if nick == "바보": 
      ...         return 
      ...     print("나의 별명은 %s 입니다." % nick)
      ... 
      >>>
      
  • 매개변수에 초깃값 미리 설정하기
    def say_myself(name, old, man=True): 
      print("나의 이름은 %s 입니다." % name) 
      print("나이는 %d살입니다." % old) 
      if man: 
          print("남자입니다.")
      else: 
          print("여자입니다.")
      
    def say_myself(name, man=True, old): 
      print("나의 이름은 %s 입니다." % name) 
      print("나이는 %d살입니다." % old) 
      if man: 
          print("남자입니다.") 
      else: 
          print("여자입니다.")
    
    • 매개변수에 초깃값을 미리 설정해 주는 경우
    • 함수의 매개변수에 들어갈 값이 항상 변하는 것이 아닐 경우 유용
    • 초기화시키고 싶은 매개변수를 항상 뒤쪽에 놓는 것을 잊지 말자.
  • 함수 안에서 선언한 변수의 효력 범위
    a = 1
    def vartest(a):
        a = a +1
    
    vartest(a)
    print(a)
    
    ::1
    
    • 함수 안에서 새로 만든 매개변수는 함수 안에서만 사용하는 “함수만의 변수”이기 때문이다
    • 함수 안에서 선언한 매개변수는 함수 안에서만 사용될 뿐 함수 밖에서는 사용되지 않는다.
  • 함수 안에서 함수 밖의 변수를 변경하는 방법
    • return 사용하기
      a = 1 
      def vartest(a): 
          a = a +1 
          return a
      
      a = vartest(a) 
      print(a)
      
    • global 명령어 사용하기
      a = 1 
      def vartest(): 
          global a 
          a = a+1
      
      vartest() 
      print(a)
      
      • global a 문장은 함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 뜻
      • 함수는 독립적으로 존재하는 것이 좋기 때문이다. 외부 변수에 종속적인 함수는 그다지 좋은 함수가 아니다. 프로그래밍을 할 때 global 명령어는 사용하지 않는 것이 좋다
  • lambda
    >>> add = lambda a, b: a+b
    >>> result = add(3, 4)
    >>> print(result)
    7
    
    • lambda는 함수를 생성할 때 사용하는 예약어로 def와 동일한 역할
    • def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 주로 쓰인다.
    • lambda 예약어로 만든 함수는 return 명령어가 없어도 결괏값을 돌려준다.

02. 사용자 입력 및 출력

  • 사용자 입력
    >>> a = input()
    Life is too short, you need python
    >>> a
    'Life is too short, you need python'
    >>>
    >>> number = input("숫자를 입력하세요: ")
    숫자를 입력하세요: 3
    >>> print(number)
    3
    >>>
    
    • input은 입력되는 모든 것을 문자열로 취급한다.
    • 사용자에게 입력받을 때 “숫자를 입력하세요”라든지 “이름을 입력하세요”라는 안내 문구 또는 질문이 나오도록 하고 싶을 때가 있다. 그럴 때는 input()의 괄호 안에 질문을 입력하여 프롬프트를 띄워주면 된다.
    • number는 숫자가 아닌 문자열임에 주의
  • print 자세히 알기
    • 큰따옴표(“)로 둘러싸인 문자열은 + 연산과 동일하다
      >>> print("life" "is" "too short") # ①
      lifeistoo short
      >>> print("life"+"is"+"too short") # ②
      lifeistoo short
      
    • 문자열 띄어쓰기는 콤마로 한다
      >>> print("life", "is", "too short")
      life is too short 
      
    • 한 줄에 결괏값 출력하기
      • 한 줄에 결괏값을 계속 이어서 출력하려면 매개변수 end를 사용해 끝 문자를 지정
        >>> for i in range(10):
        ...     print(i, end=' ')
        ...
        0 1 2 3 4 5 6 7 8 9
        

        03. 파일 읽고 쓰기

  • 파일 생성하기
    f = open("새파일.txt", 'w')
    f.close() 
    
    • 프로그램을 실행한 디렉터리에 새로운 파일이 하나 생성
    • 파이썬 내장 함수 open을 사용했다. open 함수는 다음과 같이 “파일 이름”과 “파일 열기 모드”를 입력값으로 받고 결괏값으로 파일 객체를 돌려준다.
    • 파일열기모드 설명
      r 읽기모드 - 파일을 읽기만 할 때 사용
      w 쓰기모드 - 파일에 내용을 쓸 때 사용
      a 추가모드 - 파일의 마지막에 새로운 내용을 추가 시킬 때 사용
    • 쓰기 모드로 열면 해당 파일이 이미 존재할 경우 원래 있던 내용이 모두 사라지고, 해당 파일이 존재하지 않으면 새로운 파일이 생성
    • f.close()는 열려 있는 파일 객체를 닫아 주는 역할. 생략해도 된다.
    • 하지만 쓰기모드로 열었던 파일을 닫지 않고 다시 사용하려고 하면 오류가 발생하기 때문. close()를 사용해서 열려 있는 파일을 직접 닫아 주는 것이 좋다.
    • "C:/doit/새파일.txt"를 \n과 같은 이스케이프 문자가 있을 경우 줄바꿈 문자로 해석, 역슬래시()를 사용한다면 "C:\\doit\\새파일.txt" 처럼 역슬래시를 2개 사용하거나 r"C:\doit\새파일.txt"와 같이 문자열 앞에 r 문자(Raw String)를 덧붙여 사용해야 한다.
  • 파일을 쓰기 모드로 열어 출력값 적기
    # writedata.py
    f = open("C:/doit/새파일.txt", 'w')
    for i in range(1, 11):
        data = "%d번째 줄입니다.\n" % i
        f.write(data)
    f.close()
    
    #vs
    for i in range(1, 11):
        data = "%d번째 줄입니다.\n" % i
      print(data)
    
    • 두 번째 방법은 우리가 계속 사용해 왔던 모니터 화면에 출력하는 방법이고, 첫 번째 방법은 모니터 화면 대신 파일에 결괏값을 적는 방법
  • 프로그램의 외부에 저장된 파일을 읽는 여러 가지 방법
    • readline 함수 이용하기
      # readline_test.py
      f = open("C:/doit/새파일.txt", 'r')
      line = f.readline()
      print(line)
      f.close()
      
      #vs
      f = open("C:/doit/새파일.txt", 'r')
      while True:
          line = f.readline()
          if not line: break
          print(line)
      f.close()
      
      • readline()을 사용해서 파일의 첫 번째 줄을 읽어 출력
      • while True: 무한 루프 안에서 f.readline()을 사용해 파일을 계속해서 한 줄씩 읽어 들이면 모든 문장을 읽을 수 있다.
      • readline()은 더 이상 읽을 줄이 없을 경우 빈 문자열(‘‘)을 리턴한다.
    • readlines 함수 사용하기
      • readlines 함수는 파일의 모든 줄을 읽어서 각각의 줄을 요소로 갖는 리스트로 돌려준다.
      • 줄 바꿈(\n) 문자 제거하기 -> strip 함수를 사용
        f = open("C:/doit/새파일.txt", 'r')
        lines = f.readlines()
        for line in lines:
            line = line.strip()  # 줄 끝의 줄 바꿈 문자를 제거한다.
            print(line)
        f.close()
        
    • read 함수 사용하기
      f = open("C:/doit/새파일.txt", 'r')
      data = f.read()
      print(data)
      f.close()
      
      • f.read()는 파일의 내용 전체를 문자열로 돌려준다
  • 파일에 새로운 내용 추가하기
    f = open("C:/doit/새파일.txt",'a')
    for i in range(11, 20):
        data = "%d번째 줄입니다.\n" % i
        f.write(data)
    f.close()
    
    • 원래 있던 값을 유지하면서 단지 새로운 값만 추가해야 할 경우도 있다. 이런 경우에는 파일을 추가 모드(‘a’)로 열면 된다.
    • 새파일.txt 파일을 추가 모드(‘a’)로 열고 write를 사용해서 결괏값을 기존 파일에 추가해 적는 예이다.
  • with문과 함께 사용하기
    f = open("foo.txt", 'w')
    f.write("Life is too short, you need python")
    f.close()
    
    #vs
    with open("foo.txt", "w") as f:
        f.write("Life is too short, you need python")
    
    • 파일을 열고 닫는 것을 자동으로 처리
    • with 블록을 벗어나는 순간 열린 파일 객체 f가 자동으로 close

    • sys 모듈로 매개변수 주기
      import sys
      
      args = sys.argv[1:]
      for i in args:
          print(i)
      
      #출력값
      C:\doit>python sys1.py aaa bbb ccc
      aaa
      bbb
      ccc
      

      sys sys 모듈

      • argv[0]은 파일 이름 sys1.py가 되고 argv[1]부터는 뒤에 따라오는 인수가 차례로 argv의 요소가 된다.

04. 연습문제

Summary

보완점

  • 문자열을 자동으로 끊어서 받을 수 있나?
  • 자료형 별 함수 구분

개인 공부 기록용 블로그 입니다.