[Python] 기본 문법 정리 (2)

6 분 소요

얼마전 인터넷으로 ‘이것이 취업을 위한 코딩테스트다’ 서적을 구매해서 공부한거 정리

1. 자료형


1.1 실수형 변수 선언

(0생략, 간소화 선언 방법)
ex)

a = 2.
# 2.0

a = -.7
# -0.7


지수표현방식 이용 (e)
ex)

a = 1e9
#1000000000.0 (정수부분 0갯수 9개, 1e^9-> 1*10^9)

a = 75.25e1
#752.5 (75.25*10^1)
#e가 양수일경우 : 오른쪽(->)으로 점 n번이동

a = 3954e-3
#3.954
#e가 음수일경우 : 왼쪽(<-)으로 점 n번 이동


round() 함수

  • 보통의 컴퓨터 시스템에서는 실수 처리시 Floating-point(부동소수점) 방식을 이용하고, 실수형 저장시에 4 byte 혹은 8 byte 메모리를 할당해서 실수 표현시에 정확도가 떨어짐

  • 0.3 + 0.6 = 0.899999999999999 로 저장이됨. 2진수에서는 0.9를 정확히 표현할수 있는 방법이 없기 때문에 오차발생.

  • 때문에 round() 함수를 이용해서 반올림을 해주어야함.

ex)

a = 0.3 + 0.6
print(round(a, 4))
# 0.9
# round(반올림할 값, 반올림할 자리수-1)


수 자료형 연산

a = 7
b = 3

# 나머지 연산
c = a % b     #결과 : c->1

# 몫
c = a // b    #결과 : c->2

# 거듭제곱 연산
c = a ** b    #결과 : c-> 343 (7^3)



1.2 리스트 자료형

리스트 선언
ex)

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[4]) #결과 : 5

#빈 리스트 선언 방법1
a = list()

#빈 리스트 선언 방법2
a = []

#뒤에서 첫번째 원소 출력
print(a[-1]) #결과 : 9

#뒤에서 세 번재 원소 출력
print(a[-3]) #결과 : 7

#두 번째 원소부터 네 번째 원소까지 출력 (슬라이싱)
print(a[1 : 4]) #결과 : [2, 3, 4]
#[시작 : 끝 인덱스-1]


리스트 컴프리헨션

  • 대괄호 안에 조건문과 반복문을 넣어서 리스트를 초기화 하는 방법
  • [넣을변수(변수이용 식도 가능), 반복문or조건문]
  • [i*i …. 반복문… 조건문] -> append(i*i)

ex)

# 0부터 19까지의 수 중에서 홀수만 포함하는 리스트

# 방법1 (리스트 컴프리헨션 이용)
array = [i for in range(20) if i % 2 == 1]
#1, 3, 5, 7, 9, 11, 13, 15, 17, 19

# 방법2
array = []
    for i in range(20):
        if i % 2 == 1:
            array.append(i)
#1, 3, 5, 7, 9, 11, 13, 15, 17, 19


# 1부터 9까지의 수의 제곱 값을 포함하는 리스트
array = [i * i for i in range(1, 10)]
#ragne() 함수 -> ragne(시작값, 끝 값+1)

# N * M 크기의 2차원 리스트 초기화
n = 4
m = 4
list = [[0] * m for _ in range(n)]
# list = [value]*n -> 크기가 n인 리스트 초기화 방법
# 반복문에서 _ 역할 -> for _ in range(5) 처럼 변수 필요없을때, 즉 더미 변수 사용하고 싶을때 씀

print(list)
#[[0, 0, 0, 0,], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]


# 리스트 컴프리헨션 사용하지 않고 N * M 2차원 리스트 초기화 (같은 참조값을 갖음)
list = [[0] * m] * n

print(list)
#[[0, 0, 0, 0,], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

arra[1][1] = 5
print(array)
# [[0, 5, 0, 0,], [0, 5, 0, 0], [0,5, 0, 0], [0, 5, 0, 0]]
# 3개의 리스트가 같은 참조 주소값을 가져서 셋다 동시에 바뀜


리스트 관련 함수

함수명 설명 시간 복잡도
append() 리스트 끝에 원소삽입 O(1)
reverse() 리스트의 원소 순서 뒤집음 O(N)
insert() 특정 위치에 원소 삽입 (*append 보다 느림) O(N)
remove() 특정값 원소 제거, 여러개 중복시 하나만 제거 O(N)


*특정값의 원소를 리스트에서 모두 제거하려면 따로 코드상으로 구현해야된다. remove_all()같은 함수가 없음.

ex)

list = [1, 2, 3, 4, 5, 6, 7]
remove = {4, 6}

# remove_set에 포함되지 않은 값만을 저장
# i는 for i in list 인데, i가 remove 에 포함되지 않을때 append(i)
result = [i for i in list if i not in remove]
#result -> [1, 2, 3, 5, 7]



1.3 문자열

ex)

#이스케이프 문자 \ 사용 (큰따음표 ""기입가능)
string = "\"python\""
print(string)
# "python"

string = "test"
print(string *3)
# testtesttest

a = "ABCDEF"
print(a[2 : 4])
# CD
# index 2~3 까지 출력



1.4 튜플

  • 한번 선언되면 값 변경 불가
  • 소괄호 사용. ( )

ex)

tuple = (1, 2, 3, 4, 5)
print(tuple)

tuple[1] = 4
#값 변경시 컴파일 에러 (한번 값 설정하면 변경불가)



1.5 사전

  • key, value 쌍으로 데이터를 가지는 자료형.
  • 변경 불가능한 값을 key 값으로 사용 가능함.
  • 해시 테이블(Hash Table)을 사용함.
  • 시간복잡도는 O(1)

ex)

num = dict()
num["one"] = 1
num["two"] = 2
num["three"] = 3
# num -> {'one' : 1, 'two' : 2, 'three' : 3}

# in 문법. (iterable 자료형 모두 사용가능)
# iterable 자료형 -> 리스트, 문자열, 튜플, 사전
if 'one' in num :
    print("true")
# 해당 key 값을 갖은 데이터가 존재하는지 확인

print(num.keys())
# dict_keys(['one', 'two', 'three'])
# keys()함수 -> key값만 뽑아옴

print(num.values())
# dict_values(['1', '2', '3'])
# values()함수 -> value 값만 뽑아옴

1.6 집합 (수학에서 말하는 집합 자료형)

  • 중복값 허용 x (중복값으로 선언해도 하나의 값만 들어간다.)
  • 순서 x
  • 특정 원소가 존재하는지 확인하는 연산의 시간복잡도는 O(1)
  • 주로 특정한 데이터가 이미 등장한 적이 있는지 여부를 확인하기 위해서 사용

ex)

#집합 자료형 초기화 방법 1
data = set([1, 1, 2, 3, 4, 4, 5])
print(data) #{1, 2, 3, 4, 5}

#집합 자료형 초기화 방법 2
data = {1, 1, 2, 3, 4, 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() - 원소 추가
#update() - 원소 여러개 추가
#remove() - 특정값 원소 삭제

a.add(6) #{1,2,3,4,5,6}
a.remove(6) #{1,2,3,4,5}
a.update(7,8) #{1,2,3,4,5,7,8}


2. 조건문 (생략)

  • x in 리스트 (리스트에 x가 포함되면 TRUE)
  • x not in 리스트 (리스트에 x가 포함되지 않으면 TRUE)
  • 조건부 표현식 (result = “Success” if score >= 80)
  • 부동식 사용
    if 0 < x < 30:
    print (“x는 0 초과, 30미만의 숫자”);


3. 반복문 (생략)

  • continue (반복문의 처음으로 돌아감)



4. 함수

함수 작성 예시

def 함수명(매개변수):
    실행할 소스코드
    return 반환 


def add(a, b):
    print('함수의 결과:', a+b)

add(b=3, a=3)


#함수 안에서 global 키워드 사용시에 지역변수가 만들어지지 않고 함수 바깥 변수를 참조하게 됨

a = 0

def func():
    global a
    a += 1

for i in range(10):
    func()

print(a) #10

#람다 표현식사용
print((lambda a, b: a + b)(3, 7)) #10




5. 입출력

5.1 입력 input()

  • 입력받은 문자열을 띄어쓰기로 구분하여 각각 숫자 자료형으로 리스트에 저장하는 방법
  • input() 을 이용하여 입력받음
  • split() 을 이용하여 공백으로 나뉘는 리스트로 변환
  • map() 을 이용하여 해당 리스트의 모든 원소에 int() 함수 적용
  • list() 를 이용하여 각각의 숫자 자료형을 리스트에 저장
# 첫번째 입력은 데이터의 갯수
# 두번째 입력은 학생 성적을 받아서
# 내림차순으로 출력하는 예시

# 데이터의 갯수 입력
n = int(intput())

# 각 데이터를 공백으로 구분하여 입력
data = list(map(int, input().split()))

data.sort(reverse = True)

print(data)


# n, m, k를 공백으로 구분하여 입력
n, m, k = map(int input().split())
#3, 5, 7 입력


print(n, m, k) #3, 5, 7


  • 입력의 갯수가 많을 경우에는 sys.stdin.readline() 함수 사용

  • 입력후 엔터키가 줄바꿈 기호로 입력되기 때문에 rstrip() 함수를 이용해서 공백 문자를 제거해야됨

import sys

# 문자열 입력
data = sys.stdin.readline().rstrip()
print(data)



map() 함수

  • 첫번째 매개변수-> 함수
  • 두번째 매개변수-> 이터레이블 객체
  • 이터레이블 모든 요소를 함수의 매개변수로 차례대로 넣어서 그 결과값을 리스트로 반환
  • 맵 객체는 변수 여러개에 저장을 동시에 할 수 있음
>>> a = [1.2, 2.5, 3.7, 4.6]
>>> a = list(map(int, a))
>>> a
[1, 2, 3, 4]



a, b = map(int, input().split())
## ---> 풀어서 쓰면 다음과 같이 됨

x = input().split()    # input().split()의 결과는 문자열 리스트
m = map(int, x)        # 리스트의 요소를 int로 변환, 결과는 맵 객체
a, b = m               # 맵 객체는 변수 여러 개에 저장할 수 있음



5.2 출력 print()

  • int형 변수 + 문자열 하면 에러 발생
    ex) print(“구입하신 항목은” + number + “개 입니다.”)

  • str() 함수를 이용하여 츨력하고자 하는 변수를 문자형으로 형변환 해야됨.
    ex) print(“구입하신 항목은” + str(number) + “개 입니다.”)
  • 혹은 컴마(,) 로 변수를 구분해줘야 됨
    ex) print(“구입하신 항목은”, number , “개 입니다.”)
  • f-string 문법 사용시 간편하게 변수 출력가능 (f와 중괄호 {} 로 표현)
    ex) print(f”구입하신 항목은 {number} 입니다.”)