테크 로그포스 Tech Log Force
파이썬 문법(자료형, 입출력) 본문
▶실수형 표기
. 만 붙이면 저절로
a = 5.
b = .7
print하면 5.0 과 0.7로 출력 됨
▶ e또는 E를 이용한 지수표기
숫자e^지수 = 숫자*10^지수 (숫자 x 10의 N제곱)
예를 들어 1e9는 1*10^9 = 1,000,000,000(10억)
가령, 그래프 알고리즘 등에서 임의이 큰 수를 무한(INF)로 설정할 때, 가능한 최댓값이 10억 미만이라면 INF = 1e9 로 표기하는 등 이용한다.
이건 실수형 데이터이므로 정수형 데이터로 처리해야하는 상황(혹은 실수연산 오차 막고자 할때)이면 a = int(1e9) 이런식으로 형변환 해주면 된다.
▶ round()
파이썬은 IEEE754표준. 실수형 정보를 표현할 때 정확하지 않다.
0.3 + 0.6을 0.9로 가지지 못하고 0.89999999로 처리하는 것.
이를 해결하기 위해 round()사용. 특정 자릿수에서 반올림이 가능
123.456을 셋째 자리에서 반올림 => round(123.456, 2)로 작성.
셋째 자리에서 반올림 == 2째 자리까지 표시 => round(123.456, 2)
▶ 연산자
나누기 (/) 결과를 실수형으로 반환(즉, 정확하지 않을 가능성)
몫 연산자(//)
거듭제곱 연산자(**)
- List(table, array의 역할도 함)
array의 기능 + linked list와 유사한 기능 지원
append(), remove()가능
#배열 초기화 & 배열 전체 출력
a = [1,2,3,4,5]
print(a)
=>[1,2,3,4,5]
#4번째 원소 출력(인덱싱)
print(a[3])
=>4
# 크기가 N, 모든 값이 0인 1차원 리스트 초기화
n = 3
a = [0] * n
=>[0,0,0]
▶ 인덱싱 Indexing(특정 원소 접근)
음의 정수로도 접근 가능(거꾸로 탐색)
a = [1,2,3,4,5,6,7,8,9]
print(a[7])
=>8
print(a[-1])
=>9
print(a[-3])
=>7
▶슬라이싱 Slicing(연속적인 위치를 갖는 원소 접근)
대괄호 안에 콜론(:) 넣어서 시작인덱스, 끝 인덱스 설정
끝 인덱스는 실제 인덱스보다 1 더 크게 설정.
a = [1,2,3,4,5,6,7,8,9]
#index 1부터 3까지 (2번째 원소~4번째 원소까지)
print(a[1 : 4])
=>[2,3,4]
리스트에서 일부분을 추출 가능한 것.
▶ 리스트 컴프리헨션
대괄호 안에 조건문/반복문을 넣음으로써 리스트를 초기화 하는 방법
arr = [i for i in range(10)]
print(arr)
=>[0,1,2,3,4,5,6,7,8,9]
#0~19까지 홀수만 포함하는 리스트
arr = [i for i in range(20) if i % 2 == 1]
print(arr)
=>[1,3,5,7,9,11,13,15,17,19]
#2부터 9 까지 수들의 제곱 값을 포함하는 리스트
arr = [i * i for i range(2,10)]
print(arr)
=>[4,9,16,25,36,49,64,81]
▶리스트 관련 메서드
append() | 리스트에 원소 하나 삽입 | O(1) |
sort() | 오름차순 정렬. 내림차순은 sort(reverse=True) | O(NlogN) |
reverse() | 원소 순서를 모두 뒤집음 | O(N) |
insert() | 특정 위치에 원소 삽입 | O(N) |
count() | 특정 값을 가지는 데이터 개수 | O(N) |
remove() | 특정 값을 갖는 원소 제거.(여러개면 하나만 제거) | O(N) |
▶ 문자열 자료형
덧셈연산으로 이어붙이고, 곱셉연산으로 여러번 이어붙일 수 있다.
인덱싱과 슬라이싱이 가능하지만, 값을 변경할수는 없다.(가져올수만 있다)
▶ 튜플 자료형
리스트와 유사. 다만 튜플은 한 번 선언된 값 변경 불가.
소괄호() 사용, 리스트보다 공간 효율적. (값 변경 등 기능이 제한적이므로)
튜플이 유용한 경우 |
1. 서로 다른 성질의 데이터를 묶어 관리할 때(학번&등수 등 string과 int를 묶어야 한다면 ) |
2. Hashing의 키 값으로 사용할 때(변경이 불가능하다는 특징에 따라) |
3. 메모리를 더 효율적으로 사용해야 할 때 |
▶ 사전 자료형
키&값 쌍을 데이터로 가짐.
리스트/튜플이 값을 순차적으로 저장하고 인덱스로 접근했던 것(순차적 저장)과 달리, 얘는 키 값으로 원소 접근.
파이썬에서 이 자료형은 내부적으로 Hash Table을 이용함. 따라서 데이터 조회&수정 시간복잡도가 O(1) => 리스트보다 훨씬 빠름
data = dict()
data['키'] = '값'
data['사과'] = 'apple'
data['바나나']='banana'
if '사과' in data:
print('사과를 key로 가지는 value가 존재합니다.')
data = dict()
data['키'] = 'value'
data['사과'] = 'apple'
data['바나나']='banana'
print(data.keys())
print(data.values())
for i in data.keys():
print(data[i])
a = {
'홍길동':24,
'왕감자':12,
'김철수':42
}
print(a)
▶ 집합 자료형
중복 허용X, 순서X
리스트나 문자열을 이용해서 초기화 가능.(set()함수 사용)
data = set([1,1,2,3,3,3,4,5])
print(data) #중복 제거된 모습.
=> {1,2,3,4,5}
혹은 중괄호 사용해서 초기화
data = {1,1,2,3,4,5,5}
print(data)
=>{1,2,3,4,5}
합집합, 교집합, 차집합 연산 가능
#집합 2개 초기화
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([값1, 값2, 값3])
원소 지울때는 remove(값)
리스트 | 튜플 | 사전 자료형 | 집합 |
인덱싱 가능 | 순서X, 인덱싱 불가. 시간복잡도 O(1) |
▶ 기본 입출력
input() | 한 줄의 문자열을 입력받음 |
map() | 리스트의 모든 원소에 각각 특정한 함수를 적용 |
예) list(map(int, input().split()))
=> <input()을 공백 기준으로 split>한 것을 리스트로 생성. 리스트의 모든 원소에 int()로 형변환
예) a, b, c = map(int, input().split())
=> 데이터 적어서 굳이 리스트까지 안 만들어도 될 때
- 빠른 입력 방법
import sys 하여 sys.stdin.readline() 사용.
단, 입력 후 엔터가 줄 바꿈 기호로 입력되므로, rstrip()를 함께 사용해서 제거
import sys
#문자열 입력 받기
data = sys.stdin.readline().rstrip()
print(data)
▶ 표준 출력 방법
기본 출력은 print()이며 이는 출력 후 줄 바꿈 수행. 줄바꿈 원하지 않으면 end속성을 바꿔주면 됨.
각 변수는 콤마(,)를 이용해 띄어쓰기하여 출력 가능
a = 1
b = 2
print(a, b) # 콤마 이용해 a와 b를 띄워쓰기해 출력
=> 1 2
print(7, end=" ") # end속성 이용해 줄바꿈이 아닌 " "를 넣도록
print(e, end=" ")
answer = 7
print("정답은 " + str(answer) + "입니다.") # 문자열과 정수를 직접 더하기연산 안 되므로 정수answer을 str()함수 통해 문자열로 변환
=> 7 8 정답은 7 입니다.
▶ f string
특정 문장을 더 간단하게 출력
문자열 앞에 접두사 f를 붙여 사용
ans = 7
print(f"정답은 {ans}입니다.")
=>정답은 7입니다.
직전 예제처럼 굳이 정수를 문자열로 바꿔주고 할 필요가 없다.
출처
https://www.youtube.com/watch?v=m-9pAwq1o3w&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC