Python/Syntax 2021. 8. 24. 14:01

고급 문법

열거 가능 객체 (iterable)

  • for 문의 순회 대상 객체이다.

  • __iter__() 메서드로 열거 가능 객체를 획득한다.

    • iter(호출가능한객체, 반복을끝낼값) 함수로 __iter__() 메서드를 호출할 수 있다.

    • 반복을 끝낼 값이 나오면 StopIteration 예외가 발생한다.

    • 만약 클래스를 직접 구현하고 멤버 변수에 리스트가 있는 상황에서, 그 리스트를 순회하려면 __iter__() 메서드의 반환 값에 iter(해당리스트) 이런 식으로 iter 함수를 이용해 반환하면 된다.

  • 매 루프마다 __next__() 메서드를 통해 다음 요소를 받는다.

    • 첫 요소도 이걸로 받는다.

    • next(반복가능한객체, 기본값) 함수로 __next__() 메서드를 호출할 수 있다.

      • 마지막 요소에서 __next__() 를 호출하는 경우에는 StopIteration 예외가 발생하고 반복문이 끝난다.

      • 만약 기본값을 설정하면 예외 대신 계속 기본값이 출력된다.

    • 이 예외는 for 문에서 내부적으로 처리한다.

    • 유사 기능 구현 예시

      nums = [11, 22, 33]
      
      it = iter(nums)
      while True:
          try:
              num = next(it)
          except StopIteration:
              break
          print(num)
      
      ''' stdout
      11
      22
      33
      '''
    • __iter__, __next__ 메서드 구현 예시

      class Seq:
          def __init__(self, data):
              self.data = data
              self.index = -2
      
          def __iter__(self):
              self.index = -2
              return self
      
          def __next__(self):
              self.index += 2
              if self.index >= len(self.data):
                  raise StopIteration
              return self.data[self.index:self.index + 2]
      
      solarterm = Seq("입춘우수경칩춘분청명곡우입하소만망종하지소서대서")
      for idx, k in enumerate(solarterm):
          if idx: 
              print(',', end=' ')
          print(k, end='')
      print()
      
      for idx, k in enumerate(solarterm):
          if idx: 
              print(',', end=' ')
          print(k, end='')
      print()
      
      print(', '.join(solarterm))
      
      ''' stdout
      입춘, 우수, 경칩, 춘분, 청명, 곡우, 입하, 소만, 망종, 하지, 소서, 대서
      입춘, 우수, 경칩, 춘분, 청명, 곡우, 입하, 소만, 망종, 하지, 소서, 대서
      입춘, 우수, 경칩, 춘분, 청명, 곡우, 입하, 소만, 망종, 하지, 소서, 대서
      '''

제너레이터 (Generator)

  • 함수에서 데이터를 연속해서 리턴한다. (yield)

  • 함수가 끝나거나 return을 실행하면 StopIteration 예외가 발생한다.

    def seqgen(data):
        for index in range(0, len(data), 2):
            yield data[index:index+2]
    
    solarterm = seqgen("입춘우수경칩춘분청명곡우입하소만망종하지소서대서")
    
    print(solarterm)
    print(dir(solarterm))
    
    for k in solarterm: 
        print(k, end = ',')
    
    print(','.join(solarterm)) # 출력 X
    
    ''' stdout
    입춘,우수,경칩,춘분,청명,곡우,입하,소만,망종,하지,소서,대서,
    '''
  • range, enumerate, filter, zip은 제너레이터이다.

  • 순차적으로 반환을 하기 때문에 메모리 효율 측면에서 좋다.


데코레이터(Decorator)

일급 객체 (first-class object, 일급 시민)

  • 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.

    일급 객체와 이급 객체. ALGOL에서 실수는 표현식에 사용하거나 변수에 할당할 수 있으며, 프로시저에 매개변수로 넘겨질 수 있다. 하지만 프로시저의 경우 프로시저 콜에서 호출 대상 혹은 매개 변수로 등장할 수 있을 뿐이며, 프로시저를 반환하는 프로시저는 없다. 이런 측면에서 ALGOL에서의 프로시저는 이급 시민이다. 언제나 직접 나타나야 하며 변수나 연산식으로 대신 나타낼 수 없기 때문이다. (1960년대, 영국의 컴퓨터 과학자 크리스토퍼 스트래치)

  • 로빈 포플스톤의 정의

    1. 모든 요소는 함수의 실제 매개변수가 될 수 있다.
    2. 모든 요소는 함수의 반환 값이 될 수 있다.
    3. 모든 요소는 할당 명령문의 대상이 될 수 있다.
    4. 모든 요소는 동일 비교의 대상이 될 수 있다.

지역 함수

  • 함수 안에 정의된 함수이다.

    • 함수가 정의된 함수 내에서만 사용할 수 있다.

    • 함수의 이름 충돌 방지용으로 사용할 수 있다.

    • 함수를 리턴할 경우 함수 밖에서도 사용할 수 있다.

    • 힙에서 인스턴스화 되는 원리이다.

함수 데코레이터

  • 이미 만들어진 함수에 동작을 추가한다.

  • 함수를 래핑(Wrapping)하여 함수의 앞뒤에 코드를 자동으로 추가한다.

    • 다음 코드에서 inner = outer(inner)의 동작을 키워드식으로 해결하는 것과 같다.

      def inner():
          print("결과를 출력합니다.")
      
      def outer(func):
          def wrapper():
              print("-"*20)
              func()
              print("-"*20)
          return wrapper
      
      inner = outer(inner)
      inner()
      
      ''' stdout
      --------------------
      결과를 출력합니다.
      --------------------
      '''
      def outer(func):
          def wrapper():
              print("-"*20)
              func()
              print("-"*20)
          return wrapper
      
      @outer
      def inner():
          print("결과를 출력합니다.")
      
      inner()
      
      ''' stdout
      --------------------
      결과를 출력합니다.
      --------------------
      '''

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

파이썬 모듈과 패키지  (0) 2021.08.24
파이썬 파일  (0) 2021.08.24
파이썬 예외 처리  (0) 2021.08.24
파이썬 표준 모듈  (0) 2021.08.24
파이썬 컬렉션 관리  (0) 2021.08.24
Python/Syntax 2021. 8. 24. 13:58

모듈과 패키지

모듈

  • 비슷한 성격의 변수, 함수들을 파일로 나눠서 정의하는 것이다.

  • 파일명이 모듈명이다.

  • 예제

    util.py

    INCH = 2.54
    
    def calcsum(n):
        total = 0
        for num in range(n + 1):
            total += num
        return total

    main.py

    import util
    # from util import * # 비권장 (이름 충돌 우려)
    
    print(util.INCH)
    print(util.calcsum(10))
    
    ''' stdout
    2.54
    55
    '''

모듈 테스트

  • __name__ 키워드는 모듈명으로 대체된다.

    • 단독 실행된 경우 : "__main__"

    • 모듈로 사용된 경우 : "모듈명"

    • 이는 모듈 개발 시 테스트하기 편하도록 지원하는 기능이다.

    # 모듈 정의
    
    if __name__ == "__main__" :
      # 모듈 테스트 코드

    util.py

    INCH = 2.54
    
    def calcsum(n):
        total = 0
        for num in range(n + 1):
            total += num
        return total
    
    # print("util.py", __name__) # 모듈명
    
    if __name__ == "__main__":
        print(f"1 inch = {INCH}")
        print(f"~10 = {calcsum(10)}")
    
    ''' stdout
    1 inch = 2.54
    ~10 = 55
    '''

모듈 경로

  • import 할 때 모듈을 찾는 순서는 다음과 같다.

    1. 워킹 디렉토리
    2. PYTHONPATH 환경변수에 등록된 디렉토리
    3. 표준 모듈 디렉토리
    4. 3rd 모듈 디렉토리
    import sys
    
    for path in sys.path:
        print(path)

패키지

  • 모듈들을 모아 놓은 디렉토리이다.

__init__

  • 반드시 __init__.py 파일이 존재해야 한다.

    • 일반적으로 내용은 없다.

    • from 패키지 import * 형식으로 패키지를 호출할 때, __init__.py__all__ 에 해당하는 리스트만 가져온다.

      • __all__ 을 지정하지 않으면 모든 모듈이 불러와진다.

      • 이렇게 패키지를 사용하는 것은 일반적이지 않지만, 관례적으로 패키지의 디렉토리에는 __init__.py 파일을 넣는다고 한다.

써드 파티 모듈

  • 모듈의 내부

    • 빌트인 모듈의 목록을 볼 수 있다.

      import sys
      
      print(sys.builtin_module_names)
      
      ''' stdout
      ('_abc',
      '_ast',
      '_codecs',
      '_collections',
      '_functools',
      '_imp',
      '_io',
      '_locale',
      '_operator',
      '_signal',
      :
      )
      '''
  • dir() 함수

    • 모듈내 함수 목록을 출력한다.

      import math
      
      print(dir(math))
      ''' stdout
      ['__doc__',
      '__file__',
      '__loader__',
      '__name__',
      '__package__',
      '__spec__',
      'acos',
      'acosh',
      'asin',
      :
      ]
      '''
  • help() 함수

    • 함수의 docstring 출력한다.

      help(math.hypot)
      
      ''' stdout
      Help on built-in function hypot in module math:
      
      hypot(x, y, /)
        Return the Euclidean distance, sqrt(x*x + y*y).
      '''
  • 외부 모듈 관리 pip

    명령어 설명
    install 패키지를 설치
    uninstall 설치한 패키지를 삭제한다.
    freeze 설치한 패키지의 목록을 보여준다.
    show 패키지의 정보를 보여준다.
    search pyPI에서 패키지를 검색한다.
  • beautifulsoup 예제

    from urllib import request
    import bs4
    
    target = request.urlopen("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108")
    soup = bs4.BeautifulSoup(target)
    for city in soup.select("location"):
        name = city.select_one("city").string
        wf = city.select_one("wf").string
        tmn = city.select_one("tmn").string
        tmx = city.select_one("tmx").string
        print("%s : %s(%s ~ %s)"%(name, wf, tmn, tmx))

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

파이썬 고급 문법  (0) 2021.08.24
파이썬 파일  (0) 2021.08.24
파이썬 예외 처리  (0) 2021.08.24
파이썬 표준 모듈  (0) 2021.08.24
파이썬 컬렉션 관리  (0) 2021.08.24
Python/Class 2021. 8. 24. 13:46

클래스

  • 관련 정보와 조작 함수(메서드)를 묶어서 관리하는 방식이다.

  • class 키워드로 정의한다.

    class Account:
        def __init__(self, balance):
            self.balance = balance
    
        def deposit(self, money):
            self.balance += money
    
        def inquire(self):
            print(f"잔액은 {self.balance}원 입니다.")
    
    account = Account(8000)
    account.deposit(1000)
    account.inquire()
    
    shinhan = Account(8000)
    shinhan.deposit(1000)
    shinhan.inquire()
    
    nonghyup = Account(1200000)
    nonghyup.inquire()
    
    ''' stdout
    잔액은 9000원 입니다.
    잔액은 9000원 입니다.
    잔액은 1200000원 입니다.
    '''
  • 기본적으로 메서드의 첫 번째 인자로 self가 들어간다.

    • 해당 인스턴스의 참조 변수이며, 다른 언어에서의 this와 같다.

    • C++의 클래스도 내부적으로는 이런 방식으로 전달된다.


생성자

  • def __init__(self): 로 정의한다.

    • 클래스의 인스턴스를 생성할 때 자동으로 호출된다.

    • 멤버 변수를 정의 및 초기화하는 역할이다.

    • 별도로 구현하지 않으면 기본 생성자가 적용된다.


상속

  • 기존 클래스 정의를 그대로 가져다가 사용하고, 추가 기능도 덧붙일 수 있다.

  • class 자식클래스명(부모클래스명): 처럼 괄호로 나타낸다.


액세스

  • 파이썬은 정보 은폐 기능이 없다.

    • C++로 치면 private, public 등의 키워드가 없는 것이다.
  • 대신 getter/setter로 정보를 보호한다.

    • @property

      • 함수명이 프로퍼티명이 되고, getter 함수로 동작한다.
    • @프로퍼티명.setter

      • 프로퍼티의 setter 함수를 정의한다.
    • 데코레이터(Decorator)

      • @(at)으로 시작하는 것
      class Date:
          def __init__(self, month):
              self.inner_month = month
      
          @property
          def month(self):
              return self.inner_month
      
          @month.setter
          def month(self, month):
              if 1 <= month <= 12:
                  self.inner_month = month
              else:
                  print(Exception("허용 범위 초과"))
      
      today = Date(8)
      today.month = 15
      print(today.month)
      
      ''' stdout
      허용 범위 초과
      8
      '''
    • 프로퍼티명 = property(getter 함수, setter 함수) 로도 사용할 수 있다.

      class Date:
          def __init__(self, month):
              self.__month = month
      
          def getmonth(self):
              return self.__month
      
          def setmonth(self, month):
              if 1 <= month <= 12:
                  self.__month = month
      
          month = property(getmonth, setmonth)
      
      today = Date(8)
      today.month = 15
      print(today.month)
      
      ''' stdout
      8
      '''
  • 프라이빗 멤버 변수

    • 멤버 변수 앞에 __ (언더바 2개)를 붙이면 외부에서 바로 접근할 수 없다.

      today = Date(8)
      today.month = 15
      print(today.month)
      print(today.__month) # 예외 발생

메서드

클래스 메서드

  • 아직까지 그냥 정의한 메서드는 인스턴스 메서드이다.

    • 반드시 인스턴스를 만든 후 사용할 수 있다.

    • 첫 번째 인자는 인스턴스에 대한 참조인 self를 관례로 사용하는 것 같다.

  • 클래스 메서드는 인스턴스와 상관없이 존재한다.

    • 첫 번째 인자는 클래스에 대한 참조인 cls를 관례로 사용하는 것 같다.

클래스 멤버 변수

  • 인스턴스와 무관하게 정의되는 멤버 변수이다.

  • 모든 인스턴스가 공유한다.

정적 메서드

  • 클래스 내에 정의되는 일반함수이다.

  • 첫 번째 인자가 정해지지 않는다.

    • 클래스 멤버 변수에 접근하려면 클래스명.변수명 형태로 접근하면 된다.
    class Car:
        @staticmethod
        def hello():
            print("오늘도 안전운행 합시다.")
            print(Car.count)
    
        count = 0
    
        def __init__(self, name):
            self.name = name
            self.serial = Car.count
            Car.count += 1
    
        @classmethod
        def outcount(cls):
            print(cls.count)
    
        def intro(self):
            print(f"{self.name} ({self.serial})")
    
    print(Car.count)
    pride = Car("프라이드")
    korando = Car("코란도")
    Car.outcount()
    
    print(Car.count)
    Car.count = 100
    Car.outcount()
    
    pride.intro()
    korando.intro()
    Car.hello()
    
    ''' stdout
    0
    2
    2
    100
    프라이드 (0)
    코란도 (1)
    오늘도 안전운행 합시다.
    100
    '''

연산자 메서드

  • 연산자를 재정의할 수 있다.

  • 연산자 별로 함수명이 정해져 있다.

    연산자 함수명
    == __eq__
    != __ne__
    < __lt__
    > __gt__
    <= __le__
    >= __ge__
    + __add__, __radd__
    - __sub__, __rsub__
    * __mul__, __rmul__
    / __div__, __rdiv__
    // __floordiv__, __rfloordiv__
    % __mod__, __rmod__
    ** __pow__, __rpow__
    << __lshift__
    >> __rshift__
    • __str__

      • print(객체) 호출 시 해당 객체의 __str__()을 호출한다. 이 함수는 문자열 형태의 값을 반환한다.
    • __repr__

      • 다른 컬렉션에 담겨서 순회당할 때, 다른 함수가 __repr__()을 호출한다.
      class Human():
          def __init__(self, name, age):
              self.name = name
              self.age = age
      
          def intro(self):
              print(f"{self.age}살 {self.name}입니다.")
      
          def __str__(self):
              return f"<Human name: {self.name}, age: {self.age}>"
      
          def __repr__(self):
              return f"<Human name: {self.name}>"
      
      kim = Human("김상형", 29)
      kim.intro()
      lee = Human("이승우", 45)
      lee.intro()
      
      print(kim)
      print(lee)
      
      li = [kim, lee]
      print(li)
      
      ''' stdout
      29살 김상형입니다.
      45살 이승우입니다.
      <Human name: 김상형, age: 29>
      <Human name: 이승우, age: 45>
      [<Human name: 김상형>, <Human name: 이승우>]
      '''
Python/Syntax 2021. 8. 24. 13:18

파일

파일 입출력

  • 윈도우에서는 파일 경로를 구분할 때 \\로 작성하는게 맞지만, 파이썬에서는 /를 쓰더라도 처리해주므로 OS에 독립적으로 작성할 수 있다.

파일 열기

  • open(파일경로, 모드[, encoding="문자셋"])

  • 모드

    모드 설명
    r 읽기, 파일이 없는 경우 예외 발생
    w 쓰기, 파일이 없으면 새로 생김
    a 추가
    x 쓰기용으로 여나 기존 파일이 있는 경우 실패
    t text 모드로 열기 (기본값)
    b binary 모드로 열기

파일 쓰기

  • write(데이터)

    f = open("live.txt", "wt", encoding="UTF-8")
    
    f.write("""삶이 그대를 속일지라도
    슬퍼하거나 노하지 말라!
    우울한 날들을 견디면
    믿으라, 기쁨의 날이 오리니""")
    f.write("\n추가1")
    f.write("\n추가2")
    f.write("\n추가3")
    
    f.close()

파일 읽기

  • 메서드

    메서드 설명
    .read() 파일 전체 내용
    .read(n) n개의 내용 (바이너리 모드일 땐 바이트, 텍스트 모드일 땐 글자 수)
    .readline() 한 줄 (끝에 개행 문자 포함)
    .readlines() 전체 라인 리스트 (각 라인 끝에 개행 문자 포함)
  • 예제

    • f를 처음에 None으로 대입해야 f.close()의 조건을 설정할 수 있다.

      try:
          f = None
          f = open("live.txtd", "rt", encoding="UTF-8")
          text = f.read()
          print(text)
      except FileNotFoundError:
          print("파일이 없습니다.")
      finally:
          if f:
              f.close()
      
      ''' stdout
      삶이 그대를 속일지라도
      슬퍼하거나 노하지 말라!
      우울한 날들을 견디면
      믿으라, 기쁨의 날이 오리니
      추가1
      추가2
      추가3
      '''
  • with

    • with 블록이 끝났을 때 해당 객체의 close()를 자동 호출한다.

    • I/O 처리나 통신 관련 작업 시 유용하다.

      try:
          with open("live.txt", "rt", encoding="UTF-8") as f:
              text = f.read()
              print(text)
      except Exception as e:
          print(e)
    • for 문에 바로 넣을 수도 있다.

      with open("live.txt", "rt", encoding="UTF-8") as f:
          for line in f:
              print(line, end="")

입출력 위치

  • .seek(위치, 기준)

    • 위치 (offset)

      • 기준으로부터 얼마나 떨어진 곳인지 바이트 단위로 지정한다.

      • 한글의 경우 주의해야 한다.

        • 얼라인이 맞지 않으면 UnicodeDecodeError 에러가 발생한다.

        • 따라서 주로 바이너리 파일을 다룰 때 사용한다.

    • 기준

      기준 설명
      0 파일의 처음 위치
      1 현재 위치
      2 파일의 끝 위치

    live.txt

    삶이 그대를 속일지라도
    슬퍼하거나 노하지 말라!
    우울한 날들을 견디면
    믿으라, 기쁨의 날이 오리니
    with open("live.txt", "rt", encoding="UTF-8") as f:
        f.seek(12, 0)
        text = f.read() # 예외 발생
  • .tell()

    • 현재 파일 포인터의 위치를 정수형으로 반환한다.

내용 추가

  • w 모드 (fp가 0)

    • 기존 파일이 존재하는 경우, 내용을 모두 지우고 다시 작성한다. (덮어쓰기)
  • a 모드 (fp가 파일의 끝)

    • 기존 파일이 존재하는 경우, 파일의 끝에 내용을 추가한다. (이어쓰기)

파일 관리

  • 파일 관리 함수

    함수 설명
    shutil.copy(a, b) 파일 복사
    shutil.move(a, b) 파일 이동
    shutil.rmtree(path) 디렉터리 트리 삭제(주의)
    shutil.chown(f, u, g) 소유자 변경
    os.rename(a, b) 이름 변경
    os.remove(f) 파일 삭제
    os.chmod(f, m) 권한 변경
    os.link(a, b) a를 가리키는 b라는 이름의 하드 링크 생성
    os.symlink(a, b) 심볼릭 링크 생성
  • 디렉토리 관리 함수

    함수 설명
    os.chdir(path) 현재 워킹 디렉토리를 path로 변경
    os.mkdir(path[, mode=0o777, dir_fd=None]) mode 권한으로 path 디렉터리를 생성
    os.rmdir(path[, dir_fd=None]) 디렉토리 path 제거
    os.getcwd() 현재 워킹 디렉토리 반환
    os.listdir(path='.') path 디렉토리에 있는 항목들의 이름을 담고 있는 리스트 반환, ...는 포함하지 않음
    glob.glob(pathname) pathname(패턴)에 해당하는 파일 리스트 반환
    os.path.isabs(path) path가 절대 경로면 True
    os.path.abspath(path) path의 절대 경로를 반환
    os.path.realpath(path) path의 경로에서 심볼릭 링크를 제거해서 반환
    os.path.exists(path) path가 존재하는 경로나 열려있는 파일 디스크립터면 True
    os.path.isfile(path) path가 존재하고 일반 파일이면 True
    os.path.isdir(path) path가 존재하고 디렉토리이면 True
  • 예시

    • 디렉토리 관리

      import os
      from pprint import pprint
      
      # 지정한 확장명을 가지는 파일명 목록을 리턴하는 함수
      def get_files(dir_path, ext):
          files = os.listdir(dir_path)
          cwd = os.getcwd()
          print(f"cwd : {cwd}")
      
          # 0. 일반 순회
          file_list = []
          for f in files:
              fpath = os.path.join(cwd, f)
              print(fpath)
              if (os.path.isfile(fpath)) and (fpath.endswith(ext)):
                  file_list.append(fpath)
          return file_list
      
          # 1. filter 함수 적용 
          files = map(lambda fname: os.path.join(cwd, fname), files)
          file_list = list(filter(lambda fname: fname.endswith(ext), files))
          return file_list
      
          # 2. 컴프리헨션
          return [os.path.join(cwd, fname) for fname in files if fname.endswith(ext)]
      
      
file_list = get_files('.', '.txt')
pprint(file_list)
```

```py
# ---- 요구 사항 예시 ----
# 파일 목록
# 1) addressbook copy.txt
# 2) addressbook.txt
# 3) live.txt
# 4) live2.txt
# 5) memo.txt
#
# 파일 선택 : 3
# live.txt 내용을 출력
#
# 파일 선택 : -1
# 종료
# -----------------------

import os

def get_files(dir_path, ext):
    return [fname for fname in os.listdir(dir_path) if fname.endswith(ext)]


def print_file_list(files):
    print("\n\n--- 파일 목록 ---")
    for idx, fname in enumerate(files, 1):
        print(f"{idx}) {fname}")
    print()


def print_file(file_name):
    try:
        with open(file_name, "rt", encoding="UTF-8") as f:
            text = f.read()
            print(text)
    except Exception as e:
        print(e)


while (True):
    txt_list = get_files('.', '.txt')
    print_file_list(txt_list)
    selected_no = int(input("파일을 선택하세요 : "))
    if (selected_no == -1):
        print("종료합니다.")
        break
    print_file(txt_list[selected_no - 1])
```

참고

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

파이썬 고급 문법  (0) 2021.08.24
파이썬 모듈과 패키지  (0) 2021.08.24
파이썬 예외 처리  (0) 2021.08.24
파이썬 표준 모듈  (0) 2021.08.24
파이썬 컬렉션 관리  (0) 2021.08.24
Python/Syntax 2021. 8. 24. 10:56

예외 처리

예외

  • 기본적으로 예외가 발생하면 프로세스가 종료된다.

예외 처리

  • 예외 발생을 감지하고 대처할 수 있다.

    try:
        실행할 명령
    except 예외 as 변수:
        오류 처리문
    [else: # 없어도 됨
        예외가 발생하지 않을 때의 처리]
    scores = ["89", "89점"]
    
    try:
        for score in scores:
            score_int = int(score)
            print(score_int)
    except:
        print("예외가 발생했습니다.")
    print("작업완료")
    
    ''' stdout
    89
    예외가 발생했습니다.
    작업완료
    '''
  • 예외 종류

    예외 설명
    NameError
    ValueError 값의 형식이 잘못됐을 때
    ZeroDivisionError 0으로 나눴을 때
    IndexError 인덱싱 가능한 범위를 벗어났을 때
    TypeError
  • except 키워드 뒤에 인자를 받지 않으면 모든 예외를 처리한다.

  • 예외에 alias를 붙이는 경우 except Exception as e와 같이 작성한다.

    str = "89"
    try:
        score = int(str)
        print(score)
        a = str[5]
    except Exception as e:
        print(e)
    print("작업완료")
    
    ''' stdout
    89
    string index out of range
    작업완료
    '''
  • raise

    • 예외를 발생시키는 키워드

      def calcsum(n):
          if n < 0 :
              raise ValueError("음수는 처리 불가")
      
          total = 0
          for i in range(n+1):
              total += i
      
          return total
      
      try:
          print(f"~ 10 = {calcsum(10)}")
          print(f"~ -5 = {calcsum(-5)}")
      except Exception as e:
          print("입력값이 잘못되었습니다.")
          print(e)
          print(type(e))
      
      ''' stdout
      ~ 10 = 55
      입력값이 잘못되었습니다.
      음수는 처리 불가
      <class 'ValueError'>
      '''

자원 정리

  • finally

    • 예외 발생 여부와 상관없이 항상 실행할 코드를 의미한다.

    • 주로 작업의 마무리 작업(cleanup)을 수행할 때 사용한다.

      from random import choice
      
      def connect():
          try:
              print("네트워크 접속")
              a = 2 / choice((0, 2))
              print("네트워크 통신 수행")
          except Exception as e:
              print(f"에러 : {e}")
          finally:
              print("접속 해제")
      
          print("작업 완료\n")
      
      connect()
      connect()
      connect()
      
      ''' stdout
      네트워크 접속
      에러 : division by zero
      접속 해제
      작업 완료
      
      네트워크 접속
      네트워크 통신 수행
      접속 해제
      작업 완료
      
      네트워크 접속
      네트워크 통신 수행
      접속 해제
      작업 완료
      '''
  • assert (단정문)

    • 조건이 True이면 통과, False이면 메시지를 가지는 예외를 발생시킨다.

    • 주로 테스트할 때 사용한다.

      score = 128
      
      assert score <= 100, "점수는 100 이하여야 합니다."
      
      # if score > 100:
      #     raise AssertionError("점수는 100 이하여야 합니다.")
      
      print(score)
      
      ''' stdout
      Traceback (most recent call last):
      File "파일명", line 3, in <module>
          assert score <= 100, "점수는 100 이하여야 합니다."
      AssertionError: 점수는 100 이하여야 합니다.
      '''

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

파이썬 모듈과 패키지  (0) 2021.08.24
파이썬 파일  (0) 2021.08.24
파이썬 표준 모듈  (0) 2021.08.24
파이썬 컬렉션 관리  (0) 2021.08.24
파이썬 집합(Set)  (0) 2021.08.22
Python/Syntax 2021. 8. 24. 10:52

표준 모듈

import

  • 다른 파일에 정의된 변수, 함수, 객체 등을 사용하기 전에 파일을 가져온다.

    import 모듈 [as alias]
    from 모듈 import 함수명
  • 전체 파일의 크기를 줄이려면 from 모듈 import 함수명 의 형식으로 작성하는게 좋다.

  • 아래의 출력 결과는 모두 같다.

    import math
    print(math.sqrt(2))
    from math import sqrt
    print(sqrt(2))
    import math as m
    print(m.sqrt(2))
    from math import sqrt as sq
    print(sq(2))

수학 (math)

https://docs.python.org/ko/3/library/math.html

상수

상수 설명
pi 원주율
tau 원주율 2배
e 자연 대수
inf 무한대
nan 숫자가 아닌 값

함수

함수명 설명
sqrt(x) 제곱근
pow(x,y) 거듭제곱
hypot(x,y) 빗변 계산
factorial(x) 팩토리얼
sin(x), cos(x), tan(x) 삼각함수
degrees(x) 라디안 -> 도(degree)
radians(x) 도(degree) -> 라디안
ceil(x) 올림
floor(x) 버림
fabs(x) 절댓값
trunc(x) 정수화, int(x)와 같은 결과를 반환한다.
log(x, base) 로그
log10(x) 상용 로그
gcd(a, b) 최대 공약수를 반환

통계 (statistics)

함수

함수명 설명
mean() 평균
harmonic_mean() 조화평균
median() 중앙값, 짝수인 경우 보간값 계산
median_low() 중앙값을 구함, 집합 내의 낮은 값 선택
median_high() 중앙값을 구함, 집합 내의 높은 값 선택
mdeian_grouped() 그룹 연속 중앙값
mode() 최빈값
pstdev() 모표준편차
stddev() 표준편차
variance() 분산

시간 (time)

유닉스 시간(Epoch 시간, POSIX 시간)

  • 1970년 1월 1일 00:00:00 협정 세계시(UTC) 부터의 경과 시간을 초로 환산하여 정수로 나타낸 것이다.

    import time
    t = time.time()
    print(t)
    print(time.ctime(t)) # 우리나라에선 잘 안쓴다.
    now = time.localtime(t)
    print(f"{now.tm_year}년 {now.tm_mon}월 {now.tm_mday}일", end = ' ')
    print(f"{now.tm_hour}:{now.tm_min}:{now.tm_sec}")
    
    ''' stdout
    1625810577.426773
    Fri Jul  9 15:02:57 2021
    2021년 7월 9일 15:2:57
    '''
  • time.struct_time 클래스

    • gmtime(), localtime(), strptime()의 반환 시퀀스 자료형
    인덱스 속성
    0 tm_year 연도
    1 tm_mon 월 [1, 12]
    2 tm_mday 일 [1, 31]
    3 tm_hour 시간 [0, 23]
    4 tm_min 분 [0, 59]
    5 tm_sec 초 [0, 61]
    6 tm_wday 요일 [0, 6], 월요일 시작
    7 tm_yday 연중 며칠째인지 [1, 366]
    8 tm_isdst 일광 절약 시간제 적용 시 1, 아니면 0, 모르면 -1
    없음 tm_zone 시간대 이름의 약어
    없음 tm_gmtoff UTC에서 동쪽으로 초 단위 오프셋
  • datetime 사용

    from datetime import datetime
    now = datetime.now()
    dates = ("월", "화", "수", "목", "금", "토", "일")
    print(f"{now.year}년 {now.month}월 {now.day}일 {dates[now.weekday()]}요일", end = ' ')
    print(f"{now.hour:02d}:{now.minute:02d}:{now.second:02d}")
    
    ''' stdout
    2021년 7월 9일 금요일 15:06:33
    '''

메서드

메서드 변환 전 변환 후
gmtime() 에포크 이후 초 UTC의 struct_time
localtime() 에포크 이후 초 현지 시간의 struct_time
calendar.timegm() UTC의 struct_time 에포크 이후 초
mktime() 현지 시간의 struct_time 에포크 이후 초

실행 시간 측정

import time
start = time.time()
for a in range(1000):
    print(a)
end = time.time()
print(end - start)

''' stdout
0
1
...
999
0.23747658729553223
'''

실행 멈춤

import time
print("안녕하세요")
time.sleep(1)
print("밤에 성시경이 두 명 있으면 뭘까요?")
time.sleep(3)
print('야간투시경입니다.')

달력 (calendar)

  • 달력 출력 가능

    import calendar as cal
    print(cal.calendar(2021))
    print(cal.month(2021, 7))

난수 (random)

함수

함수명 설명
.random() 0 ~ 1 사이의 난수 리턴 (1 미포함)
.randint(begin, end) begin ~ end 사이의 정수 난수 리턴 (end 포함)
.randrange(begin, end) begin ~ end 사이의 정수 난수 리턴 (end 미포함)
.uniform(begin, end) begin ~ end 사이의 실수 난수 리턴 (end 미포함)
.choice(시퀀스) 시퀀스에서 랜덤하게 요소를 선택하여 리턴
.shuffle(시퀀스) 시퀀스의 내용을 랜덤하게 섞는다.
.sample(시퀀스, count) 시퀀스에서 랜덤하게 count 만큼의 요소를 샘플로 뽑아 리턴
import random

for i in range(3):
    print(random.random())
print()
for i in range(3):
    print(random.randint(1, 10))
print()
for i in range(3):
    print(random.randrange(1, 10))
print()
for i in range(3):
    print(random.uniform(1, 10))

food = ["짜장면", "짬뽕", "탕수육", "군만두"]
print()
print(random.choice(food))
print()
print(random.sample(food, 2))
print()
print(food)
print()
random.shuffle(food)
print(food)

''' stdout
0.49319954486125117
0.34949220090889466
0.8089770081669401

8
1
2

5
4
1

6.949706451204434
4.21418278703128
8.835615150642608

짬뽕

['탕수육', '짜장면']

['짜장면', '짬뽕', '탕수육', '군만두']

['군만두', '탕수육', '짬뽕', '짜장면']
'''

시스템 (sys)

시스템 정보

import sys

print("버전: ", sys.version)
print("플랫폼: ", sys.platform)
print("바이트 순서: ", sys.byteorder)
print("모듈 경로: ", sys.path)
sys.exit(0)

''' stdout
버전:  3.8.8 (default, Apr 13 2021, 15:08:03) [MSC v.1916 64 bit (AMD64)]
플랫폼:  win32
바이트 순서:  little
모듈 경로:  ['c:\\~~~']
'''

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

파이썬 파일  (0) 2021.08.24
파이썬 예외 처리  (0) 2021.08.24
파이썬 컬렉션 관리  (0) 2021.08.24
파이썬 집합(Set)  (0) 2021.08.22
파이썬 사전(Dictionary)  (0) 2021.08.22
Python/Syntax 2021. 8. 24. 10:42

컬렉션 관리

컬렉션 관리 함수

enumerate

  • 시퀀스의 인덱스와 요소를 튜플로 묶어서 순회한다.

    enumerate(시퀀스 [, start])
    race = ['저그', '테란', '프로토스']
    print(list(enumerate(race)))
    
    ''' stdout
    [(0, '저그'), (1, '테란'), (2, '프로토스')]
    '''
  • 시작 숫자를 정할 수 있다.

    score = [88, 95, 70, 100, 99]
    
    for no, s in enumerate(score, 1):
        print(f"{no}번 학생의 성적 : {s}")
    
    ''' stdout
    1번 학생의 성적 : 88
    2번 학생의 성적 : 95
    3번 학생의 성적 : 70
    4번 학생의 성적 : 100
    5번 학생의 성적 : 99
    '''
  • 언팩해서 쓰면 좋다.

zip

  • 시퀀스 두 개를 순서대로 튜플로 묶어서 zip 객체로 반환한다.

    • 길이가 다를 경우 짧은 길이에 맞춘다.
  • 예시

    dates = ["월", "화", "수", "목", "금", "토", "일"]
    food = ["갈비탕", "순대국", "칼국수", "삼겸살"]
    menu = zip(dates, food)
    for d, f in menu:
        print(f"{d}요일 메뉴 : {f}")
    
    ''' stdout
    월요일 메뉴 : 갈비탕
    화요일 메뉴 : 순대국
    수요일 메뉴 : 칼국수
    목요일 메뉴 : 삼겸살
    '''
  • list(집객체) 등으로 한번 순회하고 나면 데이터가 사라진다.

    • zip 객체는 제너레이터 함수로 구성되어 있기 때문이다.

any, all

  • any(시퀀스)

    • 시퀀스에 하나라도 True가 있으면 True 반환
  • all(시퀀스)

    • 시퀀스의 모든 요소가 True이면 True 반환
  • 예시

    adult = [True, False, True, False]
    print(any(adult))
    print(all(adult))
    
    ''' stdout
    True
    False
    '''

람다 함수

filter

  • 시퀀스의 각 요소를 판정함수에 전달하여 True를 리턴하는 요소로만 구성된 새로운 시퀀스를 리턴한다.

    filter(판정함수, 시퀀스) -> 시퀀스 # "->"는 반환 자료형을 의미한다.

map

  • 시퀀스를 변환함수에 전달하여 map 객체를 리턴한다.

    map(변환함수, 시퀀스[, 시퀀스])
  • 여러 시퀀스를 넣을 수 있다. 이 때 함수의 인수 개수와 일치해야 한다.

    def add(s, b):
        return s + b
    
    score = [45, 89, 72, 53, 94]
    bonus = [2, 3, 0, 0, 5]
    
    for s in map(add, score, bonus):
        print(s, end = ", ")
    
    ''' stdout
    47, 92, 72, 53, 99,
    '''

람다 함수

  • 이름이 없는 한 줄짜리 함수이다.

    lambda 인수: 식
  • 예시

    score = [ 45, 89, 72, 53, 94 ]
    
    for s in filter(lambda x: x < 60, score):
        print(s)
    
    ''' stdout
    45
    53
    '''
  • 파이썬은 들여쓰기로 줄을 구분하기 때문에, 한 줄밖에 쓰지 못한다.


컬렉션의 사본

시퀀스의 사본

  • 원시타입이 아닌 자료형은 기본적으로 대입할 때 Call by Reference이므로 같은 객체이다.

  • 새로운 객체를 만들려면 copy 메서드를 사용해야 한다.

    시퀀스.copy()
    list1 = [1, 2, 3]
    list2 = list1.copy() # list2 = list1[:]와 동일
    print(list1 == list2)
    list2[1] = 100
    print(list1)
    print(list2)
    print(list1 == list2)
    
    ''' stdout
    True
    [1, 2, 3]
    [1, 100, 3]
    False
    '''
  • Deep Copy를 하기 위해서는 deepcopy 메서드를 사용한다.

    import copy
    list0 = ['a', 'b']
    list1 = [list0, 1, 2]
    list2 = copy.deepcopy(list1) # 깊은 복사
    list2[0][1] = 'c'
    print(list1)
    print(list2)
    
    ''' stdout
    [['a', 'b'], 1, 2]
    [['a', 'c'], 1, 2]
    '''

is 연산자

  • 두 변수가 같은 객체를 가리키는지 조사할 수 있다.

    list1 = ['a', 'b']
    list2 = list1
    list3 = list1.copy() # 얕은 복사
    print("list1 is list2 :", list1 is list2)
    print("list1 is list3 :", list1 is list3)
    print("list2 is list3 :", list2 is list3)
    
    ''' stdout
    list1 is list2 : True
    list1 is list3 : False
    list2 is list3 : False
    '''

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

파이썬 예외 처리  (0) 2021.08.24
파이썬 표준 모듈  (0) 2021.08.24
파이썬 집합(Set)  (0) 2021.08.22
파이썬 사전(Dictionary)  (0) 2021.08.22
파이썬 튜플(Tuple)  (0) 2021.08.22
Python/Syntax 2021. 8. 22. 14:50

집합(Set)

  • 중괄호로 묶는다.

  • 중복을 허용하지 않는다.

  • 순서가 보장되지 않는다.


메서드

연산 기호 메서드 설명
추가 add(값) 집합에 값이 없으면 추가한다.
제거 remove(값) 집합에서 값을 제거한다. 값이 없으면 예외 발생
합집합 union(집합2) 두 집합의 모든 원소
교집합 & intersection(집합2) 두 집합의 공통 원소
차집합 - difference(집합2) 왼쪽 집합의 원소 중 오른쪽 집합의 원소가 아닌 것
배타적 차집합 ^ symmetric_difference(집합2) 한쪽 집합에만 있는 원소
부분 집합 <= issubset(집합2) 왼쪽이 오른쪽의 부분집합이면 True
진성 부분집합 < 부분집합이면서 여분의 원소가 더 있음
포함집합 >= issuperset(집합2) 왼쪽이 오른쪽 집합을 포함하면 True
진성 포함집합 > 포함집합이면서 여분의 원소가 더 있음

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

파이썬 표준 모듈  (0) 2021.08.24
파이썬 컬렉션 관리  (0) 2021.08.24
파이썬 사전(Dictionary)  (0) 2021.08.22
파이썬 튜플(Tuple)  (0) 2021.08.22
파이썬 리스트(List)  (0) 2021.08.22
Python/Syntax 2021. 8. 22. 14:50

사전(Dictionary)

  • key와 value의 쌍으로 구성된다.

  • 중괄호로 묶는다.

    {
      키1:값1,
      키2:값2,
      ...
    }
  • 키를 통해 값을 반환받을 수 있다.

    dic = { 'boy': '소년', 'school': '학교', 'book':'책' }
    print(dic['boy'])
    print(dic['book'])
    
    ''' stdout
    소년
    책
    '''
  • 존재하지 않는 키를 입력하면 예외가 발생한다.

    dic = { 'boy': '소년', 'school': '학교', 'book':'책'}
    print(dic.get('boy'))
    print(dic.get('girl'))
    print(dic.get('girl', '사전에 없는 단어입니다.'))
    
    ''' stdout
    소년
    None
    사전에 없는 단어입니다.
    '''

메서드

메서드 설명
사전[키] 키의 값을 반환, 없으면 예외 발생
.get(키) 키에 대한 값을 반환하고, 존재하지 않는 키에 대해서는 None이나 두 번째 인자 반환
.keys() 키 목록 리턴
.values() 값 목록 리턴
.items() (키, 값) 튜플 목록 리턴
del 사전[키] 기존 엔트리 삭제
list(사전) 사전의 키들만 리스트로 변환하여 리턴
.update(사전2) 사전2를 원본에 추가한다. 중복된 키는 업데이트한다.
  • 예시

    dic = { 'boy': '소년', 'school': '학교', 'book':'책'}
    dic['boy'] = '남자아이' # 기존값 수정
    dic['girl'] = '소녀' # 새로운 엔트리 추가
    del dic['book'] # 기존 엔트리 삭제
    print(dic)
    
    ''' stdout
    {'boy': '남자아이', 'school': '학교', 'girl': '소녀'}
    '''
  • keys, values, items 메서드를 통해 반환받은 값은 따로 형변환을 해야 적당히 사용할 수 있다.

    dic = { 'boy': '소년', 'school': '학교', 'book':'책'}
    print(dic.keys())
    print(dic.values())
    print(dic.items())
    
    ''' stdout
    dict_keys(['boy', 'school', 'book'])
    dict_values(['소년', '학교', '책'])
    dict_items([('boy', '소년'), ('school', '학교'), ('book', '책')])
    '''
  • 다른 콜렉션을 사전으로 형변환할 수 있다.

    li = [
        ['boy', '소년'],
        ['school', '학교'],
        ['teacher', '선생님']
    ]
    dic = dict(li)
    print(dic)
    
    ''' stdout
    {'boy': '소년', 'school': '학교', 'teacher': '선생님'}
    '''

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

파이썬 컬렉션 관리  (0) 2021.08.24
파이썬 집합(Set)  (0) 2021.08.22
파이썬 튜플(Tuple)  (0) 2021.08.22
파이썬 리스트(List)  (0) 2021.08.22
파이썬 함수  (0) 2021.08.22
Python/Syntax 2021. 8. 22. 14:50

튜플(Tuple)

  • 불변 자료 집합이다.

    • 추가, 수정, 삭제를 할 수 없고 읽기만 가능하다.

      • 리스트보다 속도가 빠르다.
  • 소괄호를 생략해도 된다.


Unpack

  • 튜플의 요소 하나하나에 대입하는 방식이다.

    names = "이순신", "김유신", "강감찬"
    lee, kim, kang = names # unpack
    print(lee)
    print(kim)
    print(kang)
    
    ''' stdout
    이순신
    김유신
    강감찬
    '''
    d, m = divmod(7, 3)
    print("몫", d)
    print("나머지", m)
    
    ''' stdout
    몫 2
    나머지 1
    '''

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

파이썬 집합(Set)  (0) 2021.08.22
파이썬 사전(Dictionary)  (0) 2021.08.22
파이썬 리스트(List)  (0) 2021.08.22
파이썬 함수  (0) 2021.08.22
파이썬 반복문  (0) 2021.08.22
Python/Syntax 2021. 8. 22. 14:49

리스트(List)

  • 리스트는 순서가 있고 변경 가능한 자료의 집합이다.

  • 중복을 허용한다.

  • 대괄호로 묶는다.

  • 문자열처럼 인덱싱과 슬라이싱을 할 수 있다.

    nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(nums[:])
    print(nums[2:5])
    print(nums[:4])
    print(nums[6:])
    print(nums[1:7:2])
    print(nums[0])
    
    ''' stdout
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    [2, 3, 4]
    [0, 1, 2, 3]
    [6, 7, 8, 9]
    [1, 3, 5]
    0
    '''
  • 기존 값을 삭제하면서 동시에 새로운 값을 삽입할 수 있다.

    nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    nums[2:5] = [20, 30, 40]
    print(nums)
    nums[6:8] = [60, 70, 80, 90]
    print(nums)
    
    ''' stdout
    [0, 1, 20, 30, 40, 5, 6, 7, 8, 9]
    [0, 1, 20, 30, 40, 5, 60, 70, 80, 90, 8, 9]
    '''
    nums = [1, 2, 3, 4]
    nums[2:2] = [90, 91, 92] # 새로운 값들을 삽입
    print(nums)
    nums = [1, 2, 3, 4]
    nums[2] = [90, 91, 92] # 지정한 위치의 엘리먼트에 리스트 대체
    print(nums)
    
    ''' stdout
    [1, 2, 90, 91, 92, 3, 4]
    [1, 2, [90, 91, 92], 4]
    '''
  • +, * 기호를 지원한다.

    list1 = [1, 2, 3, 4, 5]
    list2 = [10, 11]
    listadd = list1 + list2
    print(listadd)
    listmulti = list2*3
    print(listmulti)
    
    ''' stdout
    [1, 2, 3, 4, 5, 10, 11]
    [10, 11, 10, 11, 10, 11]
    '''

컴프리핸션

  • 내부의 리스트를 순회하며 각 요소에 대한 수식을 적용하여 최종 요소를 생성한다.

    [수식 for 변수 in 리스트 if 조건]
    nums = [ n*2 for n in range(1, 11)]
    for i in nums:
        print(i, end = ', ')
    
    ''' stdout
    2, 4, 6, 8, 10, 12, 14, 16, 18, 20,
    '''

메서드

메서드 설명
.append(값) 리스트 끝에 값 추가
.insert(위치, 값) 지정한 위치에 값 삽입
.extend(리스트2) 원본 리스트 뒤에 리스트2를 붙인다.
list1 + list2 extend는 원본을 변경하고, 이건 붙여서 새로운 리스트로 리턴한다.
.remove(값) 리스트에서 값을 찾아 첫번째 해당 요소를 제거, 없으면 예외 발생
del(리스트[인덱스]) 지정한 인덱스의 요소 제거
[시작:끝] = [] 지정 범위 요소 제거
.pop() 리스트 끝 요소를 삭제하고 해당 요소를 리턴
.pop(인덱스) 지정한 인덱스의 요소를 삭제하고 해당 요소를 리턴
.index(값) 값을 찾아 해당 인덱스를 리턴, 없으면 예외 발생
.count(값) 값이 리스트에 포함된 횟수 리턴
len(시퀀스) 시퀀스의 길이 리턴
max(시퀀스) 요소 중 최댓값 리턴
min(시퀀스) 요소 중 최솟값 리턴
값 in 시퀀스 값이 시퀀스에 포함되어 있으면 True
값 not in 시퀀스 값이 시퀀스에 포함되지 않으면 True
.sort([reverse=True][key=키에 적용할 함수]) 리스트를 정렬한다. reverse 옵션으로 내림차순 정렬도 가능하다. key에 적용할 함수에서 리턴하는 값을 통해 비교한다.
.reverse() 리스트를 역순으로 재배치
sorted(시퀀스) 지정한 시퀀스를 정렬하여 새로운 리스트로 리턴
score = [88, 95, 70, 100, 99]
score.sort()
print(score)

score.reverse()
print(score)

score = [88, 95, 70, 100, 99]
score.sort(reverse=True)
print(score)

country = ["Korea", "japan", "CHINA", "america"]
country.sort()
print(country)

country.sort(key = str.lower)
print(country)

''' stdout
[70, 88, 95, 99, 100]
[100, 99, 95, 88, 70]
[100, 99, 95, 88, 70]
['CHINA', 'Korea', 'america', 'japan']
['america', 'CHINA', 'japan', 'Korea']
'''

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

파이썬 사전(Dictionary)  (0) 2021.08.22
파이썬 튜플(Tuple)  (0) 2021.08.22
파이썬 함수  (0) 2021.08.22
파이썬 반복문  (0) 2021.08.22
파이썬 조건문  (0) 2021.08.22
Python/Syntax 2021. 8. 22. 14:47

함수

  • 반복되는 코드를 함수로 정의하여 중복을 최소화한다.

      def 함수명(인수 목록):
          명령 블록

pass

  • 파이썬이 번역할 때 아무것도 하지 않고 넘기는 더미 역할의 키워드이다.

  • 코드 블록을 당장 구현하지 않을 경우 pass를 쓰고 넘어가면 에러가 발생하지 않는다.

      def 함수명(인수 목록):
          pass

출력 함수

입력 함수

인수

변수

연산자

조건문

반복문

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

파이썬 튜플(Tuple)  (0) 2021.08.22
파이썬 리스트(List)  (0) 2021.08.22
파이썬 반복문  (0) 2021.08.22
파이썬 조건문  (0) 2021.08.22
파이썬 연산자  (0) 2021.08.22
Python/Syntax 2021. 8. 22. 14:46

반복문

while 문

  • 조건이 참인 동안 명령 블록을 실행한다.

    while (조건):
        명령 블록

for 문

  • 컬렉션의 요소를 하나씩 꺼내서 명령 블록을 실행한다.

    for 제어변수 in 컬렉션:
        명령 블록

break

  • 반복문 탈출

continue

  • continue 이후 명령을 실행하지 않고 다음 반복을 시작한다.

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

파이썬 리스트(List)  (0) 2021.08.22
파이썬 함수  (0) 2021.08.22
파이썬 조건문  (0) 2021.08.22
파이썬 연산자  (0) 2021.08.22
파이썬 변수  (0) 2021.08.22
Python/Syntax 2021. 8. 22. 14:46

조건문

if

  • 조건이 참이면 명령 블록을 실행

    if (조건):
        명령
    age = int(input("나이를 입력하세요 : "))
    if age < 19:
        print("애들은 가라")
  • 비교 연산자

    연산자 설명
    == 같다
    != 다르다
    < 좌변이 우변보다 작다
    > 좌변이 우변보다 크다
    <= 좌변이 우변보다 작거나 같다
    >= 좌변이 우변보다 크거나 같다
  • 논리 연산자

    연산자 설명
    and 두 조건이 모두 참이면 참
    or 두 조건 중 하나라도 참이면 참
    not 조건이 거짓이면 참
  • 거짓 값

    • False

    • None

    • 0

    • "" : 비어있는 문자열

    • [], () : 비어있는 컬렉션

  • 블록 구조

    • 코드 블록은 모두 동일한 들여쓰기를 해야 한다.
  • 전체적인 형태

    if 조건1:
        명령 블록
    elif 조건2:
        명령 블록
    ...
    else:
        명령 블록

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

파이썬 함수  (0) 2021.08.22
파이썬 반복문  (0) 2021.08.22
파이썬 연산자  (0) 2021.08.22
파이썬 변수  (0) 2021.08.22
파이썬 문자열  (0) 2021.08.22
Python/Syntax 2021. 8. 22. 14:45

연산자

대입 및 산술

  • 대입

    • 변수에 값을 저장하는 것이다.

    • 연산의 결과를 값으로 사용할 수 있다.

    • 선언하지 않은 변수를 읽으면 예외가 발생한다.

      NameError: name '변수명' is not defined
  • 산술

    기호 설명
    + 덧셈
    - 뺄셈
    * 곱셈
    / 나눗셈
    ** 거듭제곱
    //
    % 나머지
  • 복합 대입 연산자

    • 변수의 반복 사용을 줄여주는 축약 표현이다.

      a += 1
      a -= 1
      a *= 1
      a /= 1
      a **= 1
      a //= 1
      a %= 1

타입 변환

  • 정수와 문자열

    • 문자열끼리만 + 연산자로 연결할 수 있다.

      • 다른 타입을 연결하려면 str() 함수로 변환해야 한다.
  • 변환 함수

    함수 설명
    str() 문자열로 변환
    int() 10진수로 변환
    int(정수, 진법) 진법 기반으로 정수를 10진수로 변환
    float() 실수로 변환
    round(숫자[, 반올림 자리수]) 실수 반올림 함수
    bool() 부울로 변환
    list() 리스트로 변환
    tuple() 튜플로 변환
    dict() 사전으로 변환
    print(int(2.54))
    print(round(2.54))
    print(round(2.54, 1))
    print(round(123456, -3))
    
    ''' stdout
    2 3
    2.5
    123000
    '''

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

파이썬 반복문  (0) 2021.08.22
파이썬 조건문  (0) 2021.08.22
파이썬 변수  (0) 2021.08.22
파이썬 문자열  (0) 2021.08.22
파이썬 인수  (0) 2021.08.22
Python/Syntax 2021. 8. 22. 14:45

변수

변수의 범위

  • 지역 변수

    • 함수 내에서만 사용 가능한 변수이다.
  • 전역 변수

    • 어디에서든 접근 가능한 변수이다.

    • global 키워드를 붙여서 전역 변수로 사용할 수 있다.

      price = 1000
      def sale():
          global price
          price = 500
      
      sale()
      print(price)
      
      ''' stdout
      500
      '''
  • docstring

    • 함수의 매뉴얼을 작성하는 방식이다.

      • help(함수명) 함수를 호출할 때 나오는 내용이다.
    • 함수 코드 블록 앞에 문자열로 지정한다.

      def calcsum(n):
          """1 ~ n까지의 합계를 구해 리턴한다"""
          total = 0
          for i in range(n+1):
              total += i
          return total
      
      help(calcsum)
      
      ''' stdout
      Help on function calcsum in module __main__:
      calcsum(n)
      1 ~ n까지의 합계를 구해 리턴한다
      '''

변수 타입

수치형

  • 정수형

    • 크기에 제한이 없다.

    • 값에 따라 크기가 자동으로 조정된다.

    • 진법에 따른 표기 방식

      진법 접두 사용 가능 문자
      16진법(hexadecimal) 0x 0~9, a~f
      8진법(octal) 0o 0~7
      2진법(binary) 0b 0, 1
      print(26)
      print(hex(26))
      print(oct(26))
      print(bin(26))
      
      '''stdout
      26
      0x1a
      0o32
      0b11010
      '''
  • 실수형

    a = 9.46e12
    print(a)
    
    ''' stdout
    9460000000000.0
    '''
  • 복소수형

    • 실수부 + 허수부j

      a = 1 + 2j
      b = 3 + 4j
      print(a + b)
      
      ''' stdout
      (4+6j)
      '''

문자열

진위형(Boolean)

  • True, False

NoneType

  • 어떠한 값도 없음을 나타낸다.

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

파이썬 반복문  (0) 2021.08.22
파이썬 조건문  (0) 2021.08.22
파이썬 연산자  (0) 2021.08.22
파이썬 문자열  (0) 2021.08.22
파이썬 인수  (0) 2021.08.22
Python/Syntax 2021. 8. 22. 14:45

문자열

  • 큰 따옴표나 작은 따옴표로 묶으면 문자열이다.

    • 여러 줄을 표현할 때는 끝에 \를 붙이고 줄바꿈을 하거나, 문자열을 삼중 따옴표(''', """)로 묶으면 된다.
  • 이스케이프 시퀀스(escape sequence, 확장열)

    확장열 설명
    \n 개행
    \t
    \" 큰따옴표
    \' 작은따옴표
    \ \ 문자
  • 아스키 코드

    • 다음과 같은 함수로 아스키 코드와 문자를 서로 변환할 수 있다.

      print(ord('a'))
      print(chr(98))
      for c in range(ord('A'), ord('Z')+1):
          print(chr(c), end='')
      
      ''' stdout
      97
      b
      ABCDEFGHIJKLMNOPQRSTUVWXYZ
      '''
  • 문자열 연산

    • 문자열 연결

      기호 설명
      + 문자열 연결
      * 문자열 반복

문자열 관리

문자열 분리

  • 인덱싱

    문자열[정수]
    • 인덱스는 앞에서부터 0, 1, 2, 3, ... 순서이다.

    • 뒤에서부터는 -1, -2, -3, ... 순서이다.

      s = "python"
      print(s[2])
      print(s[-2])
      
      ''' stdout
      t
      o
      '''
  • 슬라이싱

    문자열[begin:end:step]

메서드

메서드 설명
.find(str) str 문자열을 왼쪽부터 찾아 인덱스 반환, 없으면 -1 반환
.rfind(str) 오른쪽부터 find
.index(str) find와 동일, 단 없으면 예외 발생
.count(str) str 문자열 등장 횟수 반환
.startswith(str) str으로 시작하면 True
.endswith(str) str으로 끝나면 True
.isalpha() 모든 문자가 알파벳이면 True
.islower() 모든 문자가 소문자면 True
.isupper() 모든 문자가 대문자면 True
.isspace() 모든 문자가 whitespace면 True
.isalnum() 모든 문자가 알파벳이나 숫자면 True
.isdecimal() 모든 문자가 10진수면 True
.isdigit() 모든 문자가 특수문자 포함 정수면 True (3^2 같은거)
.isnumeric() 모든 문자가 특수문자 포함 정수면 True (1/2 특수문자 같은거)
.isidentifier() 모든 문자가 변수명, 클래스명 등의 식별자로 사용할 수 있면 True
.isprintable() 모든 문자가 출력 가능한 문자면 True
단어 in 문자열 문자열에 단어가 존재하면 True
단어 not in 문자열 문자열에 단어가 없으면 True
.lower() 소문자로
.upper() 대문자로
.swapcase() 대문자 <-> 소문자
.capitalize() 첫 글자만 대문자, 나머지는 소문자
.title() 모든 단어의 첫 글자를 대문자로, 나머지는 소문자로
.strip() 좌우 공백 제거
.lstrip() 왼쪽 공백 제거
.rstrip() 오른쪽 공백 제거
.split(구분자) 구분자를 기준으로 단어를 분리하여 리스트로 리턴한다. 기본값은 공백
.splitlines() 개행 문자를 기준으로 분리한다.
결합문자열.join(문자열) 문자열 사이에 결합문자열을 끼우고 연결하여 리턴한다.
.replace(기존 문자열, 대체 문자열) 기존 문자열을 대체 문자열로 교체
.center(폭 숫자) 좌우에 공백을 채워 폭을 맞춘다.
.ljust(폭 숫자) 왼쪽에 공백을 채워 폭을 맞춘다.
.rjust(폭 숫자) 오른쪽에 공백을 채워 폭을 맞춘다.
  • 예시

    name = "홍길동"
    if name.startswith("홍"):
        print("홍씨입니다.")
    if name.startswith("김"):
        print("김씨입니다.")
    file = "figure.jpg"
    if file.endswith(".jpg"):
        print("JPG 그림 파일입니다.")
    
    ''' stdout
    홍씨입니다.
    JPG 그림 파일입니다.
    '''
    s = "Good morning. my love KIM."
    print(s.lower())
    print(s.upper())
    print(s.swapcase())
    print(s.capitalize())
    print(s.title())
    print()
    s = "    angel    "
    print(s + "님")
    print(s.strip() + "님")
    print(s.lstrip() + "님")
    print(s.rstrip() + "님")
    
    ''' stdout
    good morning. my love kim.
    GOOD MORNING. MY LOVE KIM.
    gOOD MORNING. MY LOVE kim.
    Good morning. my love kim.
    Good Morning. My Love Kim.
    
        angel    님
    angel님
    angel    님
        angel님
    '''
    s = "짜장 짬뽕 탕수육"
    print(s.split())
    s2 = "서울->대전->대구->부산"
    cities = s2.split("->")
    print(cities)
    for city in cities:
        print(city)
    print()
    s ="._."
    print(s.join("대한민국"))
    
    '''stdout
    ['짜장', '짬뽕', '탕수육']
    ['서울', '대전', '대구', '부산']
    서울
    대전
    대구
    부산
    
    대._.한._.민._.국
    '''

포맷팅

포맷 설명
%d 정수
%f 실수
%s 문자열
%c 문자 하나
%h 16진수
%o 8진수
%% % 문자
%[-]폭[.유효자리수] 세세하게 설정할 때
$ 좌우 채움
> 왼쪽에 채움
< 오른쪽에 채움
  • 예시

    name = "길동"
    age = 16
    height = 162.5
    print("이름:{0:$<10s}, 나이:{1:>05d}, 키:{2:!<8.2f}".format(name, age, height))
    
    ''' stdout
    이름:길동$$$$$$$$, 나이:00016, 키:162.50!!
    '''
  • 파이썬3부터는 print(f"{number:%.2f}") 이런 식으로 사용한다.

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

파이썬 반복문  (0) 2021.08.22
파이썬 조건문  (0) 2021.08.22
파이썬 연산자  (0) 2021.08.22
파이썬 변수  (0) 2021.08.22
파이썬 인수  (0) 2021.08.22
Python/Syntax 2021. 8. 22. 14:44

인수

  • 함수로 값을 전달했을 때 이를 저장하는 변수

  • 함수 내부에서 사용한다.


가변 인수

  • 인수의 수가 고정되지 않고 호출 시 원하는 만큼 인수를 지정할 수 있다.

    • 튜플로 받아서 처리한다.
  • 일반 인수보다 뒤에 위치해야 한다.

  • 함수 당 하나만 사용할 수 있다.

  • 예시

    • 인수명 앞에 * 를 붙여서 가변 인수임을 표시한다.

      def intsum(*ints):
          total = 0
          for num in ints:
              total += num
          return total
      print(intsum(1, 2, 3)) # ints = (1, 2, 3)
      print(intsum(5, 7, 9, 11, 13)) # ints = (5, 7, 9, 11, 13)
      print(intsum(8, 9, 6, 2, 9, 7, 5, 8))
      
      ''' stdout
      6
      45
      54
      '''
    • 아래의 scores 리스트를 인자로 넣을 경우 intsum(*scores) 처럼 * 를 붙이면 리스트가 펼쳐진다.

      def intsum(*ints):
          print(type(ints))
          print(ints)
      
          total = 0
          for num in ints:
              total += num
          return total
      
      scores = [20, 30, 40]
      # print(intsum(scores)) # 에러
      print(intsum(*scores)) # 펼침 : [20, 30, 40] -> 20, 30, 40
      print(*scores)
      
      ''' stdout
      <class 'tuple'>
      (20, 30, 40)
      90
      20 30 40
      '''

인수의 기본값

  • 함수 호출 시 인수가 지정되지 않았을 때 사용할 기본값이다.

  • 함수 정의 시 인수에 값을 대입하면 된다.

  • 인수에 값을 지정할 때는 띄어쓰기를 안하는게 암묵적 룰인 것 같다.

    def calcstep(begin, end=1, step=1):
        total = 0
        for num in range(begin, end + 1, step):
            total += num
        return total
    print(f"1 ~ 10 = {calcstep(1, 10, 2)}")
    print(f"1 ~ 100 = {calcstep(1, 100)}")
    print(f"-10 ~ 1 = {calcstep(-10)}")
    
    ''' stdout
    1 ~ 10 = 25
    1 ~ 100 = 5050
    -10 ~ 1 = -54
    '''

키워드 인수

  • 인수 명칭으로 변수를 매칭할 수 있다.

    def calcstep(begin, end, step):
        total = 0
        for num in range(begin, end + 1, step):
            total += num
        return total
    
    print(f"3 ~ 5 = {calcstep(3, 5, 1)}")
    print(f"3 ~ 5 = {calcstep(begin=3, end=5, step=1)}")
    print(f"3 ~ 5 = {calcstep(step=1, end=5, begin=3)}")
    print(f"3 ~ 5 = {calcstep(3, 5, step=1)}")
    print(f"3 ~ 5 = {calcstep(3, step=1, end=5)}")
    # print(f"3 ~ 5 = {calcstep(3, step=1, 5)}") # 에러
    
    ''' stdout
    3 ~ 5 = 12
    3 ~ 5 = 12
    3 ~ 5 = 12
    3 ~ 5 = 12
    3 ~ 5 = 12
    '''

키워드 가변 인수

  • 키워드 인수를 가변 개수로 전달할 때 사용한다.

  • 함수 정의 시 ** 기호를 인수 앞에 붙인다.

    • 사전(Dictionary)으로 받아서 처리한다.

      def calcstep(**args):
          print(type(args))
          print(args)
      
          begin = args.get('begin', 0)
          end = args['end']
          step = args['step']
          total = 0
          for num in range(begin, end + 1, step):
              total += num
          return total
      
      print("3 ~ 5 =", calcstep(begin=3, end=5, step=1), end='\n\n')
      print("3 ~ 5 =", calcstep(step=1, end=5, begin=3), end='\n\n')
      print(" ~ 5 =", calcstep(step=1, end=5))
      
      ''' stdout
      <class 'dict'>
      {'begin': 3, 'end': 5, 'step': 1}
      3 ~ 5 = 12
      
      <class 'dict'>
      {'step': 1, 'end': 5, 'begin': 3}
      3 ~ 5 = 12
      
      <class 'dict'>
      {'step': 1, 'end': 5}
      ~ 5 = 15
      '''
    • 사전도 펼칠 수 있다.

      def calcstep(**args):
          print(type(args))
          print(args)
      
          begin = args.get('begin', 0)
          end = args['end']
          step = args['step']
          total = 0
          for num in range(begin, end + 1, step):
              total += num
          return total
      
      dic = {
          'begin' : 1,
          'end' : 100,
          'step' : 2
      }
      
      # dict의 펼침 : **사전명
      print(calcstep(**dic))
      print(*dic)
      # print(**dic)
      
      ''' stdout
      <class 'dict'>
      {'begin': 1, 'end': 100, 'step': 2}
      2500
      begin end step
      '''

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

파이썬 반복문  (0) 2021.08.22
파이썬 조건문  (0) 2021.08.22
파이썬 연산자  (0) 2021.08.22
파이썬 변수  (0) 2021.08.22
파이썬 문자열  (0) 2021.08.22
Python/Function 2021. 8. 22. 14:44

입력 함수

input

변수 = input('출력 내용')
  • 리턴 타입이 문자열이다.

    • 숫자 등 다른 형식으로 쓰려면 형변환해야 한다.
  • 예제

    age = int(input('몇 살이세요? '))
    print(age)

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

파이썬 출력 함수  (0) 2021.08.22
Python/Function 2021. 8. 22. 14:43

출력 함수

print

print(출력 내용[, sep = 구분자][, end = 끝 문자])
  • sep의 기본값은 ' ', end의 기본값은 '\n'이다.

  • 리턴 값이 None이다.

  • 예시

    print("ab", "cd", sep = " ---> ", end = "\n")
    
    ''' stdout
    ab ---> cd
    
    '''

pprint

  • pprint 모듈

  • 리스트 등을 예쁘게 출력해준다.

    from pprint import pprint
    
    dict_list = [{"First": 1, "Second": 2, "Third": 3}, \
                {"Hello": "World"}, {"Python": "Django"}]
    pprint(dict_list)
    
    ''' stdout
    [{'First': 1, 'Second': 2, 'Third': 3},
    {'Hello': 'World'},
    {'Python': 'Django'}]
    '''

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

파이썬 입력 함수  (0) 2021.08.22
Python 2021. 8. 22. 14:42

멀티캠퍼스 파이썬

함수(Function)

문자열(String)

리스트(List)

튜플(Tuple)

사전(Dictionary)

집합(Set)

컬렉션 관리

표준 모듈

예외 처리

파일

클래스(Class)

모듈과 패키지

고급 문법


그 외

  • Underscore(_) : 직접 사용하지는 않지만 필요한 변수에 할당한다.

    • ex. for _ in range(5)
  • 소스 형식

    • 들여쓰기로 코드 블록을 구분한다.

    • 대소문자를 구분한다.

    • 주석은 #를 맨 앞에 붙이고, 여러 줄은 각각 앞에 붙여야 한다.


하드웨어

  • 메모리

    • DRAM(Dynamic Random Access Memory)

      • 커패시터 기반이기 때문에 자연방전이 발생한다.

        • Dynamic하게 주기적으로 Refresh 해야 하므로 지연이 발생한다.
      • 저렴하여 RAM에 많이 사용한다.

    • SRAM(Static Random Access Memory)

      • 전자식 기반(플립플롭)이므로 Refresh가 필요없어서 빠르다.

      • DRAM에 비해 가격이 비싸서 CPU 캐시에 주로 사용한다.


용어

  • 컨텍스트 메뉴(Context Menu) : 마우스 우클릭 시 뜨는 메뉴

  • Opcode(Operation Code) : CPU 명령어 코드

  • 환경 변수 Path

    • 현재 디렉토리에 실행 파일이 없을 경우 실행 파일을 찾을 디렉토리의 경로이다.

    • 사용자 변수와 시스템 변수가 있는데, 사용자 변수부터 찾기 시작한다.

  • SRP(Single Responsibility Principle, 단일 책임 원칙)

    • 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 한다는 의미이다.
  • Kebob(케밥) Case

    • 하이픈으로 단어를 구분하는 방법

      ex. print-in-star


참고