[파이썬 톺아보기 2]

문자열 가지고 놀기

1. 문자열 합치기

In [1]:
a = "Hello "
b = "World"
c = a + b
print(c)
Hello World

2. 문자열 반복

In [2]:
a = "Hello "
b = a * 3
print(b)
Hello Hello Hello 

3. 문자열 바꾸기 (Replace)

In [3]:
a = "Hello World!"
a.replace("World", "Heezeo")
Out[3]:
'Hello Heezeo!'
In [4]:
print(a)
## replace 함수를 쓰면, 새로운 공간에 합쳐진 문자열을 만들어넣기 때문
Hello World!
In [5]:
a = a.replace("World", "Heezeo")
print(a)
Hello Heezeo!

4. 문자열 나누기 (Split)

In [6]:
a = "Apple, Banana, Cake, Donut"
b = a.split(",")
In [7]:
print(a)
print(b)
Apple, Banana, Cake, Donut
['Apple', ' Banana', ' Cake', ' Donut']
In [8]:
#print(b) 결과의 공백은 어떻게 할까?
a = " Banana"
print(a)
 Banana

5. 공백 지우기

  • 문자열 양쪽의 공백 지우기
In [9]:
# 문자열 양쪽의 공백 지우기
a = a.strip()
print(a)
Banana
  • 문자열 왼쪽/ 오른쪽 공백 지우기
In [10]:
# 문자열 왼쪽 공백 지우기
a = " Banana "
a.lstrip()
Out[10]:
'Banana '
In [11]:
#  문자열 오른쪽 공백 지우기
a = " Banana "
a.rstrip()
Out[11]:
' Banana'
In [12]:
#split()으로 리스트로 나눠진 모든 문자열에서 한 번에 공백을 지우려면?
a = "Apple, Banana, Cake, Donut"
b = a.split(",")
print(b)
['Apple', ' Banana', ' Cake', ' Donut']
In [13]:
b.strip()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-2d64fca4d98e> in <module>
----> 1 b.strip()

AttributeError: 'list' object has no attribute 'strip'
  • AttributeError: 'list' object has no attribute 'strip'

    strip()은 리스트가 아니라 문자열에서 사용가능함
  • For loop(반복문)을 이용해서 문자열 하나하나를 바꾸어 한 번에 리스트로 만들면 된다.
In [14]:
[c.strip() for c in b]
c = [c.strip() for c in b]
c
Out[14]:
['Apple', 'Banana', 'Cake', 'Donut']

6. 대문자 / 소문자로 바꾸기

In [15]:
a = "apple"
a.upper()
Out[15]:
'APPLE'
In [16]:
a = "APPLE"
a.lower()
Out[16]:
'apple'

7. 문자열 포맷팅(String formatting)

  • 문자열 포맷팅에 앞서, 가장 기본적으로 문자열과 변수를 같이 출력하려면 print()함수에 문자열과 변수를 ,로 구분하여 실행하면 된다.
In [17]:
name = "Heezeo"
print("Hello", name)
Hello Heezeo
  • 일반적으로 사용할 때 어떤 타입이 오든 {}만으로 표기할 수 윘어 더 편안함. 새로운 방식으로 사용하자!
In [18]:
# old
print("%s and %d" % ("Apple", 10))
# new
print("{} and {}".format("Apple", 10))
Apple and 10
Apple and 10
  • 소수점 자리수를 지정해주는 방법
In [19]:
print("{}".format(4/3))
1.3333333333333333
In [20]:
print("{:.2f}".format(4/3)) #Float 2자리수까지
print("{:04d}".format(12)) #Decimal 4자리
1.33
0012

함수 가지고 놀기

1. 온도 변환 함수를 만들어보자

  • 섭씨, 화씨의 공식: (0°C × 9/5) + 32 = 32°F
In [21]:
(0 * 9/5) + 32 # 인풋이 될 부분 = 0 / 아웃풋이 될 부분 = 전체
Out[21]:
32.0
In [22]:
def convert_temp(c):
    return (c * 9/5) + 32

2. 함수의 호출

In [23]:
convert_temp(30) #결과 값은 계산해서 리턴했지만 출력해주지 않기 때문에 표기되지 않는다
print("-"*50)
print(convert_temp(30)) #출력(print)해주었기 때문에 실행시키면 결과값을 볼 수 있다.
--------------------------------------------------
86.0

3. 여러개의 인풋과 아웃풋이 있는 함수

  • 더하기 함수와 곱하기 함수
In [24]:
def add(a, b): 
    return a + b
add(3,4)
Out[24]:
7
In [25]:
def mul(a, b):
    return a * b
mul(3,4)
Out[25]:
12
  • add 함수와 mul 함수를 합쳐보자
In [26]:
def add_and_mul(a, b):
    return add(a, b), mul(a, b)
add_and_mul(3, 4)
Out[26]:
(7, 12)
  • add함수와 mul함수를 모두 사용하는 함수를 만들고 호출하여 출력해보니... (7, 15) 의 형태가 나온다.
  • 이것이 바로 튜플!

4. 함수 인풋(매개변수)에 기본값 설정하기

  • 함수의 인풋(매개변수)에는 디폴트값을 설정할 수 있다.
  • 기본적으로 설정한 위치에 값이 없다면 디폴트값이 함수 내에서 사용된다.
In [27]:
# 두 수를 더한 값과 곱한 값을 같이 리턴하는 함수
def add_and_mul(a, b = 0):
    return add(a,b), mul(a,b)
print(add_and_mul(3))
(3, 0)
In [28]:
print(add_and_mul(3,3))
(6, 9)

리스트(List) 상세

1. 추가(append)

  • list에 속한 append()함수는 리스트 맨 마지막에 값을 추가하는 역할을 한다.
In [29]:
a = [1, 2, 3]
a.append(4)
print(a)
[1, 2, 3, 4]

2. 삽입(insert)

  • 그럼 원하는 위치에 값을 삽입하는 건 어떻게 할까?
  • insert()함수는 원하는 위치에 값을 삽입하는 역할을 한다
In [30]:
a = [1, 2, 3]
a.insert(1, 0) #1을 인덱스 0자리에 넣어라
print(a)
[1, 0, 2, 3]

3. 정렬(sort)

  • 리스트 안의 값들을 어떻게 정렬할까?
  • sort() 함수를 사용하여 순서대로 정렬할 수 있다.
In [31]:
a = [1, 4, 2, 6, 5, 3]
a.sort()
print(f"오름차순 정렬: {a}")
print("-"*30) #점선 구분
a.sort(reverse = True)
print(f"내림차순 정렬: {a}")
오름차순 정렬: [1, 2, 3, 4, 5, 6]
------------------------------
내림차순 정렬: [6, 5, 4, 3, 2, 1]

4. 리스트로 구현하는 자료구조

Stack & Queue feat. pop() & popleft()

  • Stack 스택
    • FILO (First In, Last Out 구조)
    • 즉 가장 처음 들어간건 가장 나중에 나올 수 있는 구조를 말한다
    • 리스트의 append()와 pop()함수를 사용하면 스택 구조를 구현할 수 있다.
In [32]:
a = []
a.append(1)
a.append(2)
a.append(3)
print(a)
a.pop()
print(a)
a.pop()
print(a)
a.pop()
print(a)
[1, 2, 3]
[1, 2]
[1]
[]
  • Queue 큐
    • FIFO (First In, First Out 구조)
    • 즉, 맨 처음 들어간 것이 가장 처음 나오는 구조를 말한다.
    • 리스트의 insert()와 pop()함수로 큐 형태를 구현할 수는 있다.

      하지만 이 방식은 append()와 pop()을 이용하여 스택을 만드는 구조와 달리 내부적으로 느리게 동작하기 때문에 이럴 때에는 파이썬에서 준비해둔 모듈을 사용하여 구현하면 된다.
    • collections.deque의 append()와 popleft()함수를 사용하면 큐 구조를 구현할 수 있다!
In [33]:
from collections import deque
queue = deque([1, 2, 3])
print(queue)
print("-"*30) #구분선
queue = deque([])
queue.append(1)
print(queue)
queue.append(2)
print(queue)
queue.append(3)
print(queue)

queue.popleft()
print(queue)
queue.popleft()
print(queue)
queue.popleft()
print(queue)
deque([1, 2, 3])
------------------------------
deque([1])
deque([1, 2])
deque([1, 2, 3])
deque([2, 3])
deque([3])
deque([])

컬렉션(Collections)

1. 리스트(List)

  • 파이썬에는 컬렉션(Collections)이라는 컨테이너 데이터타입이 있다.
  • 이 타입에는 여러 종류가 있는데, 일반적으로 많이 사용되는 리스트, 튜플, 딕셔너리, 셋 등은 built - in 형태로 되어 있어 다른 모듈을 추가하지 않고도 사용 가능하다.
  • 리스트도 컬렉션 중에 하나.

2. 튜플(Tuple)

  • 튜플은 리스트와 매우 비슷하나, 가장 큰 차이는 수정이 불가(Immutable)하다는 점이다!
  • 리스트는 [ ] 로 표현되지만, 튜플은 ( ) 형태로 표현된다.
In [34]:
tu = (1, 2, 3)
print(tu)
(1, 2, 3)
  • 수정이 불가능하기 때문에 특정 Index에 값을 새로 할당하는 것이 불가능하다.
  • 이러한 특성 때문에 앞서 함수편에서 본 것처럼, 함수에서 여러 개의 리턴 값을 가질 때, 튜플 형태로 표현된다.
In [35]:
tu = (1, 2, 3)
print(tu)
tu[0] = 5
(1, 2, 3)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-35-ddc28a7b2d4a> in <module>
      1 tu = (1, 2, 3)
      2 print(tu)
----> 3 tu[0] = 5

TypeError: 'tuple' object does not support item assignment

3. 딕셔너리(Dictionary)

  • [생성] 직접 {key1: value1, key2:value2 ...} 형태로 딕셔너리를 생성해도 되고, 딕셔너리 constructor를 이용하여 생성할 수도 있다.
In [36]:
tel = {'a':1, 'b':2, 'c':3}
print(tel)
tel = dict(a=1, b=2, c=3)
print(tel)
{'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'b': 2, 'c': 3}
  • 딕셔너리를 만들 때 주의할 사항
    • 똑같은 key값을 넣으면, 한 개를 제외한 나머지는 무시된다
In [37]:
tel = {'heezeo': '01033334444', 'heezeo': '01022224444'}
print(tel['heezeo'])
print(tel)
01022224444
{'heezeo': '01022224444'}
  • 딕셔너리를 다루다보면, 해당 딕셔너리에 어떤 키들이 포함되더 있는지를 알아야 할 때가 있다. 이 때에는 keys()라는 딕셔너리 관련 함수를 사용하면 된다.
In [38]:
tel = {'heezeo': '01033334444', 'heezeo': '01022224444'}
print(tel.keys())
dict_keys(['heezeo'])
  • dict_keys
    • 파이썬2 때에는 keys()라는 함수가 리스트 형식으로 값을 돌려줬으나, 메모리를 효율적으로 사용하기 위해 파이썬 3.0부터는 dict_keys라는 객체 형태로 리턴하게 하였다.
    • 하지만 겁먹지 않아도 된다. 기본적인 for문의 경우엔 그대로 사용 가능하며, 필요하면 리스트 형태로 형변환(casting)해서 사용하면 된다.
  • keys()로 반환된 값은 for문을 사용하거나, 리스트 형태로 형변환(casting)할 수 있다!
In [39]:
tel = {'heezeo': '1234', 'heezy': '1111', 'kimzeo': '3333'}
print(tel.keys())
print("-"*30) #구분선
keys = tel.keys()
for key in keys:
    print(key)
dict_keys(['heezeo', 'heezy', 'kimzeo'])
------------------------------
heezeo
heezy
kimzeo
In [40]:
print(keys)
keys = list(keys) #리스트 형태로 형변환
print(keys)
dict_keys(['heezeo', 'heezy', 'kimzeo'])
['heezeo', 'heezy', 'kimzeo']
  • 딕셔너리 안에 특정 키의 유무는 in을 사용하여 확인 가능하다
In [41]:
tel = {'heezeo': '3434', 'kimzeo': '4545', 'heezy': '5678'}
print('heezeo' in tel)
print('heezybusy' in tel)
True
False
  • 딕셔너리의 값을 가져오는 방법에는 딕셔너리 관련 함수인 get()을 사용하는 방법도 있다.
  • 이 방법을 사용하면, 값이 없는 경우에 디폴트 값을 지정해 줄 수도 있다.
In [42]:
print(tel.get('heezeo'))
print(tel.get('kimzeo'))
3434
4545
In [43]:
print(tel.get('heezeo', 'N/A'))
print(tel.get('heezybusy', 'N/A'))
3434
N/A

4. 셋(Set)

  • 셋(Set)은 집합의 형태를 쉽게 처리하기 위한 데이터 타입이다.
  • 딕셔너리와 비슷하게 생겼으나 키(Key)가 없는 형태이다.
In [44]:
a = {1, 2, 3}
print(a)
type(a)
{1, 2, 3}
Out[44]:
set
  • 특징
    • 중복을 허용하지 않는다.
    • 순서가 없다. (순서가 없기 때문에 index로 접근할 수 없다)
In [45]:
a = {1, 2, 1, 3}
print(a)
{1, 2, 3}
In [46]:
print(a[0])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-46-23821ec76b06> in <module>
----> 1 print(a[0])

TypeError: 'set' object is not subscriptable
  • 중복을 허용하지 않는다 = 중복을 제거하는 데 사용할 수 있다!
In [47]:
# 셋(set) feat. 형변환(Casting)을 사용해 중복 제거!
a = [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
a = set(a)
print(a)
a = list(a)
print(a)
{1, 2}
[1, 2]
  • 교집합, 합집합, 차집합 구하기
In [48]:
a = {1, 2, 3}
b = {2, 3, 5}
# 교집합
print(a & b)
#합집합
print(a | b)
#차집합
print(a - b)
print(b - a)
{2, 3}
{1, 2, 3, 5}
{1}
{5}