[코테][Python] 파이썬 문법 정리 2편

SkinnY·2022년 1월 18일
2

파이썬

목록 보기
2/2
post-thumbnail

_함덕 해수욕장, 서우봉 해바라기

💻💻💻

 

  제가 보려고 정리하는 파이썬 문법 두 번째 게시글입니다. 주로 실질적으로 코딩에서 사용되는 문법 위주로 정리를 하려 하니, 두서가 없을 수 있습니다. 혹시 틀린 부분이 있거나 알려주고 싶은 꿀팁이 있으시면 댓글로 알려주세요.

  이번 게시글도 나동빈 님의 '이것이 취업을 위한 코딩 테스트다 with 파이썬'이라는 책을 참고하여 작성하였습니다.


1. 문자열 자료형

- 문자열 초기화

  문자열 변수를 초기화 할 때는 큰따옴표(")나 작은따옴표(')를 이용합니다. 문자열 안에서 특수문자 중 큰따옴표나 작은 따옴표를 쓰고 싶다면, 사용 문자와 초기화용 따옴표 종류를 겹치지 않게 하거나, 백슬래시()를 사용하면 가능합니다.

data1 = 'Hello World'
print('data1 is .. : ', data1)
#print할 문자열을 직접 적어서 출력할 수 있다. 
#여러 변수를 콤마로 입력하면 줄바꿈 없이 이어서 출력된다.

data2 = "Don't you know \"Python\"?"
print('data2 is .. : ', data2)
data1 is .. :  Hello World
data2 is .. :  Don't you know "Python"?
#큰따옴표로 초기화한 문자열 변수에서는 백슬래쉬(\) 없이 작은따옴표를 사용할 수 있다.

- 문자열 연산

  파이썬은 문자열에 대해서 덧셈(+)과 정수 곱셈(*)을 사용하여 연산을 진행할 수 있다. 파이썬의 문자열은 내부적으로 리스트와 같이 처리된다. 1편에서 살펴보았던 리스트의 인덱싱과 슬라이싱을 문자열에 대해서도 이용할 수 있다.

a = 'Hello'
b = 'World!'
print(a + " " + b)

c = "Voca"
print( c * 3 )

d = "ABCDE"
print(d[2:4])
Hello World!
VocaVocaVoca
CD

2. 문자열의 문자 변경

  파이썬에서는 문자열의 일부 문자를 리스트와 같이 변경할 수 없습니다. 직관적으로 가장 간단하게 바꿔줄 수는 없지만, 다른 여러 방법들을 사용하여 변경이 가능합니다. 대상이 되는 문자열의 길이, 바꾸고자 하는 문자의 개수나 위치를 알고 있는지 등의 조건 하에서 어떤 다양한 방법이 있는지 알아봅시다.

list1 = [ 'a', 'b', 'c', 'd' ]
list1[2] = 'A'
print(list1)

s1 = 'abcd'
s1[2] = 'A'
[ 'a', 'b', 'A', 'd' ]

TypeError: 'str' object does not support item assignment

- list() 와 join() 함수를 사용하기

  list 자료형은 인덱싱을 통한 아이템 변경이 가능하지만, 문자열은 불가능 함을 위에서 살펴보았습니다. 이를 생각해서, 먼저 문자열 전체를 list(문자열 변수)를 통해 list 자료형으로 바꾸어 줍니다. 그렇게 만들어진 list는 문자열을 구성하는 문자들이 하나씩 순서대로 원소가 되어 list를 이룹니다. 이 list에 대해 원하는 자릿수를 인덱싱하여 값을 변경해준 뒤, join() 함수를 아래와 같이 사용하여 다시 문자열로 만들어줄 수 있습니다. 혹시나 str(list 변수)를 사용하면 안될까 생각하실 수 있는데, 제가 해봤는데 '['a','b', ... 리스트 출력시 나오는 특수문자까지 문자열로 변환되는 이상한 결과가 나오니 주의해주세요.

  이 방식의 장점은 단순하고 직관적이라는 것입니다. 그러나 단점은 문자열과 list 사이의 변환 과정에서, 문자열의 길이가 너무 길면 시간이 오래 걸릴 수 있다는 점입니다. 길이가 긴 문자열 사용시 코딩 테스트의 시간 제한을 주의하셔야 합니다. 그리고 바꾸고자 하는 위치의 인덱스를 알아야 변경이 가능하다는 특징이 있습니다.

s1 = 'Hallo'
list1 = list(s1)
print(list1)

list1[1] = 'e'
s2 = "".join(list1)
print(s2)
['H', 'a', 'l', 'l', 'o']
Hello

- 슬라이싱과 '+'를 이용하기

  문자열은 리스트와 같이 슬라이싱을 이용할 수 있는데, 변경하고자 하는 리스트의 인덱스를 안다면 슬라이싱을 이용해 문자를 변경할 수 있습니다. 이 방법은 list()와 join()을 사용하는 방법보다 시간이 덜 걸립니다. 해당 방법으로 원하는 문자를 삭제할 수도 있습니다.

s1 = 'Hallo'
s2 = s1[:1] + 'e' + s1[2:]
s3 = s1[:1] + s1[2:]
print(s2)
print(s3)
Hello
Hllo

- replace() 함수를 사용하기

  파이썬의 replace() 함수를 사용하면 문자열의 문자를 변경할 수 있습니다. 함수의 첫 번째 입력으로는 바꾸고자 하는 문자를 입력하면 되고, 두 번째 입력으로는 무엇으로 바꿀지 입력하면 됩니다.

  이 방법의 장점이자 단점은, 첫 번째 입력의 문자가 문자열 내에 여러 번 등장한다면 모든 위치를 변경해버리는 것입니다. 여러 개 중 일부만 변경하고 싶을 땐 단점이겠지만, 한 번에 전부 변경해야 할 때에는 장점이 될 수 있습니다. 이 방법도 처음 list()와 join() 함수를 사용하는 방법보다 빠릅니다. 바꾸고자 하는 문자의 인덱스를 알지 못해도 가능하다는 점도 장점이 될 수 있습니다.

s1 = 'Hejjo'
s2 = s1.replace('j', 'l')
print(s2)
Hello

- time.time() 함수를 이용한 시간 비교

  import time 을 한 뒤 time.time() 함수를 사용해서 현재 시점값을 저장할 수 있습니다. 시간 측정을 하고싶은 코드 부분의 앞뒤에 시작점과 끝점의 시점 값을 측정하도록 하여 변수에 저장한 뒤, 그 둘의 차이를 통해 원하는 코드 부분을 실행하는데 걸리는 시간 간격을 측정할 수 있습니다. 이 방식을 이용하여 위의 세 가지 경우의 소요 시간을 확인해보겠습니다.

import time

s = 'xyz'
s0 = 'abcdef'
s1 = s + s0*500000

start = time.time()
list1 = list(s1)
list1[1] = 'A'
s2 = "".join(list1)
end = time.time()
print('time : ', end-start)
print(s2[:10])

start = time.time()
s3 = s1[:1]+'A'+s1[2:]
end = time.time()
print('time : ', end-start)
print(s3[:10])

start = time.time()
s4 = s1.replace('y', 'A')
end = time.time()
print('time : ', end-start)
print(s4[:10])
time :  0.23022770881652832
xAzabcdefa
time :  0.003055572509765625
xAzabcdefa
time :  0.0005052089691162109
xAzabcdefa

  마지막 방법일 수록 같은 문자 변경에 짧은 시간이 소요되는 것을 확인할 수 있었습니다. 각 방법의 특징을 기억하고 상황에 맞게 잘 활용하시면 좋겠습니다.


3. 튜플 자료형

  파이썬의 튜플 자료형은 리스트와 거의 비슷하지만, 다음과 같은 차이가 있습니다.

  • 튜플은 한 번 선언된 값을 변경할 수 없다.
  • 리스트는 초기화 시나 출력시 대괄호([ ])를 이용하지만 튜플은 소괄호(( ))를 이용한다.

  튜플을 초기화 한 후, 튜플의 값을 변경하려고 하면 오류 메세지가 출력됩니다. 대입 연산자(=)를 사용하여 값을 변경할 수 없습니다.

  튜플 자료형은 그래프 알고리즘을 구현할 때 자주 사용됩니다. 예를 들어, 다익스트라 최단 경로 알고리즘과 같은 최단 경로를 찾는 알고리즘 내부에서는 튜플 자료형을 활용하여 우선순위 큐를 이용하게 되고, 우선순위 큐에 한 번 들어간 값은 변경되지 않아 튜플 자료형은 알맞게 사용될 수 있습니다.

  알고리즘을 구현하는 과정에서 일부러 튜플을 이용하게 되면, 실수로 값을 변경하는 것을 알아낼 수 있습니다. 또한 튜플은 리스트에 비해 상대적으로 공간 효율적이고, 일반적으로 각 원소의 성질이 서로 다를 때 주로 사용합니다. 흔히 다익스트라 최단 경로 알고리즘에는 '비용'과 '노드 번호'라는 서로 다른 성질의 데이터를 (비용, 노드 번호)의 형태로 함께 튜플로 묶어서 관리하는 것이 관례라고 합니다.

a = (1, 2, 3, 4)
print(a)
print(a[1])

a[2] = 5
(1, 2, 3, 4)
2
Traceback (most recent call last):
  File "main.py", line 5, in <module>
    a[2] = 5
TypeError: 'tuple' object does not support item assignment

4. 사전 자료형 📙

  사전 자료형은 키(Key)와 값(Value)의 쌍을 데이터로 가지는 자료형입니다. 리스트나 튜플은 인덱스가 존재하여 인덱싱 등의 작업으로 아이템에 접근합니다. 그러나 사전 자료형은 키-값 쌍을 데이터로 가진다는 점에서 변경 불가능한 데이터를 키로 사용할 수 있습니다. 파이썬의 사전 자료형은 내부적으로 '해시 테이블(Hash Table)'을 이용하므로 기본적으로 데이터의 검색 및 수정에 있어서 O(1)의 시간에 처리할 수 있습니다. 이는 같은 동작에 대해 리스트보다 훨씬 빠르게 동작한다는 장점이 있습니다.

  dict( )를 통해 빈 사전 자료형을 초기화할 수 있습니다. 사전 변수의 뒤에는 대괄호를 통해 key 값에 연결된 value값을 호출하거나 저장하거나 변경할 수 있습니다.

data = dict()

data['banana'] = 2
data['apple'] = 4
print(data)

data['apple'] = 6
print(data['apple'])
{'banana': 2, 'apple': 4}
6

  특정한 원소가 있는지 검사할 때는 '원소 in 사전 변수'의 형태를 사용할 수 있습니다. 사전 자료형에 대해서는 해당 key 값이 존재하는지 확인하여 True 혹은 False로 답변하게 됩니다. 이는 리스트나 튜플에서도 사용할 수 있습니다.

- 사전 자료형 관련 함수

  자료형 관련 메소드 중 .pop(key)는 원하는 key 값이 존재한다면 해당 키-값 쌍을 사전에서 지워버립니다. O(1)의 시간 복잡도를 가지고 있고, 사전에 없는 key를 입력시 오류 메세지가 출력됩니다.

  키 데이터만 뽑아서 리스트로 이용할 때는 .keys( ) 함수를 이용하며, 값 데이터만을 뽑아서 리스트로 이용할 때는 .values( ) 함수를 이용합니다.

data = dict()

data['banana'] = 2
data['apple'] = 4
data['melon'] = 6
print(data)

data.pop('apple')
print(data)

data['orange'] = 8

key_list = data.keys()
value_list = data.values()
print(key_list)
print(value_list)

for key in key_list:
  print(data[key])
{'banana': 2, 'apple': 4, 'melon': 6}
{'banana': 2, 'melon': 6}
dict_keys(['banana', 'melon', 'orange'])
dict_values([2, 6, 8])
2
6
8

5. 집합 자료형

  파이썬에서 제공하는 집합 자료형은 기본적으로 리스트 또는 문자열을 이용해서 만들 수 있는데, 다음과 같은 특징을 가지고 있습니다.

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

  집합 자료형은 사전 자료형과 마찬가지로 순서가 없어서 인덱싱으로 값을 얻을 수 없다는 특징이 있습니다. 집합 자료형에서는 사전 자료형과 같은 키가 있는 것도 아니고 값 데이터만을 담게 됩니다. 특정 원소가 존재하는지 검사하는 연산의 시간 복잡도는 O(1) 입니다.

  집합 자료형은 '특정한 데이터가 이미 등장한 적이 있는지 여부'를 체크할 때 매우 효과적입니다. 집합 자료형을 초기화할 때는 set() 함수를 이용하거나, 중괄호({}) 안에 각 원소를 콤마(,)를 기준으로 구분해서 넣으면 됩니다.

#문자열과 set( ) 함수를 이용한 초기화 방법
data1 = set('abcde')
print(data1)

#리스트와 set( ) 함수를 이용한 초기화 방법
data2 = set([1, 5, 7, 3])
print(data2)

#중괄호 안에 원소를 콤마로 구분한 초기화 방법
data3 = {4, 8, 1, 2, 2}
print(data3)
{'c', 'e', 'b', 'a', 'd'}
{1, 3, 5, 7}
{8, 1, 2, 4}
#순서가 없고 중복이 허용되지 않는다.

- 집합 자료형의 연산과 관련 함수

  기본적인 집합 연산으로는 합집합('|'), 교집합('&'), 차집합('-') 연산을 사용할 수 있습니다..

  집합 자료형에 값을 추가할 때는 .add( ) 메소드를 이용할 수 있습니다. .update( ) 함수는 여러 개의 값을 한꺼번에 추가하고자 할 때 사용합니다. .remove( ) 함수는 특정 값을 제거하고자 할 때 사용할 수 있습니다.

data1 = set([1, 3, 5, 7])
data2 = set([2, 4, 6, 7])
data3 = set([1,2])
data = data1 | data2
print(data)
print(data1 & data2)
print(data - data3)

data.add(11)
data.update([7,8,9])
print(data)

data.remove(1)
print(data)
{1, 2, 3, 4, 5, 6, 7}
{7}
{3, 4, 5, 6, 7}
{1, 2, 3, 4, 5, 6, 7, 8, 9, 11}
{2, 3, 4, 5, 6, 7, 8, 9, 11}

fin. 🙌

  1편과 2편에 걸쳐서 첫 번째 큰 주제인 자료형에 대해서 간략하게나마 살펴보았습니다. 제가 보려고 정리한 글이긴 하지만, 혹시나마 찾아주셨다면 조금이나마 도움이 되셨으면 좋겠습니다. 다음 번에 시간이 된다면 이어서 조건문 문법부터 다시 알아보도록 하겠습니다.

  단순히 여러 소스를 참고하여 정리하거나 옮겨 적은 글일 뿐이지만, 찾아오고 읽어주셔서 감사합니다. 지금 하시는 일 모두 힘내셔서 잘 이뤄내시길 바랍니다! 🤗

profile
딥러닝을 학습하는 중

2개의 댓글

comment-user-thumbnail
2022년 1월 18일

파이썬... 이름이 강렬하네요~~^^

1개의 답글