Python 기본 grammar

Updated:

코딩테스트를 위한 파이썬 필수 분법에 대해 알아보자.

1.자료형

모든 프로그래밍은 결국 데이터를 다루는 행위이다. 자료형에 대한 이해는 프로그래밍의 길에 있어서의 첫걸음이라고 할 수 있다. 파이썬의 자료형으로는 정수형, 실수형, 복소수형, 문자열, 리스트, 튜플, 사전등이 있다. 파이썬의 자료형은 필수적으로 알아두어야 한다.

1.1 정수형

: 정수를 다루는 자료형 양의 정수, 음의 정수, 0이 포함된다. 코딩테스트에서 출제되는 많은 문제들은 정수형을 주로 다루게 된다.

#양의 정수
a=1000
print(a)

#음의 정수
a=-1
print(-1)

#0
a=0
print(a)

1.2 실수형

: 소수점 아래의 데이터를 포함하는 수 자료형. 파이썬에서는 변수에 소수점을 붙인 수를 대입하면 실수형 변수로 처리된다. 소수부가 0이거나, 정수부가 0인 소수는 0을 생략하고 작성할 수 있다.

#양의 실수
a=157.93
print(a)

a=5.
(5.0)

#음의 실수
a=-.7
(-0.7)

파이썬에서는 e나 E를 이용한 지수 표현 방식을 이용할 수 있다. E나 e 다음에 오는 수는 10의 지수부를 의미한다.

예를 들어 1e9라고 입력하게 되면, 10의 9제곱이 된다. 지수표현 방식은 임의의 큰 수를 표현하기 위해 자주 사용된다. 최단 경로 알고리즘에서는 도달할 수 없는 노드에 대하여 최단 거리를 무한(INF)로 설정하곤 한다. 이때 가능한 최대값이 10억 미만이라면 무한(INF)의 값으로 1e9를 이용할 수 있다.

1e9는 실수형 데이터이므로 정수형 데이터로 출력하고자 한다면 int(1e9) => 와 같이 처리해주면 된다.

오늘날 가장 널리 쓰이는 IEEE754표준에서는 실수형을 저장하기 위해 4바이트, 혹은 8바이트의 고정된 크기의 메모리를 할당하므로, 컴퓨터 시스템은 실수 정보를 표현하는 정확도에 한계를 가진다. 예를 들어, 10진수 체계에서는 0.3과 0.6을 더한 값이 0.9로 정확히 떨어진다.

하지만 2진수에서는 0.9를 정확히 표현할 수 있는 방법이 없다. 컴퓨터는 최대한 0.9와 가깝게 표현하지만, 미세한 오차가 발생한다.

이 한계를 극복하기 위해 즉, 제대로 원하는 결과값을 얻기 위해 이럴 때는 round()함수를 이용할 수 있으며, 이러한 방법이 권장된다. 예를 들어, 123.456을 소수 셋째 자리에서 반올림하려면 round(123.456,2)라고 작성 => 결과는 123.46

1.3 수 자료형의 연산

수 자료형에 대하여 사칙연산과 나머지 연산자가 많이 사용된다. 단, 나누기(/)연산자를 주의해야한다. 파이썬에서 나누기 연산자(/)는 나눠진 결과를 실수형으로 반환한다. 다양한 로직을 설계할 때 나머지 연산자(%)를 이용해야 할 때가 많다.
(예시 : a가 홀수인지 체크해야 하는 경우) 파이썬에서 몫을 얻기 위해 몫 연산자(//)를 사용한다. 이외에도 거듭 제곱 연산자(**)를 비롯해 다양한 연산자들이 존재한다.

#나누기
print(a/b)

#나머지
print(a%b)

#몫
print(a//b)

#거듭 제곱
print(a**b)

##제곱근
print(a**0.5)

1.4 리스트 자료형

여러개의 데이터를 연속적으로 담아 처리하기 위해 사용하는 자료형

  • 사용자 입장에서 c나 자바에서의 배열(Array)의 기능 및 연결리스트와 유사한 기능을 지원한다
  • c++의 stl vector와 기능적으로 유사하다.
  • 리스트 대신에 배열 혹은 테이블이라고 부르기도 한다.
  • 리스트는 대괄호([])안에 원소를 넣어 초기화하며, 쉼표(,)로 원소를 구분한다.
  • 비어 있는 리스트를 선언하고자 할 때는 list()혹은 간단히 []를 이용할 수 있다.
  • 리스트의 원소에 접근할 때는 인뎅스(index)값을 괄호에 넣는다.
  • 인덱스는 0부터 시작한다.
  • 리스트의 인덱싱과 슬라이싱
    인덱스 값을 입력하여 리스트의 특정한 원소에 접근하는 것을 인덱싱(indexing)이라 한다. 파이썬의 인덱스 값은 양의 정수와 음의 정수를 모두 사용할 수 있다. 음의 정수를 넣으면 원소를 거꾸로 탐색하게 된다.
    리스트에서 연속적인 위치를 갖는 원소들을 가져와야 할 때는 슬라이싱(Slicing)을 이용한다. 대괄호 안에 콜론(:)을 넣어서 시작 인덱스와 끝인덱스를 설정할 수 있다. 끝 인덱스는 실제 인덱스보다 1을 더 크게 설정한다.
  • 리스트 컴프리헨션 : 리스트를 초기화하는 방법 중 하나. 대괄호 안에 조건문과 반복문을 적용하여 리스트를 초기화 할 수 있다.
    array = [i for i in range(10)]
    #0부터 9까지의 수를 포함하는 리스트
    print(array)
    

    리스트 컴프리헨션은 2차원 리스트를 초기화 할 때 효과적으로 사용될 수 있다. 특히 N*M크기의 2차원 리스트를 한번에 초기화 해야 할 때 매유 유용하다.

    array = [[0]*m for _in range(n)]
    

    만약 2차원 리스트를 초기화 할 때 다음과 같이 작성하면 예기치 않은 결과가 나올 수 있다.

  • 잘못된 예시 : array=[[0]*m]*n
    위 코드는 전체 리스트 안에 포함된 각 리스트가 모두 같은 객체로 인식된다.

파이썬에서는 반복을 수행하되 반복을 위한 변수의 값을 무시하고자 할 때 언더바(_)를 사용한다.

1.5 문자열 자료형

문자열 변수를 초기화 할때는 큰따옴표(“)나 작은따옴표(‘)를 이용한다. 문자열 안에 큰따옴표나 작은따옴표가 포함되어야 하는 경우가 있다.

  • 전체 문자열을 큰따옴표로 구성하는 경우, 내부적으로는 작은따옴표를 포함할 수 있다.
  • 전체 문자열을 작은따옴표로 구성하는 경우, 내부적으로는 큰따옴표를 포함시킬 수 있다.
  • 혹은 백슬래시(\)를 사용하면, 큰따옴표나 작은따옴표를 원하는만큼 포함시킬 수 있다.
문자열 연산
  • 문자열 변수에 덧셈(+)을 이용하면 문자열이 더해져서 연결된다.
  • 문자열 변수를 특정한 양의 정수와 곱하는 경우, 문자열이 그 값만큼 여러 번 더해진다.
  • 문자열에 대해서도 마찬가지로 인덱싱과 스라이싱을 이요할 수 있다.
  • 다만 문자열은 특정 인덱스의 값을 변경할 수 없다.(Immutable)

1.6 튜플 자료형

튜플 자료형은 리스트와 유사하지만 다음과 같은 문법적 차이가 있다.

  • 튜플은 한번 선언된 값을 변경할 수 없다.
  • 리스트는 대괄호([])를 이용하지만, 튜플은 소괄호(())를 이용한다.
  • 튜플은 리스트에 비해 상대적으로 공간 효율적이다.

튜플을 사용하면 좋은점

  • 서로 다른 성질의 데이터를 묶어서 관리해야 할 떄
    최단 경로 알고리즘에서는 (비용,노드번호)의 형태로 튜플 자료형을 자주 이용한다.
  • 데이터의 나열을 해싱의 키 값으로 사용해야 할 때
    튜플은 변경이 불가능하므로 리스트와 다르게 키 값으로 사용될 수 있다.
    // 리스트는 변경이 가능하므로 키값으로 사용할 수 없다.
  • 리스트보다 메모리를 효율적으로 사용해야 할 때

1.7 사전 자료형

사전 자료형은 키와 값의 쌍을 데이터로 가지는 자료형.

  • 리스트나 튜플이 값을 순차적으로 저장하는 것과는 대비된다.
  • 사전자료형은 키와 값의 쌍을 데이터로 가지며, 원하는 ‘변경 불가능한 자료형’을 키로 사용할 수 있다.
  • 파이썬의 사전자료형은 해시 테이블을 이용하므로 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있따.
  • 사전자료형에서는 키와 값을 별도로 뽑아내기 위한 메서드를 지원한다. (키 데이터만 뽑아서 리스트로 이용할 때는 keys()함수를, 값 데이터만 뽑아서 리스트로 이용할 때는 values()함수를 이용한다.)

1.8 집합 자료형

집합 자료형은 다음과 같은 특징이 있다.

  • 중복을 허용하지 않는다.
  • 순서가 없다.

집합은 리스트 혹은 문자열을 이용해서 초기화 할 수 있다. 이때 set()함수를 이용한다.
혹은, 중괄호 ({})안에 각 원소를 콤마(,)를 기준으로 구분하여 삽임함을써 초기화 할 수 있다. 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있따.

집합자료형의 연산

  1. 합집합: 집합 A에 속하거나 B에 속하는 원소로 이루어진 집합(AUB)
  2. 교집합 : 집합 A에도 속하고 B에도 속하는 원소로 이루어진 집합.
  3. 차집합 : 집합 A의 원소 중에서 B에 속하지 않는 원소들로 이루어진 집합 (A-B)

사전자료형과 집합 자료형의 특징

  • 리스트나 뉴플은 순서가 있기 떄문에 인덱싱을 통해 자료형의 값을 얻을 수 있다.
  • 사전 자료형과 집합 자료형은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없다.
  • 사전의 키 혹은 집합의 원소를 이용해 O(1)의 시간 복잡도로 조회한다.

2. 기본입출력

  • 모든 프로그램은 적절한 입출력 양식을 가지고 있다.
  • 프로그램 동작의 첫번째 단계는 데이터를 입력받거나 생성하는 것이다.
  • 예시) 학생의 성적 데이터가 주어지고, 이를 내림차순으로 정렬한 결과를 출력하는 프로그램.
  • input()함수는 한 줄의 문자열을 입력 받는 함수.
  • map()함수는 리스트의 모든 원소에 각각 특정한 함수를 적용할 때 사용.
    ex)공백을 기준으로 구분되는 데이터를 입력받을때는 다음과 같이 사용. list(map(int,input().split())) ex)공백을 기준으로 구분된 데이터의 개수가 많지 않다면, 단순히 다음과 같이 사용. a,b,c = map(int,input().split())

빠르게 입력받기

  • 사용자로부터 입력을 최대한 빠르게 받아야 하는 경우가 있다.
  • 파이썬의 경우 sys라이브러리에 정의되어 있는 sys.stdin.readline()메서드를 이용한다.
  • 단, 입력 후 엔터(Enter)가 줄 바꿈 기호로 입력되므로 rstrip()메서드를 함께 사용한다.

자주 사용되는 표준 출력 방법

  • 파이썬에서 기본 출력은 print()함수 이용
  • 각 변수를 콤마(,)를 이용하여 띄어쓰기로 구분하여 출력할 수 있다.
  • print()는 기본적으로 출력 이후에 줄바꿈을 수행한다. 줄바꿈을 원치않는 경우 ‘end’속성 이용

f-string 문자열 앞에 접두사 ‘f’를 붙여 사용. 중괄호 안에 변수명을 기입하여 간단히 문자열과 정수를 함께 넣을 수 있다.

answer=7
print=(f"전답은 {answer}입니다")

3. 조건문

조건문은 프로그램의 흐름을 제어하는 문법. 조건문을 이용해 조건에 따라서 프로그램의 로직 설정.

들여쓰기

  • 파이썬에서는 코드의 블록을 들여쓰기로 지정.

아무것도 처리하고 싶지 않을 때 pass키워드 사용
ex) 디버깅 과정에서 일단 조건문의 형태만 만들어 놓고 조건문을 처리하는 부분은 비워놓고 싶은 경우.

조건부 표현식은 if~else문을 한줄에 작성할 수 있도록 해준다.

result="Success" if scord>=80 else "Fail"

다른 프로그래밍 언어와 다르게 파이썬은 조건문 안에서 수학의 부등식을 그대로 사용할 수 있다. 예를 들면 x>0 and x>20과 0<x<20은 같은 결과를 반환한다.

4. 함수

함수의 종류

  • 내장 함수 : 파이썬이 기본적으로 제공하는 함수.
  • 사용자 정의 함수 : 개발자가 직접 정의하여 사용할 수 있는 함수.

함수 정의하기
프로그램에는 똑같은 코드가 반복적으로 사용되어야 할 때가 많다. 함수를 사용하면 소스 코드의 길이를 줄일 수 있다.

  • 매개 변수 : 함수 내부에서 사용할 변수.
  • 변환값 : 함수에서 처리 된 결과를 반환.
    def 함수명(매개변수):  
      실행할 소스코드
      return 반환값
    

global 키워드 global 키워드로 변수를 지정하면 해당 함수에서는 지역 변수를 만들지 않고, 함수 바깥에 선언된 변수를 바로 참조하게 된다.

파이썬에서 함수는 여러 개의 반환 값을 가질 수 있다.

def operator(a,b):
	add_var=a+b
	subtract_var=a-b
	multiply_var=a*b
	divide_var=a/b
	return add_var, subtract_var, multiply_var, divide_var

a,b,c,d = operator(7,3)
print(a,b,c,d)

람다 표현식을 이용하면 함수를 간단하게 작성할 수 있다.

  • 특정한 기능을 수행하는 함수를 한 줄에 작성할 수 있다는 점이 특징.
    #람다 표현식으로 구현한 add()메서드
    print(lambda a,b:a+b)(3,7))  
    

예시1 : 내장 함수에서 자주 사용되는 람다 함수.

array=[('홍길동',50),('이순신',32),('아무개',74)]
def my_key(x):
	return x[1]

print(sorted(array,key=my_key))
print(sorted(array, key=lambda x:x[1]))

예시2 : 여러개의 리스트에 적용.

list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10]
result = map(lambda a,b:a+b, list1, list2)  

print(list(result))

5. 실전에서 융용한 표준 라이브러리

  • 내장함수 : 기본 입출력 함수부터 정렬 함수까지 기본적인 함수들을 제공.
    파이썬 프로그램을 작성할 때 없어서는 안되는 필수적인 기능을 포함하고 있다.
  • itertools : 파이썬에서 반복되는 형태의 데이터를 처리하기 위한 유용한 기능들을 제공
    특히 순열과 조합 라이브러리는 코딩 테스트에서 자주 사용된다.
  • heapq : 힙(heap)자료 구조를 제공 일반적으로 우선순위 큐 기능을 구현하기 위해 사용된다.
  • bisect : 이진 탐색기능을 제공
  • collections : 덱, 카운터 등의 유용한 자료구조를 포함
  • math : 필수적인 수학적 기능을 제공
    펙토리얼, 제곱근, 최대공약수, 삼각함수 관련 함수부터 파이와 같은 상수 포함

순열과 조합

  • 모든 경우의 수를 고려해야 할 때 어떤 라이브러리를 효과적으로 사용할 수 있을까요?
  • 순열 : 서로 다른 n개에서 서로다른 r개를 선택하여 일렬로 나열하는 것.
  • 조합 : 서로 다른 n개에서 순서에 상관 없이 서로 다른 r개를 선택하는 것.
  • itertools 모듈에서 permutation과 combinations를 import해서 사용해준다.
     permute = list(permutations(arr,2))
     combi = list(combinations(arr,2))
    

    파이썬 collections라이브러리의 counter는 등장 횟수를 세는 기능을 제공한다. 리스트와 반복가능한(iterable)객체가 주어졌을 때 내부의 원소가 몇번씩 등장했는지를 알려준다.

최대공약수와 최소공배수

  • 최대공약수를 구해야 할 때는 math라이브러리의 gcd()함수를 이용할 수 있다.

Reference

이것이 취업을 위한 코딩 테스트다 with 파이썬
참고하면 좋을 싸이트i

Leave a comment