파이썬 톺아보기 (2)

문자열(String) 가지고 놀기

1. 문자열 합치기

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

2. 문자열 반복

In [14]:
a = "Hello"
b = a*3
print(b)
HelloHelloHello
In [15]:
print("-"*50)
--------------------------------------------------

3. 문자열 바꾸기 (Replace)

In [21]:
a = "Hello World!"
a.replace("World", "Joy")  # World를 Joy로 replace
Out[21]:
'Hello Joy!'
In [22]:
print(a)   # 하지만 a를 print했을 때는 기존 값이 그대로 출력된다
Hello World!
In [24]:
# 왜?
id(a)
Out[24]:
140266102886256
In [26]:
id(a.replace("World", "Joy"))
# replace 함수를 쓰면 새로운 공간에 합쳐진 문자열을 만들어넣기 때문!
# 그래서 id값도 다르다
Out[26]:
140266103127344

4. 문자열 나누기 (Split)

In [27]:
a = "Apple, Banana, Cake, Donut"
a.split(",")   #,를 기준으로 split한다

# Banana, Cake, Donut 앞에 한 칸씩 공백이 생겼는데 어떡하지?
Out[27]:
['Apple', ' Banana', ' Cake', ' Donut']

4-1. 공백 지우기 (Strip)

  • 문자열 양쪽의 공백 지우기 (strip)
In [29]:
a = " Banana"
print(a)
 Banana
In [31]:
a = a.strip()
print(a)
Banana
  • 문자열 왼쪽 혹은 오른쪽 공백 지우기 (lstrip, rstrip)
In [32]:
a = " Banana "
a.lstrip()
Out[32]:
'Banana '
In [33]:
a.rstrip()
Out[33]:
' Banana'
  • strip()은 리스트가 아니라 문자열에서만 사용 가능하다!
In [34]:
a = "Apple, Banana, Cake, Donut"
b = a.split(",")
print(b)
['Apple', ' Banana', ' Cake', ' Donut']
In [35]:
b.strip()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-35-2d64fca4d98e> in <module>
----> 1 b.strip()

AttributeError: 'list' object has no attribute 'strip'
  • 리스트에서 공백을 지울 때는 for loop(반복문)을 이용해서
    문자열 하나하나를 바꾸어 한번에 리스트로 만들면 된다!
In [36]:
[c.strip()for c in b]
Out[36]:
['Apple', 'Banana', 'Cake', 'Donut']
In [39]:
c = [c.strip()for c in b]
c
Out[39]:
['Apple', 'Banana', 'Cake', 'Donut']

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

  • 대문자로 바꾸기 - upper()
In [41]:
a = "apple"
a.upper()
Out[41]:
'APPLE'
  • 소문자로 바꾸기 - lower()
In [42]:
a = "APPLE"
a.lower()
Out[42]:
'apple'

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

  • 문자열 포맷팅에 앞서, 가장 기본적으로 문자열과 변수를 같이 출력하려면
    print()함수에 문자열과 변수를 ,로 구분하여 실행하면 된다!
In [43]:
name = "Joy"
print("Hello", name)
Hello Joy
  • 일반적으로 사용할 때 어떤 타입이 오던 {}만으로 표기할 수 있어
    더 편안한 새로운 방식으로 사용하자!
In [45]:
# Old
print("%s and %d" % ("Apple", 10))

# New
print("{} and {}".format("Apple",10))
Apple and 10
Apple and 10
In [47]:
# 소수점 자리수를 지정해주려면 어떻게 할까?
print("{}".format(4/3))
1.3333333333333333
In [52]:
print("{:.2f}".format(4/3))   #{:.2f} float 소수점 아래 두자리까지
1.33
In [55]:
print("{:04d}".format(12))  #{:04d} decimal 정수 4자리까지
0012

함수 가지고 놀기

1. 온도 변환 함수 만들기

  • 섭씨 - 화씨 공식
    (0C * 9/5) + 32 = 32F
In [57]:
# 파이썬으로 표현해보면?
(0 * 9/5) + 32
Out[57]:
32.0
In [58]:
# def 함수명(인풋):
#     코드1
#     코드2
#     ...
#     return 아웃풋

def convert_temp(c):
    return (c * 9/5) + 32

# convert_temp라는 사용자 정의 함수 생성 완료!

2. 함수의 호출

  • 만든 함수는 어떻게 써야할까?
  • 호출해서 쓰면 된다!
  • 어떻게?
  • 함수명(인풋) 형태로 호출해주면 된다!
In [61]:
convert_temp(29)
Out[61]:
84.2

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

  • 더하기를 함수로 만들면 (add)
In [62]:
def add(a, b):
    return a + b
  • 곱하기를 함수로 만들면 (mul)
In [63]:
def mul(a, b):
    return a * b
  • 두 수를 더한 값과 곱한 값을 같이 리턴하는 함수 (and로 연결)
In [65]:
def add_and_mul(a, b):
    return add(a, b), mul(a, b)

print("-"*50)
print(add_and_mul(3, 5))
--------------------------------------------------
(8, 15)
  • 출력된 (8, 15)는 튜플이다!
    리스트와 비슷하지만 한 번 생성되면 값을 변경할 수 없다.

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

  • 함수의 인풋(매개변수)에는 디폴트값을 설정할 수 있다.
  • 기본값으로 설정한 위치에 값이 없다면 디폴트값이 함수 내에서 사용된다.
In [68]:
def add_and_mul(a, b=0):   #b에게 0을 할당
    return add(a,b), mul(a,b)

print(add_and_mul(3))      #b자리의 출력값을 지정하지 않았음, 그래서 0 출력
(3, 0)

리스트 상세

1. 추가(append)

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

2. 삽입(insert)

  • insert()함수는 원하는 위치에 값을 삽입하는 역할을 한다.
In [70]:
a = [1, 2, 3]
a.insert(1, 0)   # 1번 인덱스 위치에 0을 삽입
print(a)
[1, 0, 2, 3]

3. 정렬(sort)

  • sort()함수를 사용하여 리스트 안의 값을 순서대로 정렬할 수 있다.
In [72]:
a = [1, 4, 2, 6, 5, 3]
a.sort()                   # 기본 오름차순 정렬
print(f"오름차순 정렬: {a}")
print("-"*50)
a.sort(reverse=True)       # reverse 시켜 내림차순 정렬
print(f"내림차순 정렬: {a}")
오름차순 정렬: [1, 2, 3, 4, 5, 6]
--------------------------------------------------
내림차순 정렬: [6, 5, 4, 3, 2, 1]

4. 스택(Stack)

  • FILO (First In, Last Out 구조)
  • 가장 처음 들어간 것이 가장 나중에 나오는 구조

  • 리스트의 append()와 pop() 함수 사용해 스택 구조 구현 가능
In [75]:
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]
[]

5. 큐(Queue)

  • FIFO (First In, First Out 구조)
  • 가장 처음 들어간 것이 가장 처음 나오는 구조

  • insert와 pop로 구현할 수는 있지만 스택 구조에 비해 느리게 동작하므로
    파이썬에서 준비해 둔 모듈을 사용해서 구현하면 된다!

    collections.deque의 append()와 popleft() 사용
In [77]:
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)하다!
  • 리스트는 [ ]로 표현되지만 튜플은 ( )형태로 표현된다.
  • 수정이 불가능하기 때문에 특정 index에 값을 새로 할당할 수 없다.
In [78]:
tu = (1, 2, 3)
print(tu)
(1, 2, 3)

3. 딕셔너리 (Dictionary)

  • 직접 {key1:value1, key2:value2..} 형태로 생성해도 되고,
    딕셔너리 constructorf를 이용하여 생성할 수도 있다.
In [79]:
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 [80]:
tel = {'joy':'01011112222', 'joy':'01033334444'}
print(tel['joy'])
print(tel)
01033334444
{'joy': '01033334444'}

딕셔너리를 다루다보면, 해당 딕셔너리에 어떤 키들이 포함되어 있는지를 알아야 할 때가 있다. 이 때에는 keys()라는 딕셔너리 관련 함수를 사용하면 된다.

In [83]:
tel = {'joy':'1234', 'ethan':'0000', 'guido':'1111'}
print(tel.keys())
dict_keys(['joy', 'ethan', 'guido'])
  • keys()로 반환된 값은 for문을 사용하거나, 리스트 형태로 형변환(casting)할 수 있다.
In [85]:
tel = {'joy':'1234', 'ethan':'0000', 'guido':'1111'}
print(tel.keys())
print("-"*30)

keys = tel.keys()
for key in keys:
    print(key)
print("-"*30)

print(keys)
print("-"*30)

keys = list(keys)
print(keys)
dict_keys(['joy', 'ethan', 'guido'])
------------------------------
joy
ethan
guido
------------------------------
dict_keys(['joy', 'ethan', 'guido'])
------------------------------
['joy', 'ethan', 'guido']
  • 딕셔너리 안에 특정 키가 있는지의 여부는 in을 사용하여 확인 가능하다.
In [87]:
tel = {'joy':'1234', 'ethan':'0000', 'guido':'1111'}
print('joy' in tel)
print('daniel' in tel)
True
False
  • 딕셔너리의 값을 가져오는 방법 중 딕셔너리 관련 함수인 get()을 사용하는 방법도 있다.
  • 이 함수를 사용하면, 값이 없는 경우에 디폴트값을 지정해 줄 수도 있다!
In [88]:
print(tel.get('joy'))
print(tel.get('daniel'))
1234
None
In [89]:
print(tel.get('joy', 'null'))
print(tel.get('daniel', 'null'))
1234
null

4. 셋(Set)

  • 집합의 형태를 쉽게 처리하기 위한 데이터 타입이다.
  • 딕셔너리와 비슷하게 생겼으나 key가 없는 형태이다.
In [90]:
a = {1, 2, 3}
print(a)
type(a)
{1, 2, 3}
Out[90]:
set
  • 특징 : 중복을 허용하지 않고, 순서가 없다.(=index로 접근할 수 없다.)

    즉, 중복 제거에 사용할 수 있다!
In [93]:
a = {1, 2, 1, 3, 2, 2, 2, 1}
print(a)
{1, 2, 3}
In [95]:
a = [1, 2, 2, 2, 2, 2, 2, 2, 2, 2]
print(a)
a.remove(2)  #2가 하나만 지워진다
print(a)

print("-"*30)

a = [1, 2, 2, 2, 2, 2, 2, 2, 2, 2]
a = set(a)
print(a)
a = list(a)
print(a)
[1, 2, 2, 2, 2, 2, 2, 2, 2, 2]
[1, 2, 2, 2, 2, 2, 2, 2, 2]
------------------------------
{1, 2}
[1, 2]
  • 교집합 구하기
In [97]:
a = {1, 2, 3}
b = {2, 3, 5}
print(a & b)
{2, 3}
  • 합집합 구하기
In [98]:
print(a|b)
{1, 2, 3, 5}
  • 차집합 구하기
In [99]:
print(a - b)
print(b - a)
{1}
{5}