Python 기초 - 2

Dictionary

  • key와 value가 한 쌍

  • hash로 구현(대응 관계)

  1. Basic

    • key:value로 입력

    • 중괄호 사용

      1
      dic = {'a': 1, 'b': 2, 'c': 3}
    • 새로운 값을 삽입

      1
      2
      3
      dic['e'] = 4
      dic
      >> {'a': 1, 'b': 2, 'c': 3, 'e': 4}
    • 기존 값 변경이 가능

      1
      2
      3
      dic['a'] = 20
      dic
      >> {'a': 20, 'b': 2, 'c': 3, 'e': 4}
    • 변경이 불가능한 객체를 key로 사용

    • key 값은 변경이 가능한 객체로 사용 불가능(unhashable)

      1
      2
      3
      4
      5
      6
      7
      dic[(1, 2, 3)] = 50
      dic
      >> {'a': 20, 'b': 2, 'c': 3, 'e': 4, (1, 2, 3): 50}


      dic[[5, 6, 'a']] = 60 # 변경이 가능한 객체를 키로 사용 불가능
      >> TypeError: unhashable type: 'list'
  2. 관련 함수들

    1
    dir(dic)
    1
    2
    # dictionary 예시
    dic = {'a' : 1, 'b' : 2, 'c' : 3}

    1) search 계열

    • get() : key로 value 얻기

    • key가 없는 값을 불러오면 에러가 발생하지만, get()을 사용하면 None을 반환

      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
      30
      31
      32
      33
      34
      35
      36
      37
      dic.get('c')
      >> 3

      print("dic.get('e') : ", dic.get('e'))
      >> dic.get('e') : None
      print("dic['e'] : ", dic['e'])
      >> KeyError: 'e'

      if dic.get('e'):
      print(dic['e'])
      else:
      print('No data') # dic.get('e') = None이므로 if문이 실행하지 않음
      >> No data

      try:
      print(dic['e'])
      except KeyError:
      print('No data') # try except문을 사용
      >> No data

      # key 값이 없을 경우, get(key, default_value)를 사용하여 default 값을 대신 가져옴
      dic.get('e', 2)
      >> 2

      # for문을 사용할 경우, key 값만 가져옴
      for i in dic:
      print(i, end = ' ')
      >> a b c

      # items()를 사용할 경우, key와 value 모두를 가져옴
      for pair in dic.items():
      print(pair, end = ' ') # tuple 형태
      >> ('a', 1) ('b', 2) ('c', 3)

      for key, value in dic.items():
      print(key, value, end = ' ') # tuple 형태로 가져오지 않음
      >> a 1 b 2 c 3

      2) delete 계열

    • pop() : 원하는 key의 value를 반환하고 삭제

    • popitems() : 임의의 key와 value를 반환하고 삭제

      1
      2
      3
      4
      5
      6
      7
      8
      9
      dic.pop('b')
      >> 2
      dic
      >> {'a': 1, 'c': 3}

      dic.popitem()
      >> ('c', 3)
      dic
      >> {'a': 1}

      3) insert 계열

    • update() : key가 있으면 원하는 value로 바꾸고 key가 없으면 추가

    • setdefault() : 원하는 key의 value를 찾아 반환

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      dic = {'a' : 1, 'b' : 2, 'c' : 3}

      dic.update({'b':40, 'd':50})
      dic
      >> {'a': 1, 'b': 40, 'c': 3, 'd': 50}

      # tuple을 사용하면 dictionary 안에서는 key와 value로 넣어줌
      c = (('e', 11), ('f', 12))
      dic.update(c)
      dic
      >> {'a': 1, 'b': 40, 'c': 3, 'd': 50, 'e': 11, 'f': 12}

      dic = {'a' : 1, 'b' : 2, 'c' : 3}
      dic.setdefault('b')
      >> 2

      # setdefault()는 key가 없을 경우, default 값으로 새로운 요소 추가
      dic.setdefault('e', 10)
      >> 10
      dic
      >> {'a': 1, 'b': 2, 'c': 3, 'e': 10}

      4) view 객체 사용

      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
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      dic = {'a' : 1, 'b' : 2, 'c' : 3}

      # keys()를 사용하여 key에 관한 view 객체 반환
      # list 형변환을 사용하여 list로 사용 가능
      key_view = dic.keys()
      key_view
      >> dict_keys(['a', 'b', 'c'])

      key_list = list(dic.keys())
      key_list
      >> ['a', 'b', 'c']

      # values()를 사용하여 value에 관한 view 객체 반환
      # list 형변환을 사용하여 list로 사용 가능
      value_view = dic.values()
      value_view
      >> dict_values([1, 2, 3])

      value_list = list(dic.values())
      value_list
      >> [1, 2, 3]

      # 요소 값을 추가할 경우, view 객체는 변경됨
      # list 형변환을 통해 대입해준 list 변수는 변하지 않음
      dic['d'] = 4

      key_view
      >> dict_keys(['a', 'b', 'c', 'd'])
      value_view
      >> dict_values([1, 2, 3, 4])

      key_list
      >> ['a', 'b', 'c']
      value_list
      >> [1, 2, 3]

      # list 형변환을 다시 해줘야 한다.
      list(dic.keys())
      >> ['a', 'b', 'c', 'd']

      # 대입해준 list는 여전히 변하지 않는다.
      key_list
      >> ['a', 'b', 'c']

      dic
      >> {'a': 1, 'b': 2, 'c': 3, 'd': 4}

for 문

  • 반복문
  1. Basic

    • iterable 객체(순회하는 객체) 이용 가능

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      li = [1, 2, 3]
      for a in li:
      print(a, end = ' ')
      >> 1 2 3

      tu = (1, 2, 3, 'a')
      for t in tu:
      print(t, end = ' ')
      >> 1 2 3 a

      string = 'abcde'
      for ch in string:
      print(ch, end = ' ')
      >> a b c d e
    • range(start, end, step) : 범위 끝은 포함하지 않음

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      for num in range(1, 11):
      print(num, end = ' ')
      >> 1 2 3 4 5 6 7 8 9 10

      for num in range(1, 11, 2):
      print(num, end = ' ')
      >> 1 3 5 7 9

      for num in range(11):
      print(num, end = ' ')
      >> 0 1 2 3 4 5 6 7 8 9 10
  2. List Comprehension

    • for문을 이용한 list 생성

      1
      2
      3
      4
      5
      li = []
      for i in range(1, 11):
      li.append(i)
      li
      >> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    • 리스트 컴프리헨션을 통한 list 생성

      1
      2
      3
      4
      # i 값에 연산도 가능하다.
      li2 = [i for i in range(1, 11)]
      li2
      >> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  3. Dictionary Comprehension

    1
    2
    3
    4
    # 튜플 속의 튜플 선언
    tu = (('a', 1), ('b', 2), ('c', 3), ('d', 4))
    tu
    >> (('a', 1), ('b', 2), ('c', 3), ('d', 4))
    • for문을 이용한 dictionary 생성

      1
      2
      3
      4
      5
      dic = {}
      for k, v in tu:
      dic[k] = v
      dic
      >> {'a': 1, 'b': 2, 'c': 3, 'd': 4}
    • 딕셔너리 컴프리헨션을 통한 dictionary 생성

      1
      2
      3
      4
      # v 값에 연산도 가능하다.
      dic2 = {k : v for k, v in tu}
      dic2
      >> {'a': 1, 'b': 2, 'c': 3, 'd': 4}

while 문

  • 반복문

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # a가 5보다 클 경우 반복
    # a가 7일 경우 break문을 통해 빠져나감
    # 'a = a - 1'은 'a -=1'로 사용 가능
    a = 10

    while a > 5:
    print(a, end = ' ')
    if a == 7:
    break
    a -= 1
    >> 10 9 8 7

Boolean

  1. Basic

    • 0 이외에 모든 정수가 참이다.

    • 할당할 때는 ‘=’, 비교할 때는 ‘==’

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      a = True # 참
      b = False # 거짓

      a = 10
      if a == 10:
      print('a == 10')
      >> a == 10

      # else if = elif
      if a > 10:
      print('a > 10')
      elif a < 10:
      print('a < 10')
      else:
      print('a == 10')
      >> a == 10

      a == 10
      >> True

      a < 10
      >> False
  2. python에서 False로 간주하는 객체

    • False, None, 빈 문자열, 빈 리스트, 빈 튜플, 빈 딕셔너리, 공집합(set())

    • not을 사용하여 반대 선언 가능

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      li = []
      if not li:
      print('True')
      >> True

      tu = ()
      if not tu:
      print('True')
      >> True

      dic = {}
      if not {}:
      print('True')
      >> True

      not False
      >> True

Operator

  1. 논리 연산자

    • AND : 모두 참일 때 빼고는 다 거짓

    • OR : 모두 거짓일 때 빼고는 다 참

      1
      2
      3
      4
      5
      True and True
      >> True

      False or False
      >> False
    • 맨 마지막에 참조하는 객체를 반환

    • [1, 2] or [] 에서는 이미 [1, 2]에서 참 거짓 판단이 끝났으므로, 뒤 []까지 보지 않음

    • [1, 2] and []에서는 [1, 2]가 참이면 뒤에까지 봐야하므로 뒤까지 보고 판단

    • [] and [1, 2]일 경우 이미 앞에서 거짓이므로 거짓 판단

    • [1, 2] and [3, 4]이면 앞이 참이고 뒤에도 참이므로 뒤를 출력(마지막 참조 객체)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      [1, 2] and []
      >> []

      [1, 2] or []
      >> [1, 2]

      [1, 2] or [3, 4]
      >> [1, 2]

      [] or [3, 4]
      >> [3, 4]
  2. 비트 연산자

    • AND : &

    • OR : |

      1
      2
      3
      4
      5
      bin(0b1010 & 0b1100)  # AND
      >> '0b1000'

      bin(0b1010 | 0b1100) # OR
      >> '0b1110'
    • XOR(EXCLUSIVE OR)

    • 서로 다르면 참, 서로 같으면 거짓

      1
      2
      bin(0b1010 ^ 0b1100)
      >> '0b110'
    • 비트 이동 연산자(Shift Operator)

    • 꺾여있는 방향으로 이동

      1
      2
      3
      4
      5
      1 << 1
      >> 2

      10 >> 1
      >> 5
  3. 산술 연산자

  • +, -, /, //, *… 등등

    • 실수형 나누기

      1
      2
      10 / 3
      >> 3.3333333333333335
    • 정수형 나누기

      1
      2
      10 // 3
      >> 3
    • 제곱 표현

      1
      2
      2**52 # 2의 52승
      >> 4503599627370496
    • 나머지 구하기

      1
      2
      3
      a = 8 % 3
      a
      >> 2

Function

  • routine, subroutine, proceduce, function
  1. 함수 정의

    • 전역 변수(global variable) : global frame에 쌓인다.

    • 지역 변수(local variable) : 함수가 호출되고 stack frame이 생길때 생기고 함수가 끝나면 사라진다.

    • 함수 선언 시, 들여쓰기 공백은 4칸으로 4의 배수로만 띄워주면 문제없다.

      1
      2
      3
      4
      5
      a = 10 # 전역 변수
      b = 20 # 전역 변수
      def func(c,d):
      e = c + d # 지역 변수
      return e
  2. 함수 호출

    • 함수가 호출되는 시점이 바로 stack frame이 생성되는 시점이다.

      1
      2
      func(a, b)
      >> 30
  3. namespace

    • 변수의 유효 범위를 namespace 기반으로 결정

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      # 전역 변수 g_val은 global frame에 생성
      # stack frame이 생성되는 시점은 func(g_val)이 실행될 때
      # def func(val) 부분이 생성 시점이 아님
      # 함수가 호출됨으로 인해 매개변수 val은 120을 가리킴
      # 하지만 전역 변수 g_val은 20으로 변하지 않음

      g_val = 20

      def func(val):
      val += 100

      func(g_val)
      g_val
      >> 20
    • global문을 사용하여 func() 내에서 전역 변수 수정 가능

      1
      2
      3
      4
      5
      6
      7
      def func():
      global g_val
      g_val += 30

      func()
      g_val
      >> 50
    • namespace 개념을 통해 ‘이름 공간’에서 가장 가까운 변수에 접근

    • nonlocal문을 사용하면 함수에서 가장 가까운 해당 변수에 접근할 수 있다.

    • nonlocal문으로 지정해주지 않아도 가장 가까운 해당 변수에 접근한다.

    • 가장 가까운 변수에 접근하게 되면 그 이상의 공간 변수로 접근하지 않는다.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      # 변수 b와 같은 경우, 전역 변수와 지역 변수 모두 아니다.

      a = 10

      def outer():
      b = 100
      def inner1():
      b = 30
      def inner2():
      nonlocal b
      b -= 10
      print(b)
      d = 40
      inner2()
      inner1()
      print(b)
      outer()

      >> 20
      100

Algorithm

  • bubble_sort(거품 정렬)

    • Comparson sort의 한 종류

    • 두 수를 비교해서 정렬하는 방법

    • 마지막 전 자료와 마지막 자료를 비교하여 교환하면서 자료를 정렬

    • 한번 순회가 끝나면 가장 큰 자료가 맨 뒤로 이동

    • 2번째 순회에서는 맨 끝에 잇는 자료는 정렬에서 제외되는 방식

    • 순회할 때마다 정렬에서 제외되는 데이터가 하나씩 늘어남

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      li = [5, 2, 9, 3, 8, 4]

      def bubble_sort(li):
      n = len(li)
      for i in range(n - 1):
      for j in range(n - 1 - i):
      if li[j] > li[j+1]:
      li[j], li[j + 1] = li[j + 1], li[j]

      bubble_sort(li)
      li
      >> [2, 3, 4, 5, 8, 9]
  • python에서의 두 변수 값 바꾸기(swap)

    • 보통 임시로 저장할 변수를 이용하여 바꿈

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      a = 10
      b = 20

      temp = a

      a = b
      b = temp

      print(a, b)
      >> 20 10
    • python에서는 한 줄로 바꾸기 가능

      1
      2
      3
      4
      5
      6
      a = 10
      b = 20

      a, b = b, a
      print(a, b)
      >> 20 10
Share