728x90
파이썬 기초 문법
코딩테스트 언어를 파이썬으로 결정하면서 문법에 대해 짚고 넘어가고 싶었다.
해당 포스팅은 이것이 코딩 테스트다 with 파이썬의 저자, 나동빈님의 유튜브 강의를 들으며 개인적으로 정리한 내용이다.
알기 쉽게 강의해주셔서 듣기 편했고 궁금한 점이 바로 해결되어 좋았다.
강의 링크는 아래에 첨부한다.
출력
- print()는 기본적으로 출력 이후에 줄 바꿈을 수행
- f-string: 문자열 앞에 접두사 f를 붙여 사용, 중괄호 안에 변수명을 기입하여 간단히 문자열과 정수를 함께 넣을 수 있음
print("Hello World")
#fstring
answer = 7
print(f"정답은 {answer}")
입력
- input() 한 줄의 문자열을 입력 받는 함수
- map() 리스트의 모든 원소에 각각 특정한 함수를 적용할 때 사용
- 사용자로부터 입력을 최대한 빠르게 받아야 하는 경우 sys.stdin.readline(), 엔터가 줄바꿈기호로 입력되므로 rstrip() 메서드를 함께 사용(이진탐색, 정렬 등에서 사용)
#공백을 기준으로 구분된 데이터 입력받을때
a= list(map(int, input().split()))
#공백을 기준으로 구분된 데이터 개수가 많지 않다면
a,b,c = map(int, input().split())
#데이터 개수
n = int(input())
import sys
data = sys.stdin.readline().rstrip()
자료형
변수의 타입을 확인하는 방법 : type 키워드
- 정수형: 0, 양의 정수, 음의 정수
- 실수형: 변수에 소수점을 붙인 수를 대입하면 실수형 변수로 처리됨, 소수점 앞뒤로 0 생략 가능
- 지수 표현 방식: E나 e 다음에 오는 수는 10의 지수부를 의미
- 1e9 = 10의 9제곱
- 최단 경로 알고리즘에서 도달할 수 없는 노드에 대하여 최단 거리를 무한(INF)로 설정, 가능한 최댓값이 10억 미만이라면 무한(INF)의 값으로 1e9를 이용할 수 있음
- format(N, 'b') = 이진수로 변환
- 실수형 사칙연산 비교 = True/False 하면 False나옴
- round(변수, 소수몇째자리까지) 함수 반올림
- 파이썬에서 나누기 연산자(/)는 나눠진 결과를 실수형을 반환
- 다양한 로직을 설계할 때 나머지 연산자(%)를 이용(홀수인지 체크할 때)
- 몫을 얻기 위해 몫 연산자(//)를 사용
- 거듭 제곱 연산자(**) 제곱근을 구할 때는 **0.5
- 리스트 자료형: 여러 개의 유사한 데이터를 연속적으로 담아 처리하기 위해 사용하는 자료형, 배열 및 연결 리스트와 유사한 기능, 배열 혹은 테이블이라고 부름
- 초기화는 [], 혹은 list()
- 모든 원소를 0으로 초기화 → a = [0] * n(길이)
- 인덱싱: 특정한 원소에 접근, -1을 넣으면 뒤에서부터 첫번째 원소 출력
- 슬라이싱: [-1]은 마지막 문자를 반환, 범위 지정하여 출력하고 싶은 경우 [시작 인덱스:종료 인덱스](종료 인덱스는 실제 인덱스보다 1을 더 크게 설정)
- 리스트 컴프리헨션: 대괄호 안에 조건문과 반복문을 적용하여 리스트를 초기화하는 방법
- 2차원 리스트를 초기화할 때 효과적으로 사용
- N*M 크기의 2차원 리스트를 한 번에 초기화 할 때 유용 ex) array =[[0]*m for _ in range(n)]
- 반복을 수행하되 반복을 위한 변수의 값을 무시하고자 할 때 언더바(_)를 사용
a = [1,2,3,4] #두번째 원소부터 네번째 원소까지 =[2,3,4] print(a[1:4]) #리스트 컴프리헨션 #0부터 9까지 수를 포함하는 리스트 array = [i for i in range(10)] #0부터 19까지의 수 중에서 홀수만 포함하는 리스트 array = [i for in range(20) if i % 2 == 1] #1부터 9까지 수들의 제곱 값을 포함하는 리스트 array = [i*i for in range(1,10)] #N*M 크기의 2차원 리스트를 한 번에 초기화 할 때 유용 n = 4 m = 3 array =[[0] * m for _ in range(n)] #길이가 m인 array를 n개 복사한거임(주소값이 같아서 같은 객체로 인식) array =[[0]*m]*n #5번 출력하기 for _ in range(5): print("a") #리스트의 길이를 알 때 각 요소를 변수로 만들어 줄 수 있음 list_num = [1,2,3] first, second, third = list_num
- 리스트 관련 메서드
함수명 | 사용 | 설명 | 시간복잡도 |
append() | 변수명.append() | 리스트에 원소를 하나 삽입할 때 사용 | O(1) |
sort() | 변수명.sort() /.sort(reverse=True) | 오름차순 정렬 / 내림차순 정렬 | O(NlogN) |
reverse() | 변수명.reverse() | 리스트의 원소의 순서를 모두 뒤집어 놓음 | O(N) |
insert() | 변수명.insert(삽입할 위치 인덱스, 삽입할 값) | 특정한 인덱스 위치에 원소를 삽입할 때 사용 | O(N) |
count() | 변수명.count(특정 값) | 리스트에서 특정한 값을 가지는 데이터의 개수를 셀 때 사용 | O(N) |
remove() | 변수명.remove(특정 값) | 특정한 값을 갖는 원소를 제거하는데, 값을 가진 원소가 여러 개면 하나만 제거 | O(N) |
pop() | 변수명.pop() | 리스트의 맨 마지막 요소를 리턴하고 그 요소는 삭제한다 | O(N) |
#리스트에서 특정 값을 가지는 원소 모두 제거
a = [1,2,2,3,3,4,5,6]
remove_set={2,3} #집합 자료형
#remove_list에 포함되지 않은 값만을 저장
result = [i for i in a if i not in remove_set]
튜플 : 리스트와 유사하지만 한 번 선언된 값을 변경할 수 없음
- 소괄호()를 이용하여 초기화
-
#리스트에서 특정 값을 가지는 원소 모두 제거 a = [1,2,2,3,3,4,5,6] remove_set={2,3} #집합 자료형 #remove_list에 포함되지 않은 값만을 저장 result = [i for i in a if i not in remove_set]
튜플 : 리스트와 유사하지만 한 번 선언된 값을 변경할 수 없음
- 소괄호()를 이용하여 초기화
- 리스트에 비해 상대적으로 공간 효율적
- 서로 다른 성질의 데이터를 묶어서 관리해야 할 때
- 최단 경로 알고리즘에서는 (비용, 노드 번호)의 형태로 튜플 자료형을 자주 사용
- 데이터의 나열을 해싱의 키 값으로 사용해야 할 때
- 튜플은 변경이 불가능하므로 리스트와 다르게 키 값으로 사용될 수 있음
- 리스트보다 메모리를 효율적으로 사용해야 할 때
문자열
- 초기화 할 때 “ 나 ‘를 이용
- 전체 문자열이 “” 일때 내부적으로 ‘ 포함 가능
- 전체 문자열이 ‘’ 일때 내부적으로 “포함 가능
- 혹은 백슬래시(\)를 사용하면 “,’ 원하는 만큼 포함 가능
- 덧셈, 곱셈 가능
- 인덱싱, 슬라이싱은 가능하나 변경은 불가능
a="hello"
b="world"
# hello world
print(a+" "+b)
# hellohellohello
print(a * 3)
# l
print(a[2])
print(f"Hello {a} {b}")
문자열 자르기
[-1]은 마지막 문자를 반환
범위 지정하여 출력하고 싶은 경우 [시작 인덱스:종료 인덱스]
a = "Hello"
print(a[0])
print(a[1:3])
print(a[2:]) #2부터 끝까지
문자열 포맷팅 format() 메서드
a = "My name is {}".format("Hong gildong")
print(a)
#실행결과
My name is Hong gildong
b = 'temp {}'.format("1, 2, 3")
print(b)
#실행결과
temp 1, 2, 3.14
c = "{0} x {1} = {2}".format(1, 2, 1*2)
print(c)
#실행결과
1 x 2 = 2
d = "{} x {} = {}".format(1, 2, 1*2)
print(d)
#실행결과
1 x 2 = 2
문자열 메서드
upper() | 문자열 전체를 대문자로 변경 |
count(찾을 문자 혹은 문자열) | 문자열안에 찾을 개수 반환 |
index(찾을 문자 혹은 문자열) | 찾을 글자의 위치 반환 |
len(문자열) | 문자열의 전체 길이를 반환 |
lower() | 문자열 전체를 소문자로 변경 |
strip() | 양쪽 공백 제거 |
lstrip() | 왼쪽 공백 제거 |
rstrip() | 오른쪽 공백 제거 |
replace(바꿔야 할 글자, 바꿀 글자) | 문자열 치환시 사용 |
split(구분자) | 문자열을 나누기 : 구분자를 기준으로 결과 반환, 구분자가 없으면 공백을 기준으로 하여 리스트로 반환 |
join() | 문자열 합치기 |
사전(dictionary) 자료형: 키와 값의 쌍을 데이터로 가지는 자료형
- 원하는 ‘변경 불가능한 자료형’을 키로 사용 가능
- 해시 테이블을 이용하므로 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리
- 순서가 없기 때문에 인덱싱 불가
data = dict()
#사과는 key, apple은 값
data['사과'] = 'apple'
data['바나나'] = 'banana'
data = {
'age' = 12,
'alive' = True
}
#키 데이터만 뽑아서 리스트로 이용(형변환 안 하면 사전키라는 객체임)
key_list = list(data.keys())
#값 데이터만 뽑아서 리스트로 사용
val_list = data.values()
집합(set) 자료형: 중복 허용하지 않고 순서가 없음
- 리스트 혹은 문자열을 이용해 초기화, set() 함수 이용
- 중괄호 안에 원소를 ,를 기준으로 구분하여 초기화 가능
- 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리
- 순서가 없기 때문에 인덱싱 불가
#{1,2,4,5}
a = set([1,1,2,4,5])
b = set([2,4,6,8])
#합집합
print(a|b)
#교집합
print(a&b)
#차집합
print(a-b)
#새로운 원소 추가
a.add(7)
#새로운 원소 여러개 추가
a.update([8,9])
#특정한 값을 갖는 원소 삭제
a.remove(2)
조건문
x = 5
if x>= 10:
print("x >= 10")
elif x < 0:
print("x < 0")
else:
break
#조건부 표현식
score = 88
result ="sucess" if score >= 85 else "fail"
반복문
- while / for문
- continue : 남은 코드의 실행을 건너뛰고 다음 반복을 진행하고자 할 때
i = 0
result = 0
#while
while i <= 9:
if i%2 == 1:
result += i
i += 1
#for 변수 in 리스트:
data = [1,2,3]
for i in data:
print(i)
#연속적인 값을 차례대로 순회할 때 range()
# range(시작 값, 끝 값+1), 하나만 넣으면 시작값이 0
# 1~9까지
for i in range(1, 10):
print(i)
#중첩반복문, 구구단 예제
for i in range(2,10):
for j in range(1,10):
print(i, "x", j, "=", i*j)
들여쓰기
- 탭 / 공백문자 4개
논리연산자
- x and y : 모두 참일 때 참
- x or y : 하나만 참이어도 참
- not x : 거짓일 때 참
기타연산자
- 리스트, 튜플, 문자열, 딕셔너리에서 모두 사용 가능
- x in 리스트
- x not in 문자열
pass 키워드
- 아무것도 처리하고 싶지 않을 때 pass 키워드 사용
함수
def
def gugudan(m):
... for n in range(1, 10):
... print(f'{m} * {n} = {m*n}')
#user_name의 디폴트값 정의
def say_hello(user_name="anonymous"):
print("hello", user_name)
- global 키워드로 변수를 지정하면 해당 함수에서는 지역 변수를 만들지 않고, 함수 바깥에 선언된 변수를 바로 참조하게 됨
반환 값
#패킹한다고 함
def operator(a,b):
add_var = a+b
sub_var = a-b
mul_var = a*b
div_var = a/b
return add_var, sub_var, mul_var, div_var
a,b,c,d = operator(3,5)
print(a,b,c,d)
람다 표현식
- 특정한 기능을 수행하는 함수를 한 줄에 작성
- 예시: 내장 함수, 여러개의 리스트에 적용
#람다 표현식으로 구현한 add()
print((lambda a, b: a + b)(3,7))
#내장함수에서 사용
#점수를 기준으로 오름차순 정렬
array = [('홍길동',100),('이순신',50),('장보고',30)]
def my_key(x):
return x[1]
print(sorted(array, key=my_key)
print(sorted(array, key=lambda x: x[1]))
#여러 개의 리스트에 적용
list1 =[1,2,3,4,5]
list2 =[6,7,8,9,10]
#두 리스트의 값을 더해서 출력
result = map(lambda a,b: a+b, list1, list2)
실전에서 유용한 표준 라이브러리
- 내장 함수
#sum()
#min(), max()
#eval() 수식의 결과를 수로 반환해줌
#sorted() 리스트 정렬
#sorted( ,key=) 키를 기준으로 정렬(람다를 많이 사용한다)
- itertools: 반복되는 형태의 데이터를 처리하기 위한 유용한 기능 (순열, 조합)
- 순열: 서로 다른 n개에서 서로 다른 r개를 선택하여 일렬로 나열하는 것
- A,B,C 3개⇒ ABC ACB BAC BCA CAB CBA
from itertools import permutations data = ['A', 'B', 'C'] #데이터 준비 result = list(permutaions(data,3)) # 모든 순열 구하기 ##중복순열 from itertools import product data = ['A', 'B', 'C'] #데이터 준비 result = list(product(data,repeat=2)) # 2개를 뽑는 모든 순열 구하기(중복허용)
- 조합: 서로 다른 n개에서 순서에 상관 없이 서로 다른 r개를 선택하는 것
- A,B,C 2개⇒ AB AC BC
from itertools import combinations data = ['A', 'B', 'C'] #데이터 준비 result = list(combinations(data,2)) # 모든 조합 구하기 ##중복조합 from itertools import combinations_with_replacement data = ['A', 'B', 'C'] #데이터 준비 result = list(combinations_with_replacement(data,2)) # 2개를 뽑는 모든 조합 구하기(중복허용)
- 순열: 서로 다른 n개에서 서로 다른 r개를 선택하여 일렬로 나열하는 것
- heapq: 힙 자료구조를 제공, 우선순위 큐 기능 구현
- bisect: 이진 탐색(binary search) 기능
- collections: 덱, 카운터 등의 자료구조를 포함
- math: 팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수, 파이 등 포함
#Counter 리스트와 같은 반복 가능한 객체가 주어졌을때 내부 원소 등장 횟수를 세는 기능
from collections import Counter
counter = Counter(['A', 'B','B','B','B', 'C', 'C']
print(counter['C'])
print(dict(counter)) #사전 자료형으로 반환 {'A':1, 'B':4, 'C':2}
import math
#최소공배수
def lcm(a,b):
return a*b // math.gcd(a,b)
#최대공약수
print(math.gcd(21,14))
728x90
'💻dev > 🐍Python' 카테고리의 다른 글
Python | 파이썬 웹 스크래퍼 만들기 - 04 (0) | 2023.03.09 |
---|---|
Python | 파이썬 웹 스크래퍼 만들기 - 03 (0) | 2023.03.05 |
Python | 파이썬 웹 스크래퍼 만들기 - 02 (0) | 2023.03.04 |
Python | 웹 크롤링이랑 웹 스크래퍼 뭔 차이임? (0) | 2023.03.04 |
Python | 파이썬 웹 스크래퍼 만들기 - 01 (0) | 2023.03.04 |