파이썬 기본 개념 정리

김지후·2022년 6월 29일
0
  • 파이썬의 지수 표현 방식(실수형) :
    a = 1e9
    print(a) # 1000000000.0 (10억)
    
    a = 75.25e1
    print(a) # 752.5
    
    a = 3954e-3
    print(a) # 3.954
  • 반올림 함수 : 컴퓨터는 실수를 정확하게 표현하지 못함. → 컴퓨터에서 소수점 값을 비교하는 상황에서는 반올림을 해서 비교해야 함 → 반올림 함수 round()를 사용해야 함 (인자 2개) → ex) round(123.456, 2) : 123.46 (123.456을 소수점 둘째 자리까지 반올림)
    a = 0.3 + 0.6
    print(a)
    
    if a == 0.9:
        print(True)
    else:
        print(False) #False 출력
    a = 0.3 + 0.6
    print(round(a, 4)) # 소수점 다섯째자리에서 반올림(소수점 넷째자리까지 나타냄) 코테에서 주로 소수점 다섯째자리에서 반올림하라 한다.
    
    if round(a, 4) == 0.9:
        print(True) #True 출력
    else:
        print(False)
  • 수 자료형 연산
    • / : 나눠진 결과를 실수형으로 처리한다. (7/3 == 2.3333333333)
    • // : 나눈 결과에서 몫만 얻고자 할 때 (7//3 == 2)
    • ** : 거듭제곱 연산자
  • 리스트 자료형
    • 리스트 선언 방법
      • a = list()
      • a = []
    • 크기가 N이고, 모든 값이 0인 1차원 리스트 초기화
      n = 10
      a = [0] * n
      print(a)
    • 리스트 슬라이싱
      a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
      print(a[1:4]) # 인덱스 1부터 인덱스 3까지 (인덱스 1이상 4미만)
    • 리스트 컴프리헨션 : 리스트를 초기화하는 방법 중 하나 (조건문과 반복문을 넣는 방식으로 리스트 초기화)
      • 0부터 19까지의 수 중에서 홀수만 포함하는 리스트
        array = [i for i in range(20) if i % 2 == 1]
        
        print(array)
        위와 동일한 코드
        array = []
        for i in range(20):
        	if i % 2 == 1:
        		array.append(i)
        
        print(array)
      • 1부터 9까지의 수의 제곱 값을 포한하는 리스트
        array = [i * i for i in range(1, 10)]
        
        print(array)
      • N X M 크기의 2차원 리스트 초기화
        n = 3
        m = 4
        array = [[0]*m for _ in range(n)]
        print(array)
        2차원 리스트를 초기화 할 때 쓰면 안되는 코드
        n = 3
        m = 4
        array = [[0] * m] * n
        print(array)
        # [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
        #문제 발생 지점
        array[1][1] = 5
        print(array)
        # [[0, 5, 0, 0], [0, 5, 0, 0], [0, 5, 0, 0]]
        #의도와는 다른 결과가 나옴(내부적으로 포함된 3개의 리스트가 모두 동일한 객체에 대한 3개의 레퍼런스로 인식된다.)
      • 리스트 관련 기타 메서드
        • append() : 리스트에 원소 하나를 삽입할 때 사용(시간 복잡도 O(1)) 리스트명.append(삽입할 값)
        • sort() : 정렬 기능 (시간 복잡도 O(NlogN))
          • sort() : 오름차순으로 정렬 리스트명.sort()
          • sort(reverse = True) : 내림차순으로 정렬 리스트명.sort(reverse=True)
        • reverse() : 리스트의 원소의 순서를 모두 뒤집어 놓는다. (시간 복잡도 O(N)) 리스트명.reverse()
        • insert() : 특정한 인덱스 위치에 원소를 삽입할 때 사용한다. (시간 복잡도 O(N)) 리스트명.insert(삽입할 위치 인덱스, 삽입할 값)
        • count() : 리스트에서 특정한 값을 가지는 데이터의 개수를 셀 때 사용한다.(시간 복잡도 O(N)) 리스트명.count(특정 값)
        • remove() : 리스트에서 특정한 값을 가진 값을 제거한다. 값을 가진 원소가 여러 개면 하나만 제거한다. (시간 복잡도 O(N)) 리스트명.remove(특정 값) 🧐특정한 값의 원소를 모두 제거하려면 어떻게 해야 할까?
          a = [1, 2, 3, 4, 5, 5, 5, 5]
          remove_set = {3, 5}
          
          result = [i for i in a if i not in remove_set] # 조건부 표현식
          print(result)
  • 문자열 초기화
    • 문자열 안에 “ 나 ‘를 넣는 방법
      • 문자열을 큰 따옴표로 구성 → 내부적으로는 작은 따옴표가 포함
        data = "Hello'g' World"
        print(data) # Hello'g' World 출력
      • 문자열을 작은 따옴표로 구성 → 내부적으로는 큰 따옴표가 포함
        data = 'Hello "g" World'
        print(data) #Hello "g" World 출력
      • \’ OR \” 방식 활용
        data = "hdd\"dd\'e"
        print(data) # hdd\"dd\'e 출력
  • 문자열 연산
    • 문자열 * n 형태
      a = "String"
      print(a*3) # StringStringString 출력
    • 문자열의 인덱싱과 슬라이싱 : 문자열은 내부적으로 리스트와 같이 처리된다.(문자열은 여러개의 문자가 합쳐진 리스트다.)
      a = "ABCDEF"
      print(a[2]) # 인덱싱
      print(a[2:4]) # 슬라이싱
  • 튜플 자료형
    • 튜플 자료형은 리스트와 동일하지만 다른 점이 딱 2가지다.
      • 튜플은 한 번 선언된 값을 변경할 수 없다.

      • 리스트는 대괄호[]를 사용하지만, 튜플은 소괄호()를 활용한다.

        a = (1, 2, 3, 4)
        print(a) # (1, 2, 3, 4) 출력
        print(a[3]) # 4 출력
        a[2] = 5 # 튜플은 값을 변경할 수 없다. 에러 메세지 발생
  • 사전 자료형 (dictionary) : 내부적으로 해시 테이블 구조이기 때문에 데이터의 검색 및 수정에 있어서 O(1)의 시간 복잡도를 가진다.
    • 사전 자료형 초기화
      data = dict()
      data['사과'] = 'Apple'
      data['바나나'] = 'banana'
      data['코코넛'] = 'coconut'
      
      print(data)
    • 사전 자료형에 특정 키를 가지는 데이터가 있는지 검사
      data = dict()
      data['사과'] = 'Apple'
      data['바나나'] = 'Banana'
      data['코코넛'] = 'Coconut'
      
      if '사과' in data:
          print("'사과'를 키로 가지는 데이터가 존재합니다")
    • keys() : 키 데이터만 뽑아서 리스트로 만들 때 쓰는 함수
      data = dict()
      data['사과'] = 'Apple'
      data['바나나'] = 'Banana'
      data['코코넛'] = 'Coconut'
      
      key_list = data.keys()
      
      print(key_list) # dict_keys(['사과', '바나나', '코코넛']) 출력
    • values() : 값 데이터만 뽑아서 리스트로 만들 때 쓰는 함수
      data = dict()
      data['사과'] = 'Apple'
      data['바나나'] = 'Banana'
      data['코코넛'] = 'Coconut'
      
      value_list = data.values()
      
      print(value_list) # dict_values(['Apple', 'Banana', 'Coconut'])
  • 집합 자료형
    • 집합 자료형의 초기화
      • 집합 자료형의 초기화 방법 1) set(리스트) 활용
        data = set([1, 1, 2, 3, 4, 5, 5])
        print(data) # {1, 2, 3, 4, 5} 출력
      • 집합 자료형의 초기화 방법 2) {} 활용
        data = {1, 1, 2, 3, 4, 5}
        print(data) # {1, 2, 3, 4, 5} 출력
    • 집합 자료형의 연산
      • | : 합집합, & : 교집합, - : 차집합
        a = set([1, 2, 3, 4, 5])
        b = set([3, 4, 5, 6, 7])
        
        print(a|b) # 합집합 {1, 2, 3, 4, 5, 6, 7}
        print(a&b) # 교집합 {3, 4, 5}
        print(a-b) # 차집합 {1, 2}
    • 집합 자료형과 관련된 함수
      • add() : 집합 데이터에 값을 추가할 때 쓰는 함수 (시간 복잡도 O(1))
        data = set([1, 2, 3])
        data.add(5)
        print(data) # {1, 2, 3, 5}
      • update() : 집합 데이터에 여러개의 값을 한꺼번에 추가하고자 할 때 쓰는 함수
        data = set([1, 2, 3])
        data.update([5, 5, 6, 7])
        print(data) # {1, 2, 3, 5, 6, 7}
      • remove() : 집합 데이터에서 특정 값을 제거하고자 할 때 쓰는 함수 (시간 복잡도 O(1))
        data = set([1, 2, 3])
        data.remove(3)
        print(data) # {1, 2}
  • 논리 연산자
    • X and Y : X와 Y가 모두 참(True)일 때 참(True)이다. (C++에서 &&)
    • X or Y : X와Y 중에 하나만 참(True)이어도 참(True)이다. (C++에서 ㅣㅣ)
    • not X : X가 거짓(False)일 때 참(True)이다.(C++에서 !)
    • X in 리스트 : 리스트 안에 X가 들어가 있을 때 참(True)이다.
    • X not in 리스트 : 리스트 안에 X가 들어가 있지 않을 때 참(True)이다.

[조건문]

  • pass : 조건문이 참이더라도 아무것도 처리하고 싶지 않을 때 pass문 사용(디버깅 과정에서 흔히 사용)
    score = 85
    
    if score >= 80:
        pass
    else:
        print('성적이 80점 미만입니다.')
        
    print("프로그램을 종료합니다.")
  • 조건문에서 실행될 소스코드가 한 줄인 경우, 굳이 줄 바꿈을 하지 않아도 됨
    score = 85
    
    if score >= 80: result = "Success"
    else: result = "Fail"
  • 조건부 표현식을 이용하면 if ~ else문을 한 줄에 작성할 수 있다.
    score = 85
    
    result = "Success" if score >= 85 else "Fail"

[반복문]

  • for문
    • for 변수 in [리스트 OR 튜플 OR 문자열] : in뒤에 오는 데이터에 포함되어 있는 모든 원소를 첫 번째 인덱스부터 차례대로 하나씩 방문한다(차례대로 변수에 들어감).
      list1 = [1, 2, 3]
      
      for i in list1:
          print(i)
          
      string = "stringgg"
      
      for i in string:
          print(i)
          
      tup = (1, 2, 3, 4, 5)
      
      for i in tup:
          print(i)
    • for i in range(1, 10) / for i in range(5)
      for i in range(1, 5):
          print(i) # 1, 2, 3, 4 출력
          
      for i in range(5): # ..리스트나 튜플의 원소를 첫 번째 인덱스부터 방문할 때 사용
          print(i) # 0, 1, 2, 3, 4 출력 

[함수]

  • 함수는 매개변수가 있을 수도 있고 없을 수도 있다.
  • 함수는 return문이 있을 수도 있고 없을 수도 있다.
  • 함수를 호출하는 과정에서 인자를 넘겨줄 때 파라미터의 변수를 직접 지정하여 값을 넣을 수 있다.
    def add(a, b):
        print('함수의 결과:', a + b)
        
    add(b = 3, a = 7) # 인자 a와 b를 각 각 지칭해서 값을 넣는다.
    # 이 경우 매개변수의 순서가 달라도 상관이 없다.
  • global 키워드 : 함수 안에서 함수 밖의 변수 데이터를 변경해야 하는 경우가 있다. global 키워드로 변수를 지정하면, 해당 함수에서는 지역 변수를 만들지 않고 함수 바깥에 선언된 변수를 ‘참조'하게 된다.
    a = 0
    
    def func():
        global a
        a += 1
        
    for _ in range(10):
        func()
        
    print(a) # 10출력
  • lambda(람다) 함수 : 특정한 기능을 수행하는 함수를 한 줄에 작성할 수 있다. (파이썬의 정렬 라이브러리를 사용할 때, 정렬 기준(key)을 설정할 때에도 자주 사용된다.
    print((lambda a, b : a + b)(2, 5)) # 7출력

[입출력]

입력

  • input() : 한 줄의 ‘문자열’을 입력 받음 (ENTER키가 입력될 때 까지)

  • input().split() : 한줄로 입력 받은 문자열을 공백을 기준으로 나눈 리스트로 바꿈

  • map(int, input().split()) : input().split()의 모든 원소들에 int()함수를 적용시킨다.

    • map(function, iterable) / map(함수, 반복가능한 자료형(리스트, 튜플))
      • map함수의 리턴 값은 map객체이므로 해당 자료형을 list 또는 tuple로 변경시켜줘야 한다.
  • list(map(int, input().split()) : 문자열을 띄어쓰기로 구분하여 숫자형 자료형의 리스트로 변환

  • 구분자가 줄바꿈(ENTER)이면 int(intput())을 활용하는 것이 바람직하다

  • 구분자가 공백(SPACE BAR)이면 list(map(int, input().split())을 사용하는 것이 바람직하다.

#구분자가 줄 바꿈일 때
n = int(input())
#구분자가 공백일 때
data = list(map(int, input().split()))

print(n)
print(data)
  • 공백(SPACE BAR)으로 값을 받는데, 데이터의 개수가 많지 않다면
n, m, k = map(int, input().split())
print(n, m, k)
  • 입력의 개수가 많은 경우에는 sys 라이브러리의 sys.stdin.readline() 함수를 사용한다.(속도가 빠름)
    • sys.stdin.readline()함수를 사용할 때는 rstrip()함수를 호출해야 한다. sys.stdin.readline()함수를 사용하면 엔터(ENTER)가 줄 바꿈 기호로 입력되는데, 이를 제거하려면 rstrip()함수를 사용해야 한다.
import sys

data = sys.stdin.readline().rstrip()
print(data)

출력

  • print(a, b) : 각 변수나 상수를 콤마(,)로 구분하여 매개변수로 넣을 수 있는데, 이 경우 각 변수가 띄어쓰기로 구분되어 출력된다.
a = 1
b = 3
print(a, b) # 1 3 출력(공백 있음)
  • print()는 기본적으로 출력 이후에 줄 바꿈을 수행한다. → print()를 사용할 때마다 줄이 변경된다.
a = 1
b = 3
print(a)
print(b)
# 1
# 3 출력
  • 문자열과 수를 함께 출력해야 하는 경우가 있다.

    • str()을 이용해서 수를 문자열로 바꿔주고 문자열끼리 더하는 ‘+’연산자를 사용한다.

      answer = 7
       print("정답은 " + answer + "입니다.") # str()을 사용하지 않으면 오류가 발생한다.
      answer = 7
       print("정답은 " + str(answer) + "입니다.") # 정답은 7입니다.
    • 각 변수를 (,)로 구분하여 출력한다. (이 경우 의도치 않은 공백이 삽입될 수 있음에 주의하자)

      answer = 7
       print("정답은 ", answer, "입니다.")# 정답은 7 입니다.
    • f-string 문법 : 문자열 앞에 ‘f’를 붙임으로써 사용할 수 있는데, 단순히 수를 중괄호({})안에 넣음으로써, 자료형의 변환 없이도 간단하게 문자열과 정수를 함께 넣을 수 있다.

      answer = 7
       print(f"정답은 {answer}입니다.") # 정답은 7입니다.

      주요 라이브러리의 문법과 유의점

      파이썬 표준 라이브러리 공식 문서 : https://docs.python.org/ko/3/library/index.html

  • 내장함수 : 별도의 import 명령어 없이 바로 사용할 수 있다.

    • sum() : 리스트와 같은 iterable 객체가 주어졌을 때, 모든 원소의 합을 반환한다.

      			result = sum([1, 2, 3, 4, 5])
      			print(result) # 15
    • min() / max(): 파라미터가 2개 이상 들어왔을 때 가장 큰 작은 값 / 큰 값을 반환한다.

      			result = min(1, 2 ,3, 4, 5)
      			print(result) # 1
      
      			result = max(1, 2, 3, 4, 5)
      			print(result) # 5
    • eval() : 수학 수식이 문자열 형식으로 들어오면 해당 수식을 계산한 결과를 반환한다.

       result = eval("(3 + 5) * 7")
        print(result)
    • sorted() : iterable 객체가 들어왔을 때, 정렬된 결과를 반환한다.(key속성으로 정렬 기준을 명시할 수 있다. / reverse 속성으로 정렬된 결과를 뒤집을지의 여부를 설정할 수 있다.)

      result = sorted([9, 1, 8, 5, 4])
       print(result) # [1, 4, 5, 8, 9]
       result = sorted([9, 1, 8, 5, 4], reverse = True)
       print(result) # [9, 8, 5, 4, 1]

      sorted함수의 key 속성 이용 예시 (튜플 활용)

      result = sorted([('홍길동', 35), ('이순신', 75), ('아무개', 50)], key=lambda x : x[1])
       print(result) # [('홍길동', 35), ('아무개', 50), ('이순신', 75)]

      리스트와 같은 iterable 객체는 sort()함수를 내장하고 있어서 굳이 sorted() 함수를 사용하지 않아도 된다.

      		data = [9, 1, 8, 5, 4]
      		data.sort()
      		print(data)
  • itertools : 모두 클래스이므로 객체 초기화 후 리스트 자료형으로 변환해야한다.

    • permutations (순열)
    • combinations (중복)
    • product (중복 순열)
    • combinations_with_replacement (중복 조합)
    from itertools import permutations, combinations, product, combinations_with_replacement
    
     data = ['A', 'B', 'C']
    
     result = list(permutations(data, 3)) # 3개 뽑음, 순열
     print(result)
    
     result = list(combinations(data, 2)) # 2개 뽑음, 조합
     print(result)
    
     result = list(product(data, repeat=2)) # 2개 뽑음, 중복 순열
     print(result)
    
     result = list(combinations_with_replacement(data, 2)) # 2개 뽑음, 중복 조합
     print(result)
     
     
  • heapq : 다양한 알고리즘에서 우선순의 큐의 기능을 구현할 때 사용

    • 파이썬의 힙은 최소 힙으로 구성되어 있으므로 단순히 원소를 넣었다가 빼는 것만으로도 시간 복잡도 O(NlogN)에 오름차순 정렬이 완료된다.
    import heapq
    
    def heapsort(iterable):
        h = []
        result = []
      
        for value in iterable:
            heapq.heappush(h, value)
          
        for _ in range(len(h)):
            result.append(heapq.heappop(h))
        return result
    
     result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
     print(result) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    • 파이썬에서는 최대 힙을 제공하지 않으므로 heapq라이브러를 이용해서 최대힙을 구현할 때는 원소의 부호를 임의로 변경하는 방식을 활용한다.
    import heapq
    
    def heapsort(iterable):
        h = []
        result = []
      
        for value in iterable:
            heapq.heappush(h, -value)
          
        for _ in range(len(h)):
            result.append(-heapq.heappop(h))
          
        return result
    
    print(heapsort([1, 3, 2, 6, 4, 8, 9])) # [9, 8, 6, 4, 3, 2, 1]
    
    
  • bisect : 이진 탐색을 쉽게 구현할 수 있도록 도와주는 라이브러리
    정렬된 배열에서 특정한 원소를 찾아야 할 때 매우 효과적으로 사용된다.

    • bisect_left(a, x) : 정렬된 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드 / O(logN)

    • bisect_right(a, x) : 정렬된 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드 / O(logN)

      from bisect import bisect_left, bisect_right
      
       a = [1, 2, 4, 4, 8]
       x = 4
       y = 3
      
       print(bisect_left(a, x)) # 2
       print(bisect_right(a, x)) # 4
      
       print(bisect_left(a, y)) # 2
       print(bisect_right(a, y)) # 2
    • bisect_left와 bisect_right 함수로 값이 특정 범위에 속하는 원소의 개수를 구할 수 있다.

    from bisect import bisect_left, bisect_right
    
     def count_by_range(a, left_value, right_value):
     right_index = bisect_right(a, right_value)
     left_index = bisect_left(a, left_value)
     return right_index - left_index
    
     a = [1, 2, 3, 3, 3, 3, 4, 4, 8, 9]
    
     print(count_by_range(a, 4, 4)) # 리스트 a에서 값이 4인 데이터의 개수 출력 (2)
    
     print(count_by_range(a, -1, 3)) # 리스트 a에서 [-1, 3]범위의 데이터의 개수 출력 (6)
     
     
  • collections : 유용한 자료구조를 제공하는 표준 라이브러리다. (deque / counter)

    • deque : 스택이나 큐의 기능을 모두 포함 / 연속적으로 나열된 데이터의 시작부분이나 끝부분에 데이터를 삽입하거나 삭제할 때 효과적

      • popleft() : 첫 번째 원소 제거, pop() : 마지막 원소 제거,

      • appendleft(x) : 첫 번째 인덱스에 원소x 삽입, append(x) : 마지막 인덱스에 원소x 삽입

      • 스택 : First In Last Out : append(), pop() 활용

      • 큐 : First In First Out : append(), popleft() 활용

      			from collections import deque
      
      			data = deque([2, 3, 4])
      			data.append(5)
      			data.appendleft(9)
      
      			print(data) # deque([9, 2, 3, 4, 5])
      			print(list(data)) # [9, 2, 3, 4, 5]
      
      			a = data.popleft()
      			data.pop()
      			print(list(data)) # [2, 3, 4]
      			print(a) # 9
       
  • Counter : 리스트와 같은 iterable 객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는지 알려준다.

    from collections import Counter
    
     counter = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
    
     print(counter['blue']) # 3
     print(counter['red']) # 2
     print(dict(counter)) # {'red' : 2, 'blue' : 3, 'green' : 1}
  • math : 수학과 관련된 라이브러리

     import math
     
     print(math.factorial(5)) # 120 출력
     print(math.sqrt(7)) # 7의 제곱근(2.6457513110645907) 출력
     print(math.gcd(21, 14)) # 21과 14의 최대공약수(7) 출력
     print(math.pi) # 파이(pi) 출력 (3.141592653589793)
     print(math.e) # 자연상수 e 출력 (2.718281828459045)
profile
JU KIM

0개의 댓글