SECTION 011. Python의 기초

1. Python의 기본 문법

  • 변수의 자료형에 대한 선언이 없다.
    – Python은 변수에 저장되는 값에 따라 자동으로 자료형이 지정된다.

  • 문장의 끝을 의미하는 세미콜론(;)을 사용할 필요가 없다.

  • 변수에 연속하여 값을 저장하는 것이 가능하다.
    – 예) x, y, z = 10, 20, 30

  • if나 for와 같이 코드 블록을 포함하는 명령문을 작성할 때, 코드 블록은 콜론(:)과 여백으로 구분한다.
    – 같은 수준의 코드는 반드시 동일한 여백을 가져야 한다.

  if a>b :
    print('a')
  else :
    print('b')

2. Python의 데이터 입출력 함수

1) input() 함수

  • input() 함수는 Python의 표준 입력 함수로, 키보드로 입력받아 변수에 저장하는 함수이다.
  • 입력되는 값은 문자열 로 취급되어 저장된다.

(1) 1개의 데이터 입력

  변수 = input('출력문자')

– ‘출력문자’는 생략이 가능하며, 변수는 사용자가 임의로 지정할 수 있다.
– 화면에 ‘출력문자’가 출력되고, 그 뒤에 커서가 깜빡이며 입력을 기다린다. 키보드로 값을 입력하고 ‘Enter’를 누르면 입력한 값이 변수에 문자열로 저장된다.

(2) 2개 이상의 데이터 입력

  변수1, 변수2, ... = input('출력문자').split('분리문자')

– 2개 이상의 값을 분리하여 입력받기 위해 사용한다.
– 화면에 ‘출력문자’가 표시되고, 입력받은 값을 ‘분리문자’를 기준으로 구분하여 각각 변수1, 변수2, …에 저장한다.
– ‘분리문자’를 생략하면 공백으로 값을 구분한다.

(3) 입력 값의 형변환

– input() 함수는 입력되는 값을 문자열로 저장하므로, 숫자로 사용하기 위해서는 형변환이 필요하다.

  • 입력받은 데이터가 1개일 때
  변수 = int(input())   // 정수로 변환
  변수 = float(input())  // 실수로 변환
  • 입력받은 데이터가 2개 이상일 때
    – map() 함수를 사용해야 한다.
  변수1, 변수2, ... = map(int, input().split())
  변수1, 변수2, ... = map(float, input().split())

2) print() 함수

(1) 형식 1

  print(출력값1, 출력값2, ..., sep = '분리문자', end = '종료문자')
  • 출력값 : 숫자, 문자, 문자열, 변수 등 다양한 값이나 식을 사용할 수 있다.
  • sep : 여러 값을 출력할 때, 값과 값 사이를 구분하기 위해 출력하는 문자
    – ‘분리문자’를 생략하는 경우 기본값은 공백 한 칸(‘ ‘) 이다.
  • end : 맨 마지막에 출력할 문자로, 생략할 경우 기본값은 줄 나눔(‘\n’) 이다.

(2) 형식 2

  print('서식 문자열'%출력값)
  print('서식 문자열'%(출력값1, 출력값2, ...))
  • ‘SECTION 003 데이터 입출력’ 에서 사용한 서식 문자열이 동일하게 적용된다.
    – 예) ‘%d’ : 정수형 10진수, ‘%s’ : 문자열
  • 출력값이 한 개인 경우 출력값의 괄호를 생략할 수 있다.

3. Python의 문자열

1) 사용법

  • Python에서 문자열은 작은따옴표(‘ ‘), 큰따옴표(“ “), 3개의 작은따옴표(‘’’ ‘’’), 3개의 큰따옴표(“”” “””) 로 묶어서 표현할 수 있다.
    – Python은 하나의 문자를 지정하는 char 자료형이 없기 때문에, 작은따옴표와 큰따옴표를 자유롭게 사용할 수 있다.

  • 문자열 내에 따옴표가 사용될 경우, 다른 따옴표로 전체 문자열을 묶는다.
    – 예) x = ‘ I’m tired ‘ → 문자열이 정상적으로 묶이지 않아 오류가 발생한다.
    – 예) x = “ I’m tired “ → 작은따옴표가 사용된 문자열이 큰따옴표로 묶여 정상적으로 저장된다.

  • 3개의 따옴표를 사용하면, 문자열 내에서 작은따옴표와 큰따옴표를 자유롭게 사용할 수 있다.
    – 예) x = ‘’’ I’m “tired” ‘’’ → 작은따옴표와 큰따옴표가 모두 포함된 문자열이 3개의 따옴표로 묶여 저장된다.

  • 제어문자를 사용할 수 있다.
    – ‘SECTION 003 데이터 입출력’ 에서 사용한 제어문자가 동일하게 적용된다.
    – 예) ‘\n’ : 줄바꿈, ‘\t’ : 일정 간격 띄움

2) 문자열의 주요 메소드

형식 내용
upper() 대문자로 변경한다.
- 예) ‘abc’.upper() → ABC
lower() 소문자로 변경한다.
- 예) ‘ABC’.lower() → abc
capitalize() 문자열 첫 글자는 대문자, 나머지는 모두 소문자로 변경한다.
- 예) ‘abcD EF’.capitalize() → Abcd ef
title() 각 단어의 첫 글자만 대문자로 변경한다.
- 예) ‘abcD EF’.title() → Abcd Ef
replace(값1, 값2) 문자열에서 ‘값1’을 찾아 ‘값2’로 교체한다.
- 예) ‘abcde’.replace(‘c’, ‘o’) → abode
split(값) ‘값’을 기준으로 문자열을 분리하여 리스트로 반환한다.
‘값’을 생략하면 공백(‘ ‘)으로 문자열을 분리한다
- 예) ‘ab-cd’.split(‘-‘) → [‘ab’, ‘cd’]
count(값) 문자열에서 ‘값’을 검색하여 ‘값’의 개수를 반환한다.
- 예) ‘aababc’.count(‘b’) → 2
find(값) 문자열에서 처음 검색되는 ‘값’의 위치를 반환한다.
‘값’을 찾지 못한 경우는 -1 을 반환한다.
- 예) ‘aababc’.find(‘b’) → 2
index(값) 문자열에서 처음 검색되는 ‘값’의 위치를 반환한다.
‘값’을 찾지 못한 경우는 오류가 발생한다.
- 예) ‘aababc’.index(‘b’) → 2
  • Python 에서 문자열 위치는 ‘0’ 부터 시작한다.

3) 문자열 Formatting - f-Strings

  • 문자열 Formatting 은 기존 변수에 저장된 값을 사용하여 문자열을 조정하는 것이다.
  • f-Strings 을 사용할 문자열 앞에는 f 또는 F 를 붙인다.

– 예제)

  name = 'abc'
  num = '10'
  x = f"Hello {name}, you're {num}th user"
  print(x)

– 실행결과)

Hello abc, you’re 10th user

4. 리스트(List)

1) 개념

  • C 와 Java 에서는 여러 요소들을 한 개의 이름으로 처리할 때 배열을 사용하고, Python 에서는 리스트를 사용한다.
    – Python 은 기본 자료형으로 배열 (Array) 을 제공하지 않는다.
  • 리스트는 필요에 따라 개수가 달라지기 때문에 리스트를 선언할 때 크기를 지정하지 않는다.
  • 배열과 달리 리스트는 정수, 실수, 문자열 등 다양한 자료형을 저장할 수 있다.
  • Python 에서 리스트의 위치는 ‘0’ 부터 시작한다.

2) 1차원 리스트

(1) 형식

  리스트명 = [ 값1, 값2, ... ]
  리스트명 = list([ 값1, 값2, ... ])
  • 리스트명은 사용자가 임의로 지정할 수 있으며, 리스트를 의미하는 대괄호 [] 사이에 저장할 값들을 쉼표(,)로 구분하여 입력한다.

– 예제)

  a = [ 10, 'mike', 23.45]
  a = list([ 10, 'mike', 23.45 ])

  # - 두 방법에 대한 결과는 동일하다.
  ''' a[0]    a[1]    a[2]
      10      mike    23.45
  '''

(2) 추가

  • append() : 리스트의 마지막에 값을 추가할 때 사용한다.

– 예제)

  a.append('B')
  # 리스트 a의 마지막에 'B'를 추가한다.
  ''' a[0]    a[1]    a[2]    a[3]
      10      mike    23.45   B
  '''

(3) 삽입

  • insert() : 리스트의 중간에 값을 삽입할 때 사용한다.

– 예제)

  a.insert(1, 777)
  # 리스트 a의 두 번째 자리(a[1])에 777을 추가한다.
  # 이후 요소들은 한 칸씩 뒤로 이동한다.
  ''' a[0]    a[1]    a[2]    a[3]    a[4]
      10      777     mike    23.45   B
  '''

(4) 삭제

  • del : 리스트의 위치를 기준으로 요소를 삭제한다.
  • remove() : 리스트의 값을 기준으로 요소를 삭제한다.

– 예제 1)

  del a[3]
  # 리스트 a의 네 번째 요소(23.45)를 삭제한다.
  # 이후 요소들은 한 칸씩 앞으로 이동한다.
  ''' a[0]    a[1]    a[2]    a[3]
      10      777     mike    B
  '''

– 예제 2)

  a.remove(777)
  # 리스트 a에서 값 777을 찾아 해당 요소를 삭제한다.
  # 이후 요소들은 한 칸씩 앞으로 이동한다.
  ''' a[0]    a[1]    a[2]
      10      mike    B
  '''

– 예제 3)

  del a
  # 리스트 a 자체를 삭제한다.

3) 2차원 리스트

  • 2차원 리스트는 리스트에 리스트를 저장하는 방식으로 구현한다.

(1) 형식 1

  리스트명 = [ [ 값1, 값2, 값3 ],
              [ 값4, 값5, 값6 ] ]

(2) 형식 2

  리스트A = [ 값1, 값2, 값3 ]
  리스트B = [ 값4, 값5, 값6 ]
  리스트명 = [ 리스트A, 리스트B ]

– 예제)

  b = [ [ 1,2,3 ], [ 'a', 'b', 'c' ] ]
  ''' b[0][0]  b[0][1]  b[0][2]
        1        2        3
      b[1][0]  b[1][1]  b[1][2]
        a        b        c
  '''

4) 리스트의 주요 메서드

형식 내용
pop(위치) 리스트의 ‘위치’에 있는 값을 출력하고, 해당 요소를 삭제한다.
- 예) [10, 11, 12].pop(11) → 11 출력 → [10, 12]
index(값) 리스트에서 ‘값’이 저장된 요소의 위치를 반환한다.
- 예) [10, 11, 12].index(12) → 2
count(값) 리스트에서 ‘값’이 저장된 요소의 개수를 반환한다.
- 예) [1, 0, 1, 0, 0].count(0) → 3
extend(리스트) 리스트의 끝에 새로운 ‘리스트’를 추가하여 확장한다.
- 예) [‘a’, ‘b’].extend(‘c’, ‘d’) → [‘a’, ‘b’, ‘c’, ‘d’]
reverse() 리스트의 순서를 역순으로 뒤집는다.
- 예) [1, 2, 3].reverse() → [3, 2, 1]
sort() 리스트를 정렬한다. 기본값은 오름차순이다.
reverse 속성을 이용하여 정렬 방식을 지정할 수 있다.
- True : 내림차순, False : 오름차순
- 예)
[2, 1, 3].sort() → [1, 2, 3]
[2, 1, 3].sort(reverse = True) → [3, 2, 1]
copy() 리스트를 복사한다.
- 예)
a = [1, 2, 3]
b = a.copy() → b = [1, 2, 3]
  • copy() 메서드를 사용하지 않고, b = a 와 같이 리스트를 복사하면, 두 개의 리스트가 같은 메모리를 공유하기 때문에, 한 쪽의 리스트가 수정되면 다른 한 쪽에도 반영된다. 따라서 리스트를 복사하여 별도의 자료 공간으로 사용하기 위해서는 copy() 메서드를 사용해야 한다.

5. Range

  • Range 는 연속된 숫자를 생성하는 것으로, 리스트, 반복문 등에서 많이 사용된다.

1) 형식

(1) range(최종값)

  • 0에서 ‘최종값-1’ 까지 연속된 숫자를 생성한다.

– 예제)

  a = list(range(5))
  # 0에서 4까지 연속된 숫자를 리스트 a에 저장한다.
  # 0, 1, 2, 3, 4

(2) range(초기값, 최종값)

  • ‘초기값’에서 ‘최종값-1’ 까지 연속된 숫자를 생성한다.

– 예제)

  a = list(range(4,9))
  # 4에서 8까지 연속된 숫자를 리스트 a에 저장한다.
  # 4, 5, 6, 7, 8

(3) range(초기값, 최종값, 증가값)

  • ‘초기값’에서 ‘최종값-1’ 까지 ‘증가값’만큼 증가하면서 숫자를 생성한다.
  • ‘증가값’이 음수인 경우, ‘초기값’에서 ‘최종값+1’ 까지 ‘증가값’만큼 감소하면서 숫자를 생성한다.

– 예제)

  a = list(range(1, 15, 3))
  # 1에서 14까지 3씩 증가하는 숫자들을 리스트 a에 저장한다.
  # 1, 4, 7, 10, 13

  a = list(range(9, 4, -1))
  # 9에서 5까지 -1씩 감소하는 숫자들을 리스트 a에 저장한다.
  # 9, 8, 7, 6, 5

6. 슬라이스 (Slice)

  • 슬라이스는 문자열이나 리스트와 같은 순차형 객체에서 일부를 잘라 반환하는 기능히다.

1) 형식

(1) 객체명[초기위치:최종위치]

  • ‘초기위치’에서 ‘최종위치-1’ 까지의 요소들을 가져온다.

(2) 객체명[초기위치:최종위치:증가값]

  • ‘초기위치’에서 ‘최종위치-1’ 까지 ‘증가값’만큼 증가하면서 해당 위치의 요소들을 가져온다.
  • ‘증가값’이 음수인 경우, ‘초기위치’에서 ‘최종위치+1’ 까지 ‘증가값’만큼 감소하면서 해당 위치의 요소들을 가져온다.

2) 인수 생략

  • 슬라이스는 일부 인수를 생략하여 사용할 수 있다.

(1) 객체명[:] 또는 객체명[::]

  • 객체의 모든 요소를 반환한다.

(2) 객체명[초기위치:]

  • 객체의 ‘초기위치’에서 마지막 위치까지의 요소들을 반환한다.

(3) 객체명[:최종위치]

  • 객체의 0번째 위치에서 ‘최종위치-1’ 까지의 요소들을 반환한다.

(4) 객체명[::증가값]

  • 객체의 0번째 위치에서 마지막 위치까지 ‘증가값’만큼 증가하면서 해당 위치의 요소들을 반환한다.

3) 예제

(1) 예제 1

  a = ['a', 'b', 'c', 'd', 'e']

  a[1:3]  ['b', 'c']
  # 객체의 1번째 위치에서 2번째 위치까지의 요소들을 가져온다.

  a[0:5:2]  ['a', 'c', 'e']
  # 객체의 0번째 위치에서 4번째 위치까지 2만큼 증가하면서 해당 위치의 요소들을 가져온다.

  a[3:]  ['d', 'e']
  # 객체의 3번째 위치에서 마지막 위치까지의 요소들을 반환한다.

  a[:3]  ['a', 'b', 'c']
  # 객체의 0번째 위치에서 2번째 위치까지의 요소들을 반환한다.

  a[::3]  ['a', 'd']
  # 객체의 0번째 위치에서 마지막 위치까지 3만큼 증가하면서 해당 위치의 요소들을 가져온다.

(2) 예제 2

  a = 'sinagong'
  print(a[3:7])
  # agon

  a = list(range(10))
  print(a[:7:2])
  # a = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  # [0, 2, 4, 6]

  a = 'hello, world'
  print(a[7:])
  # world

  a = list(range(5, 22, 2))
  print(a[::3])
  # a = 5, 7, 9, 11, 13, 15, 17, 19, 21
  # [5, 11, 17]

  a = list(range(8))
  print(a[2::2])
  # a = 0, 1, 2, 3, 4, 5, 6, 7
  # [2, 4, 6]

  a = list(range(8, 3, -1))
  print(a[:3])
  # a = 8, 7, 6, 5, 4
  # [8, 7, 6]